Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[Mega8][Bascom] Lampka RGB sterowana z PWM

27 Lis 2008 15:38 3840 14
  • Poziom 15  
    Witam,


    Pisząc program pod lampkę RGB natrafiłem na pewien problem.

    W kodzie widać, że B rozjaśnia się od 0 do 255. Chciałbym aby dokładnie w tym samym czasie G i B rozjaśniało się do jakiegoś innego stopnia. Niestety niewiem jak to połączyć.

    Code:
    Do 
    
    For B = 0 To 255
       Ocr2 = R
       Pwm1b = G
       Pwm1a = B


       Waitms 4
    Next I

    For B = 255 To 0 Step -1

       Ocr2 = R
       Pwm1b = G
       Pwm1a = B
       Waitms 4
    Next I


    Chciałbym również się zapytać o komendę Rnd(x). Chciałbym użyć tej komendy, aby diody miały zawsze losową wartość. Niestety ona zmienia stan końcówki natychmiastowo, a nie płynnie. Da się to inaczej rozwiązać?

    Pozdrawiam

    Edit:
    Zapomniałem dodać, że przekopałem wszystkie tematy na temat lampek RGB na AVR i za dużo mi to nie pomogło:(
  • Poziom 32  
    Code:
    For B = 0 To 255
    
       Ocr2 = R
       Pwm1b = G
       Pwm1a = B


       Waitms 4
    Next I


    Jak myślisz co jest nie tak z tą pętlą?
  • Poziom 15  
    Nie potrzebnie są wpisane Pwm1b i Ocr2. Brakuje Do i Loop, ale w programie było. No i raczej waitms 4 tutaj nie pasuje:-)
  • Poziom 32  
    Waitms musi być ponieważ musi być opóźnienie pomiędzy kolejnymi wspisami do rejestru OCRx bo inaczej będzie się to działo za szybko. W miejscu gdzie masz next I powinno być next B.
  • Poziom 15  
    Ok to działa tylko, że to nie jest to czego pragnę:-) Tutaj się wszystko dzieje po kolei, a chcę aby w jednym czasie działy się 3 rzeczy.

    Pozdrawiam
  • Poziom 32  
    A dokładniej co? Chcesz żeby jedna ledka się rozjaśniała a druga w tym samym czasie się ściemniała?
  • Poziom 15  
    Tak dokładnie to co napisałeś. Męcze się z tym od wczoraj i niestety nie udało mi się tego zrobić.

    Pozdrawiam
  • Poziom 32  
    Pokaż ustawienia timera. Tak na szybko to może inkrementuj jedno a drugie dekrementuj.
  • Poziom 15  
    Code:
    Config Timer1 = Pwm , Prescale = 1 , Pwm = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down
    

    Config Timer2 = Pwm , Pwm = On , Prescale = 1 , Compare Pwm = Clear Up
  • Poziom 32  
    Robisz coś takiego:
    Code:
    Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Up , Prescale = 8
    

    ....

    do

    For I = 0 To 255
    Pwm1b = I
    Pwm1a = I
    Waitms 30
    Next I
    loop

    Powinno wyjść to co chciałeś :)
  • Poziom 15  
    Witaj,
    dzięki, ale to też nie o to chodzi:-)
    W tym kodzie co mi dałeś Pwm1a i b pracują tak jakby na zmiane. Ja najchętniej zrobiłbym to na Rnd(liczba) tyle, że wtedy przeskakuje z jednego koloru na drugi natychmiastowo, a ja chciałbym płynnie. Jeśli nie dało by się na Rnd to można na For/Next.

    Mam pytanie odnośnie tego kodu:

    Code:
    For I = 0 To 255
    
    Pwm1b = I
    Pwm1a = I
    ocr2 = I
    Waitms 30
    Next I

    For I = 255 To 64
    Pwm1b = I
    Pwm1a = I
    Ocr2 = I
    Next I

    For I = 64 To 128
    Pwm1b = I
    Pwm1a = I
    Ocr2 = I
    Next I


    Co tu jest źle? Wg. mnie powinno to podświetlić diody na maxa, później zgasic do 64, a nastepnie podjasnic do 128. Niestety nie dzieje się tak jak chcę:(

    Pozdrawiam
  • Poziom 32  
    Spójrz tutaj
    Code:
    Compare A Pwm = Clear Down , Compare B Pwm = Clear Down 
    i tutaj
    Code:
    Compare Pwm = Clear Up


    W pierwszym ustawieniu dwie diody będą działać synchronicznie zaś zerkając do drugiego to trzecia będzie na odwrót.
  • Poziom 15  
    Tak, tyle że ja chcę uzyskać większą palete barw. Tutaj zawsze będą praktycznie te same kolory. Dlatego chciałbym użyc funkcji Rnd(liczba)
  • Poziom 32  
    No to robisz np. tak pwm1a= rnd(255).
  • Poziom 15  
    Robiłem, ale wtedy dioda miga a nie płynnie przechodzi:-)