logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Attiny2313: Błędne obliczenia PWM i migotanie wyświetlacza LCD

kiler129 28 Sty 2008 21:44 1835 15
REKLAMA
  • #1 4746416
    kiler129
    Poziom 27  
    Posty: 1304
    Pomógł: 12
    Ocena: 80
    A wiec bawie sie Attiny2313 i plytka testowa. Po drodze zdazylem zablokowac jednego :D
    Ale do rzeczy, mam sobie takie kod:

    
    Config Timer1 = Pwm , Pwm = 8 , Prescale = 1 , Compare A Pwm = Clear Down
    Dim Pokaz As Integer
    
    Cls : Lcd "  Swiatlo v0.1" : Lowerline : Lcd " by Grzegorz Z."
    Waitms 500
    Pwm1a = 0
    
    Do
    If Pind.5 = 0 Then Pwm1a = Pwm1a + 2.55
    If Pind.4 = 0 Then Pwm1a = Pwm1a - 2.55
    Pokaz = Pwm1a / 2.55
    Cls : Lcd "Moc: " : Lcd Pokaz
    Waitms 5
    Loop
    End


    Sa z nim 2 problemy. Jak kazdy chyba wie PWM na max.255 wartosc. A wiec ja chce pokazywac w procentach jasnosc swiecenia - dziele pokazywany wynik na 2.55
    I tu zaczyna sie problem, wg. procesora 255/2.5 to .... 85 :|
    Przy maksymalnym swieceniu mam 85 na LCD.
    Nie mam pomyslu gdzie tu jest blad.
    Drugi problem to czy da sie jakos zmnimalizowac lu calkowicie ukrucic migotanie lcd ?
    LCD za szybki nie jest i efektem tego migania tego jest to ze niewiele na nim widac - tylko pod swiatlo.
    LCD jest sprawny poniewaz przy wyswietlaniu powitania wszytko jest ok.

    Nie chodzi mi aby ktos mi poprawil program tak aby dzialal - chcilbym wiedziec co jest czego powdem i jak to rozwiazac abym w przyszlosci nie popelnial tego bledu.

    Z gory dziekuje. Za pomoc daje pomogl i ew. punkty :)
  • REKLAMA
  • Pomocny post
    #2 4746571
    crazy_phisic
    VIP Zasłużony dla elektroda
    Posty: 2244
    Pomógł: 278
    Ocena: 131
    Pwm1a = Pwm1a + 2.55
    Zastanawiałeś się ile wynosi wartość Pwm1A po takiej operacji? Sprawdź.
  • REKLAMA
  • Pomocny post
    #3 4746658
    teedd
    Poziom 19  
    Posty: 219
    Pomógł: 24
    Ocena: 2
    Witaj.
    kiler129 napisał:
    Drugi problem to czy da sie jakos zmnimalizowac lub calkowicie ukrucic migotanie lcd ?
    LCD za szybki nie jest i efektem tego migania tego jest to ze niewiele na nim widac - tylko pod swiatlo.
    LCD jest sprawny poniewaz przy wyswietlaniu powitania wszytko jest ok.

    Po co używasz CLS przed każdym wyświetleniem wartości? Dlatego Ci miga wyświetlacz. Jeden raz na początku programu wystarczy.
    Zrób np. tak:

    
    ....
    Locate 1,1
    Lcd "Moc: "
    Locate 1,6
    Lcd Pokaz;"   "  ' na końcu są 3 spacje - czyszczą ew. pozostałości
    ' po wyświetlonej poprzedniej wartości
    ....
    


    Spróbuj - będzie lepiej :)
    Pozdrowienia - teedd
  • REKLAMA
  • Pomocny post
    #5 4746696
    Sind
    Poziom 16  
    Posty: 182
    Pomógł: 9
    Ocena: 3
    :) witam

    Po pierwsze nie mozesz do PWM do dac 2.55 poniewaz PWM dziala na liczbach typu integer, czyli calkowitych :) i nie wiem czemu sie dziwisz ze Ci wyswietla 85, prosta operacja matematyczna :) 255/2.55, procesor robi zaokraglenie 2.55 do 3, 255/3 daje Ci 85... Tak samo dodawanie wartosci 2.55 zakonczy sie rezultatem dodawania 3-ki.

    mozesz to sobie zrobic tak np: pwm1a*100+2.55*100 i pozniej nie przez "/" tylko przez div, czyli dzielenie bez reszty dostaniesz wynik zaokraglony ale bedzie w miare dokladny... to jeden ze sposobow...

    drugi to ustalasz sobie stala np: b=100/255=0.392 i wtedy dodatkowa zmienna typu Single, np D As SIngle i piszesz:
    
    D=pwm1a*b
    lcd d
    


    mozesz tez aby osiagnac pelne 100% dac warunek
    
    
    ....
    if pwm1a = 255 then d=100
    lcd d
    ...
    


    POzdrawiam, mam nadzieje ze troszke Ci sie rozjasnilo;)
  • Pomocny post
    #6 4746737
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    A jeśli chodzi o "Błędne operacje matematyczne" , to:
    Czy rozumiesz dlaczego zmienną Pokaz , zadeklarowałeś jako Integer , a nie np. Byte,String czy Double :?:
    Sprawdź jakiego typu zmienne oferuje Bascom Basic , postaraj się zrozumieć czym one się miedzy sobą różnią , a wtedy 1-szy problem masz z głowy ;)

    Piotrek
  • #7 4746771
    kiler129
    Poziom 27  
    Posty: 1304
    Pomógł: 12
    Ocena: 80
    zumek napisał:
    A jeśli chodzi o "Błędne operacje matematyczne" , to:
    Czy rozumiesz dlaczego zmienną Pokaz , zadeklarowałeś jako Integer , a nie np. Byte,String czy Double :?:
    Sprawdź jakiego typu zmienne oferuje Bascom Basic , postaraj się zrozumieć czym one się miedzy sobą różnią , a wtedy 1-szy problem masz z głowy ;)

    Piotrek


    Nie mam, po napisaniu postu wpoadlem na to i zminilem na bytte - nic z tego :D

    Samuraj napisał:
    Co do migotania to wywal CLS i nadpisuj tekst bez wymazywania wyświetlacza.


    Moze nie jestem zbyt dobrym programista ale przewertowalem manual bascoma i nie znalazlm jak "nadpisac" tekst.

    Sind - moglbys troche jasnij. Tzn wez mi pokaz w moim kodziew jak to zaadaptowac.
    Bo proboje i cos nadal sie chrzani :D
  • REKLAMA
  • Pomocny post
    #8 4746826
    Sind
    Poziom 16  
    Posty: 182
    Pomógł: 9
    Ocena: 3
    
    Config Timer1 = Pwm , Pwm = 8 , Prescale = 1 , Compare A Pwm = Clear Down
    Dim Pokaz As Single
    dim B as single
    
    
    
    Cls : Lcd "  Swiatlo v0.1" : Lowerline : Lcd " by Grzegorz Z."
    Waitms 500
    Pwm1a = 0
    b=100/255
    Do
    If Pind.5 = 0 Then 
    
    if pwm1a=255 then
    pwm1a=255
    else 
    Pwm1a = Pwm1a +1
    end if
    
    If Pind.4 = 0 Then 
    if pwm1a=0 then
    pwm1a=0
    else
    Pwm1a = Pwm1a -1
    end if
    
    
    Pokaz = Pwm1a *b
    Cls : Lcd "Moc: " : Lcd Pokaz
    Waitms 5
    Loop
    End


    do wyswietlanie mozesz tez uzyc funckcji FORMAT()
    odczyt przyciskow mozesz tez zrobic na finkcji DEBOUNCE()
  • #9 4746856
    kiler129
    Poziom 27  
    Posty: 1304
    Pomógł: 12
    Ocena: 80
    Cos z tymi ifami jest nie tak.
    Bascom sie wypluwa.

    Error 7 i 123 w lini 0.

    Mam jeszce jedne klopt z PWM. Szukalem na elce i na google i nigdzie nie moge znalezc sensownie wytlumaczone z przykladem jak uzywaskac konkretna czestotliwosc na PWM i jak ja regulowac (wyp. 50%).

    edit:
    Ok, jakos wybrnelem :D

    
    Config Timer1 = Pwm , Pwm = 8 , Prescale = 1 , Compare A Pwm = Clear Down
    Dim Pokaz As Single
    Dim B As Single
    Config Portd = Input
    Deflcdchar 0 , 24 , 24 , 1 , 2 , 4 , 8 , 19 , 3             'Znak procentu
    Deflcdchar 1 , 32 , 14 , 31 , 31 , 31 , 14 , 4 , 4          'Zarowka :)
    
    
    Cls : Lcd " " : Lcd Chr(1) : Lcd "Swiatlo v0.1" : Lcd Chr(1) : Lowerline : Lcd " by Grzegorz Z."
    Waitms 500
    Pwm1a = 0
    B = 100 / 255
    
    Do
     Pokaz = Pwm1a * B
     Cls : Lcd "Moc: " : Lcd Pokaz : Lcd Chr(0)
     Waitms 5
    
    If Pind.4 = 0 Then
     If Pwm1a = 0 Then
      Pwm1a = 0
     Else
      Pwm1a = Pwm1a - 5
     End If
    End If
    
    
    If Pind.5 = 0 Then
     If Pwm1a = 255 Then
      Pwm1a = 255
     Else
      Pwm1a = Pwm1a + 5
     End If
    End If
    Loop
    
    
    End


    Niestety zaokraglanie mi nie idzie, anie pzez format() ani przez fusing() :|

    Zmiganiem LCD sobie nie porawdzilem - zdradzi ktosswoja sztuczke ? ;>

    Tak btw - te µP nie takie straszne jak je maluja :D
    Jak juz w cyzmkolwiek sie programowalo to latwo nawyki zmienic a czescz nich zostawic :)
  • Pomocny post
    #10 4747385
    Samuraj
    Poziom 35  
    Posty: 2792
    Pomógł: 286
    Ocena: 619
    kiler129 napisał:


    
     Cls : Lcd "Moc: " : Lcd Pokaz : Lcd Chr(0)
     


    Zmiganiem LCD sobie nie porawdzilem - zdradzi ktosswoja sztuczke ? ;>


    Czytaj poprzednie posty.
    Wywal Cls i zastąp czym co pozycjonuje kursor na ekranie. Nie znam BASCOMA ale pewnie jakieś GOTOXY albo coś podobnego.
  • Pomocny post
    #11 4747566
    gregoorr
    Poziom 18  
    Posty: 232
    Pomógł: 19
    Ocena: 34
    Z miganiem lcd nie ma żadnych sztuczek. Chodzi o to aby nie czyścić w kółko całego wyświetlacza i znowu coś wyświetlać, bo to powoduje miganie tego co wyświetlasz. Robi się po prostu tak:
    
    locate 1,1
    lcd "to wyswietlam"
    

    Locate powoduje że zawsze wyświetlasz od pozycji 1,1. Można to nazwać nadpisywaniem. Przy różnej długości zmiennej do wyświetlania, trzeba czasem dopisać spację za zmienną, aby czyścić na wszelki wypadek np: dwa pola za zmienną, gdy raz wyświetlamy 100, a innym razem 1. Trzeba wtedy wyczyścić dwa zera od 100 aby nie zostały.
    
    locate 1,1
    lcd x;"  "
    

    W zasadzie wszystko to było wyżej, tyle że ktoś nazwał to nadpisywaniem, jest to metoda ogólnie znana i jak pisałem nie ma tam żadnej sztuczki.


    Jak ci zależy na tych procentach i zaokrągleniach, to na szybko może być tak:
    
    Dim X As Single                                             'do obliczeń
    Dim Y As Byte                                               'do PWM
    Dim W As Byte                                               'do wyświetlania %
    
    For Y = 0 To 255
    
    Pwm1a = Y
    Locate 1 , 1
    X = Y / 2.55
    W = X
    Lcd W ; "%" ; "  "
    Next Y
    
    
    
    For Y = 255 To 0 Step -1
    Pwm1a = Y
    Locate 1 , 1
    X = Y / 2.55
    W = X
    Lcd W ; "%" ; "  "
    Next Y
    
    
    End                                                         'end program
    


    Pamięci żre, ale na początek może być, liczy się satysfakcja że działa.
  • #12 4748045
    kiler129
    Poziom 27  
    Posty: 1304
    Pomógł: 12
    Ocena: 80
    Co do zaokraglania to juz tak probowalem. Po 1 nie miesci sie w pamicie a po ndrugie nie dziala jak trzeba :P
    Co do LCD do swietna sprawa :D

    Wszyscy dostali pomogl + Sind i gregoorr po 10 pkt :)
    Pozostaje jeszce jedna kwestia:
    (zacytuje sam siebie :P)

    Cytat:
    Mam jeszce jedne klopt z PWM. Szukalem na elce i na google i nigdzie nie moge znalezc sensownie wytlumaczone z przykladem jak uzywaskac konkretna czestotliwosc na PWM i jak ja regulowac (wyp. 50%).
    [/quote]
  • #13 4748411
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    kiler129 napisał:
    Co do zaokraglania to juz tak probowalem. Po 1 nie miesci sie w pamicie a po ndrugie nie dziala jak trzeba :P

    Nie mieści się w pamięci , bo zabawa ze zmiennymi zmiennoprzecinkowymi pojedynczej precyzji(Single) w Bascomie , jest strasznie pamięciożerna :|
    Żeby tę sprawę załatwić jak najmniejszym kosztem zużytej pamięci programu , trzeba Twoje obliczenia sprowadzić do liczb całkowitych.
    Nie będę tu przypominał ogólnie znanych praw algebraicznych , tylko podam przykład:
    
    'Procent=PWM*100/(2.55*100) jest równoważne z Procent = PWM/2.55
    'a pozbywamy się liczby zmiennoprzecinkowej
    Dim Pokaz As Word ' wybieramy Word , by zmieścić wynik PWM*100
    
    '...
    Pokaz = Pwm1a * 100
    Pokaz = Pokaz/255    ' i masz swoje procenty
    


    kiler129 napisał:
    Mam jeszce jedne klopt z PWM. Szukalem na elce i na google i nigdzie nie moge znalezc sensownie wytlumaczone z przykladem jak uzywaskac konkretna czestotliwosc na PWM i jak ja regulowac (wyp. 50%).

    A to jest też proste ;)
    Okres PWM , jest wprost proporcjonalny do aktualnie ustawionej pojemności licznika(maksymalnej wartości do której licznik zlicza) .Ponieważ Timer1 w ATTiny2313 ma aż 16 trybów pracy , to zależnie od efektu jaki chcemy osiągnąć , trzeba sobie wybrać odpowiedni tryb jego pracy.I w tym miejscu , należy udać się (niestety?) do dokumentacji.

    Piotrek
  • #14 4748535
    kiler129
    Poziom 27  
    Posty: 1304
    Pomógł: 12
    Ocena: 80
    zumek napisał:

    A to jest też proste ;)
    Okres PWM , jest wprost proporcjonalny do aktualnie ustawionej pojemności licznika(maksymalnej wartości do której licznik zlicza) .Ponieważ Timer1 w ATTiny2313 ma aż 16 trybów pracy , to zależnie od efektu jaki chcemy osiągnąć , trzeba sobie wybrać odpowiedni tryb jego pracy.I w tym miejscu , należy udać się (niestety?) do dokumentacji.

    Piotrek


    Yeeeyy ?
    Przpelniles mi stos w makowce xD
    Wez ze to powiedz jasno.

    Gdizes mi chyba posta wcielo ale juz poradzilem sobie z zakraglaniem. Uzylem round.
  • #15 4748922
    K_o_n_r_a_d
    Poziom 23  
    Posty: 318
    Pomógł: 86
    Ocena: 9
    W programie na początku ustawiłeś rozdzielczość PWMa na 8 bitów:
    Cytat:
    Config Timer1 = Pwm , Pwm = 8 , Prescale = 1 , Compare A Pwm = Clear Down

    PWM=8 to właśnie to. Czyli masz 256 kombinacji wypełnienia (od 0 do 255) i teraz wartość 255 to 100%, wartość 0 to 0%, wartość 127 to 50%. Resztę wartości możesz policzyć z proporcji.
    Częstotliwość PWMa zależy od ustawionego Prescalera, wielkości licznika i zastosowanego generatora (źródła sygnału, który licznik zlicza).
    Przy Prescalerze=1 i 8bitowym PWMie częstotliwość wyjściowa wynosi Fosc/255/2 (255 taktów oscylatora * 2).
  • #16 4749523
    Sind
    Poziom 16  
    Posty: 182
    Pomógł: 9
    Ocena: 3
    Zeby nie miglalo mozesz tez umiescic cala procedurke wyswietlania na LCD jako podprogram, ktory bedzie wyswietlal dane tylko po ich zmianie...

    I sprawdz dobrze zasilanie LCD, sprawdz czy jest dobrze odfiltrowane, czy nie ma duzych tetnien...

