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

[ATtiny13] [BASCOM] PWM na dwóch wyjściach

Belialek 23 Maj 2009 00:11 3702 8
REKLAMA
  • #1 6563158
    Belialek
    Poziom 22  
    Witam,

    Czy istnieje możliwość programowego uzyskania różnego napięcia na dwóch wyjściach (efekt taki jak przy użyciu sprzętowego PWM)? Generalnie chodzi o to, że chciałbym sterować poziomem świecenia dwóch LED'ów niezależnie. Na większych procesorach nie mam z tym problemu, ale chciałem coś zrobić właśnie na tiny13.

    z góry dziękuję za pomoc!
  • REKLAMA
  • #2 6563175
    Ronin64
    Poziom 35  
    Przeglądnij tematy o lampkach RGB tam powinieneś znaleźć odpowiedź na swoje pytanie.
  • #3 6563813
    manekinen
    Poziom 29  
    W załączniku mój krótki program lampki rgb, zjedź do "software_pwm" i zobacz jakie to proste. W kółko zwiększasz zmienną referencyjną od 0 do 256 (256 rozdzielczość pwm, możesz dać wyższą), porównujesz z nią wartość każdego kanału i zapalasz lub gasisz piny. W tym przykładzie przy 4,8MHz i 256 bitowej rozdzielczości uzyskujemy f ~73.24Hz a jeśli to za mało to można podnieść f taktowania do 9.6Mhz, czy zmniejszyć rozdzielczość pwm.
  • REKLAMA
  • #4 6566100
    Belialek
    Poziom 22  
    Wiec tak:

    Twój program wrzuciłem do attiny13, pod wyjścia podpiąłem 3 oddzielne diody. Efekt - szybko mrugające diody, żadnego płynnego przejścia między nimi, 1 i 0 :) Znalazłem projekt twojej lampki, masz tam po drodze trochę więcej rzeczy niż mój rezystor i dioda, może dlatego. Fusebitów nie ruszałem.

    Co do samego działania - za bardzo nie rozumiem idei działania tego programowego PWM'a...

    
    Software_pwm:
    
    Incr Reference                                              'zmienna referencyjna
    
    If Reference < R Then : Set Portb.0 : Else : Reset Portb.0 : End If       'red
    
    If Reference < G Then : Set Portb.1 : Else : Reset Portb.1 : End If       'green
    
    If Reference < B Then : Set Portb.2 : Else : Reset Portb.2 : End If       'blue
    
    Return
    


    Nie rozumiem co się tutaj dzieje. Zmienna Reference nie ma żadnej przypisanej wartości początkowej. Jak np uzyskać 50% świecenia diody? Nie chodzi mi o stopniowe przyciemnianie, po prostu chciałbym mieć możliwość w dowolnym miejscu programu ustalenia jakie napięcie ma być na danym wyjściu.

    Z noty katalogowej Attiny13 wynika, że posiada on 2 niezależne PWM. W zasadzie więcej nie potrzebuje (tak czy inaczej na przyszłość warto wiedzieć jak to programowe działa, dlatego pytałem) ale podczas prób nigdy nie mogłem poprawnie obsłużyć dwóch PWM naraz...

    
    $regfile = "ATTINY13.DAT"
    $crystal = 1000000
    $hwstack = 32
    $swstack = 18
    $framesize = 8
    
    Config Adc = Single , Prescaler = Auto , Reference = Avcc
    Config Pinb.0 = Output
    Config Pinb.1 = Output
    Config Timer0 = Pwm , Prescale = 8 , Compare A Pwm = Clear Down
    Dim A As Byte
    Dim B As Byte
    A = 1
    B = 50
    
    Do
    Incr A
    Incr B
    Pwm0a = A
    Pwm0b = B
    Waitms 50
    Loop
    
    End
    


    Po uruchomieniu dioda podłączona do Portb.0 zachowywała się tak jak chciałem, czyli stopniowo przygasa, natomiast dioda na wyjściu Portb.1 świeciła się niestety jednostajnie. Czy ten drugi PWM można wykorzystać w taki sam sposób jak pierwszy, czy nie?
  • REKLAMA
  • Pomocny post
    #6 6567803
    manekinen
    Poziom 29  
    Belialek napisał:
    Nie rozumiem co się tutaj dzieje. Zmienna Reference nie ma żadnej przypisanej wartości początkowej. Jak np uzyskać 50% świecenia diody? Nie chodzi mi o stopniowe przyciemnianie, po prostu chciałbym mieć możliwość w dowolnym miejscu programu ustalenia jakie napięcie ma być na danym wyjściu.

    Nie potrzeba żadnej wartości początkowej, jest to zmienna typu byte ograniczona do 256, jak doleci do 255 to zaczyna znowu od zera.

    Jeśli teraz ustawimy np kolor czerwony, R, wypełnienie 50% (czyli R=128), to przez 128 cykli rosnąca reference będzie mniejsza od R a pin wyjściowy załączony, a przez kolejne 128 cykli reference będzie większa od R a pin wyjściowy wyłączony - tak więc przez cały czas trwania 256 cykli pin wyjściowy będzie miał wypełnienie pół na pół. Nie wiem czy zrozumiale to napisałem. Zostaw tylko początek programu z deklaracją timerów i ten podprogram "software_pwm" - timer będzie go wywoływał, ten będzie porównywał wartości i zmieniał stan pinów tworząc odpowiednie wypełnienie. Do zmiennej R wpisujesz wartość wypełnienia z przedziału 0-255, w dowolnym momencie.

    Belialek napisał:
    Z noty katalogowej Attiny13 wynika, że posiada on 2 niezależne PWM. W zasadzie więcej nie potrzebuje (tak czy inaczej na przyszłość warto wiedzieć jak to programowe działa, dlatego pytałem) ale podczas prób nigdy nie mogłem poprawnie obsłużyć dwóch PWM naraz...

    https://www.elektroda.pl/rtvforum/topic586564.html#3033997
  • REKLAMA
  • #7 6569620
    Belialek
    Poziom 22  
    hmmm no tak, ale dla mnie największą niewiadomą tego programu jest miejsce, w którym "mówię" które wyjście ma np. świecić na 50% (czyli przyjąć wartość 128). Ja wiem że program działa i tak jest dobrze, ale tego nie łapię :(

    R, G, B są zwykłymi zmiennymi, w żaden sposób nie są przypisane do konkretnych pinów, a w programie piszesz:

    
          Case 0:
             'zapalam B
             Incr B
             If B = 255 Then Przejscie = 1
    


    w komentarzu jest napisane, że zapalasz kolor niebieski, a w kodzie ja widzę tylko zwiększenie zmiennej B o 1 :) W którym miejscu tego kodu jest informacja dla procesora, że wartość B ma być rozumiana jako poziom wypełnienia dla wyjścia powiedzmy Portb.2?

    Od rana próbuje bezskutecznie zaświecić jednocześnie 2 diody, jedną na 50%, druga na 25% ;/

    EDIT:

    Oczywiście dzięki pomocy kolegi MaxDamage18 udało mi się to uzyskać za pomocą sprzętowego PWM co mi na chwilę obecną zupełnie wystarcza, ale chciałbym jednak zrozumieć idee i nauczyc się wykorzystywać programowy PWM.
  • Pomocny post
    #8 6569708
    ZbeeGin
    Poziom 39  
    Belialek napisał:
    hmmm no tak, ale dla mnie największą niewiadomą tego programu jest miejsce, w którym "mówię" które wyjście ma np. świecić na 50% (czyli przyjąć wartość 128).

    Dowolne miejsce w pętli głównej programu (do...Loop) gdzie przypisujesz zmiennym R, G, B konkretne wartości.

    Belialek napisał:
    R, G, B są zwykłymi zmiennymi, w żaden sposób nie są przypisane do konkretnych pinów, a w programie piszesz:

    
          Case 0:
             'zapalam B
             Incr B
             If B = 255 Then Przejscie = 1
    

    Wszystko jak najbardziej poprawnie. Konćowki są przecież przypisane we wcześniej przytoczonym fragmencie:
    Software_pwm: 
      Incr Reference                                              'zmienna referencyjna 
      If Reference < R Then : Set Portb.0 : Else : Reset Portb.0 : End If       'red 
      If Reference < G Then : Set Portb.1 : Else : Reset Portb.1 : End If       'green 
      If Reference < B Then : Set Portb.2 : Else : Reset Portb.2 : End If       'blue 
    Return

    R=>PB0, G=>PB1, B=>PB2. Widać to jak na dłoni.

    Belialek napisał:
    w komentarzu jest napisane, że zapalasz kolor niebieski, a w kodzie ja widzę tylko zwiększenie zmiennej B o 1 :) W którym miejscu tego kodu jest informacja dla procesora, że wartość B ma być rozumiana jako poziom wypełnienia dla wyjścia powiedzmy Portb.2?

    Patrz kod powtórzony wyżej.

    Belialek napisał:
    Od rana próbuje bezskutecznie zaświecić jednocześnie 2 diody, jedną na 50%, druga na 25% ;/

    Weź swój stary program, dodaj poprawkę jaką słusznie zaproponował kol. MaxDamage18 w CONFIG TIMER0, wyrzuć CONFIG ADC bo jest niepotrzebny, zaprogramuj kość i podziwiaj.


    Program inteligentnej lampki RGB wymaga zmian w bitach konfiguracji (fuse), gdyż wymaga taktowania procesora 4,8MHz. Ty tego nie zrobiłeś, zatem masz taktowanie 1,2MHz i wszystko miga zamiast się rozjaśniać.
  • #9 6570329
    Belialek
    Poziom 22  
    I stała się światłość! :D Teraz rozumiem, pięknie dziękuję i temat uważam za wyczerpany :)
REKLAMA