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

[BASCOM][ATmega8]Sterowanie diodą RGB przez PWM

KD93 13 Gru 2008 21:06 8088 15
REKLAMA
  • #1 5855368
    KD93
    Poziom 12  
    Witam

    Chciałem zrobić prostą lampkę RGB, według zasady, że każdy następny kolor pulsuje świeci zapala się i gaśnie dłużej, co powoduje ich mieszanie.

    
    $regfile = "m8def.dat"
    $crystal = 1000000
    
    Config Pinb.1 = Output
    Config Pinb.2 = Output
    Config Pinb.3 = Output
    
    
    Dim R As Byte
    Dim G As Byte
    Dim B As Byte
    
    
    
    Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 1
    Config Timer2 = Pwm , Async = Off , Pwm = On , Compare Pwm = Clear Up , Prescale = 1
    
    Do
    
    For R = 0 To 255
       Pwm1a = R
    Waitms 4
    Next R
    
    For R = 255 To 0 Step -1
       Pwm1a = R
    Waitms 4
    Next R
    
    For G = 0 To 255
       Pwm1b = G
    Waitms 7
    Next G
    
    For G = 255 To 0 Step -1
       Pwm1b = G
    Waitms 10
    Next G
    
    For B = 0 To 255
       Ocr2 = B
    Waitms 7
    Next B
    
    For B = 255 To 0 Step -1
       Ocr2 = B
    Waitms 13
    Next B
    
    
    Loop
    
    End
    
    


    Program jednak nie działa do końca tak jak chciałem. Kolorki się ładnie zmieniają, płynnie przechodzą, ale są ciągle takie same: ciemnoróżowy, żółty, seledynowy, ciemnoróżowy, żółty, seledynowy itd itd. (zmienne R, G i B są umowne, nie podłączam diody czerwonej pod R, zielonej pod G a niebieskiej pod B). Jak przerobić kod, żeby kolory się mieszały i było więcej barw?

    Domyślnie chciałem robić układ na ATtiny2313,a le jak na razie ATMegę8 lepiej rozumiem.

    Jestem również otwarty na PROSTE programy, żeby tylko nie było niepotrzebnej regulacji szybkości, barw i innych dupereli, bo mnie na tym w ogóle nie zależy, jestem "bardzo początkujący" w temacie µC.

    Pozdrawiam.

    Przeniosłem z "Programowanie początkujący"
    [Dr.Vee]

    Poprawiłem tytuł - regulamin p.11
    [zumek]
  • REKLAMA
  • #2 5855779
    prokopcio
    Poziom 29  
    nie wnikam bardzo szczegółowo bo piszę w assemblerze ale na pierwszy rzut oka widzę taki algorytm który na pisałeś:

    1.rozjaśnij czerwony
    2.ściemnij czerwony
    3.rozjaśnij zielony
    4.ściemnij zielony
    5.rozjaśnij niebieski
    6.ściemnij niebieski
    7. zapętl od pkt 1

    nie widzę Tutaj żadnego mieszania kolorów - i Ty chyba też nie ujrzysz. zrób np tak (zakładam, że Twój program rzeczywiście działa tak jak opisałeś bo nie znam dokładnie składni bascoma):

    sama pętla:

    Do



    For R = 0 To 255
    Pwm1a = R
    G=255-R
    Pwm1b = G
    Waitms 4
    Next R

    For R = 255 To 0 Step -1
    Pwm1a = R
    B=255-R
    Ocr2 = B
    Waitms 4
    Next R

    For G = 255 To 0 Step-1
    Pwm1b = G
    Waitms 7
    Next G
    ....
    ......
    ....
    ....
    Loop



    oczwiście, żeby mieć zamierzony efekt wszystkich kolorów to trzeba napisać algorytm wykonujący przejście przez wszystkie 256*256*256 kolory wraz z odcieniami ;) ja tylko chciałem Ci pokazać o co chodzi a Ty kombinuj dalej :)
  • #3 5856335
    KD93
    Poziom 12  
    Właśnie problem ma taki, że kolory się mieszają, nie ma tak:
    1.rozjaśnij czerwony
    2.ściemnij czerwony
    3.rozjaśnij zielony
    4.ściemnij zielony
    5.rozjaśnij niebieski
    6.ściemnij niebieski

    Jak by się tak działo, to przynajmniej wiedziałbym w czym jest problem.

    Dzięki za podpowiedź, będę kombinował :D
  • REKLAMA
  • #4 5857518
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • Pomocny post
    #5 5859589
    prokopcio
    Poziom 29  
    dobra atom1477 - chyba wiem, w czym chłopak ma problem... Wszystko zależy od tego jak ma podłączone te diody a schematu nie widzimy - bo inaczej będzie to działać jeśli będą pomiedzy +ucc a wyjściami a inaczej jeśli ma podpięte pomiędzy masą a wyjściami - zależy od tego czy maksymalna jasność jest dla PWM = 255 czy dla PWM=0 !!!
    Sprawdź dla jednej diody z programem który na nią wystawi stałą wartość PWM=0 lub 255 to będziesz wtedy wiedział a później dojdziesz do wniosku że to o czym pisaliśmy z atom1477 ma rację bytu.
  • #6 5861908
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • #7 5862140
    KD93
    Poziom 12  
    dzięki za podpowiedzi,mam dużo czasu przez święta to będę próbował.

    Mam diodę RGB ze wspólną anodą.

    Dodano po 1 [godziny] 34 [minuty]:

    Ok, więc tak:


    $regfile = "m8def.dat"
    $crystal = 1000000
    
    Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 1
    Config Timer2 = Pwm , Async = Off , Pwm = On , Compare Pwm = Clear Down , Prescale = 1
    
    Pwm1a = 0
    Pwm1b = 0
    Ocr2 = 0
    
    
    



    Teraz nie świeci żadna dioda.


    atom1477, jeżeli będzie dużo kolorów, to nie przeszkadza mi, że będą się powtarzać, ale czy by cie nie wkurzały 3 kolory w kółko ( i do tego jeszcze 1 różowy)?
  • Pomocny post
    #8 5862618
    Konto nie istnieje
    Poziom 1  
  • #9 5862688
    KD93
    Poziom 12  
    Super, działa tak jak chciałem!

    $regfile = "m8def.dat"
    $crystal = 1000000
    
    Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 1
    Config Timer2 = Pwm , Async = Off , Pwm = On , Compare Pwm = Clear Down , Prescale = 1
    
    Pwm1a = 0
    Pwm1b = 0
    Ocr2 = 255
    
    Dim R As Byte
    Dim G As Byte
    Dim B As Byte
    
    
    Do
    
    
    
    Wait 3
    
    For R = 0 To 255
    Pwm1a = R
    Waitms 20
    Next R
    
    Wait 3
    
    For B = 255 To 0 Step -1
    Ocr2 = B
    Waitms 20
    Next B
    
    Wait 3
    
    For G = 0 To 255
    Pwm1b = G
    Waitms 20
    Next G
    
    Wait 3
    
    For R = 255 To 0 Step -1
    Pwm1a = R
    Waitms 20
    Next R
    
    Wait 3
    
    For B = 0 To 255
    Ocr2 = B
    Waitms 20
    Next B
    
    Wait 3
    
    For G = 255 To 0 Step -1
    Pwm1b = G
    Waitms 20
    Next G
    
    Loop
    End



    Teraz tylko przerobić na attiny2313 i git :D

    Chociaż dibelska myśl mi przez łeb przechodzi... Attiny 2313 ma dwa timery, każdy z nich 2 kanały PWM, czyli razem 4, może by tak jeszcze dorzucić gdzieś diodę białą? Trzeba popróbować :twisted:

    Wielkie dzięki wam! Bez was bym sobie nie poradził.
  • #10 5863284
    Konto nie istnieje
    Poziom 1  
  • #11 5885555
    KD93
    Poziom 12  
    Hym....

    Ma ktoś pomysł jak ustawić Timer0 na Attiny2313? Tam są dwa kanały Pwm, ja bym potrzebował tylko jednego, wiem, że to trzeba ustawić "ręcznie" i że trzeba wpisać odpowiednie wartości:
    Tccr0a=?
    Tccr0b=?

    Tylko nie wiem jakie. Szukałem i próbowałem dwa dni ale nic z tego nie wyszło.

    I jeszcze jedna sprawa. Na ATmega8 przy wew. oscylatorze 1mH działa ładnie, a na ATtiny2313 przy takim samym wew. oscylatorze diodki migają. Taka już architektura? Bo jeśli tak, to zrobię tę lampkę na ATmega8, chociaż to jak wożenie jednej paczki tirem...
  • #12 5886142
    Konto nie istnieje
    Poziom 1  
  • #13 5886542
    dawid512
    Poziom 32  
    Jest włączony podział tzw. CKDIV8 i masz wew. oscylator na 1MHz jeżeli to wyłączysz to masz 8MHz.
  • #14 5886843
    KD93
    Poziom 12  
    To chyba znaczy, że muszę grzebać w fusach...

    Macie jakiś pomysł na uruchomienie tego 3 kanału PWM?
  • #15 5887033
    Konto nie istnieje
    Poziom 1  
  • #16 5887295
    KD93
    Poziom 12  
    Uruchomiło :D Szkoda tylko, że nic z tego nie rozumiem.
    Co prawda jest na odwrót niż w ATmega8 (tam 0-dioda nie świeci, tutaj 0 - dioda świeci), pozmieniałem trochę kod i jest tak samo jak wcześniej na ATmega.

    Kod:
    $regfile = "attiny2313.dat"
    $crystal = 1000000
    
    Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Disconnect , Prescale = 1
    ldi R16, &B10100011
    !Out Tccr0a, R16
    ldi r16, &B00000001
    !Out Tccr0b, R16
    
    
    Config Pind.5 = Output
    Config Pinb.2 = Output
    Config Pinb.3 = Output
    Config Pinb.4 = Output
    
    Dim R As Byte
    Dim G As Byte
    Dim B As Byte
    
    Pwm1a = 0                                                   'niebieski
    Pwm1b = 255                                                 'nie używam
    Pwm0a = 255                                                 'zielony
    Pwm0b = 255                                                 'czerwony
    
    Do
    
    Wait 3
    
    For R = 255 To 0 Step -1                                    'rozjaśnianie czerwonej
    Pwm0b = R
    Waitms 20
    Next R
    
    Wait 3
    
    For B = 0 To 255                                            'ściemnianie niebieskiej
    Pwm1a = B
    Waitms 20
    Next B
    
    Wait 3
    
    For G = 255 To 0 Step -1                                    'rozjaśnianie zielonej
    Pwm0a = G
    Waitms 20
    Next G
    
    Wait 3
    
    For R = 0 To 255                                            'ściemianie czerwonej
    Pwm0b = R
    Waitms 20
    Next R
    
    Wait 3
    
    For B = 255 To 0 Step -1                                    'rozjaśnianie niebieskiej
    Pwm1a = B
    Waitms 20
    Next B
    
    Wait 3
    
    For G = 0 To 255                                            'ściemianie zielonej
    Pwm0a = G
    Waitms 20
    Next G
    
    Loop
    End


    Dziękuję wam bardzo za pomoc :D Wesołych Świąt.
REKLAMA