Podsumowanie tematu

✨ Dyskusja dotyczy problemów z błędnymi obliczeniami wartości PWM oraz migotaniem wyświetlacza LCD w projekcie z mikrokontrolerem Attiny2313 i Bascomem. Głównym problemem było niepoprawne użycie wartości zmiennoprzecinkowych (np. 2.55) w operacjach na zmiennych typu Integer, co powodowało zaokrąglenia i błędne wyniki (np. 255/2.55 dające 85 zamiast 100%). Rozwiązaniem jest stosowanie zmiennych typu Single lub Word oraz przeliczanie wartości PWM na procenty za pomocą mnożenia i dzielenia całkowitego (np. Pokaz = (PWM * 100) / 255). Wskazano także, że PWM w trybie 8-bitowym ma zakres 0-255, gdzie 255 odpowiada 100% wypełnienia, a częstotliwość PWM zależy od preskalera i konfiguracji timera (np. Prescale=1, PWM=8 bitów).

Migotanie LCD wynikało z ciągłego czyszczenia całego wyświetlacza poleceniem CLS przed każdą aktualizacją, co powodowało widoczne miganie. Zalecane jest usunięcie CLS i zamiast tego nadpisywanie tekstu na wyświetlaczu poprzez pozycjonowanie kursora (np. funkcja Locate lub GotoXY) oraz dopisywanie spacji po zmiennej, aby wyczyścić pozostałości po poprzednich wartościach. Można też umieścić procedurę wyświetlania w podprogramie, który aktualizuje ekran tylko przy zmianie danych.

Dodatkowo omówiono kwestie pamięciochłonności zmiennych zmiennoprzecinkowych w Bascomie oraz konieczność wyboru odpowiedniego trybu pracy timera 16-bitowego w Attiny2313 dla uzyskania pożądanej częstotliwości PWM. Podano przykłady kodu poprawiającego obliczenia i wyświetlanie wartości PWM w procentach oraz minimalizującego migotanie LCD.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA