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 + Atmega128 - PWM FAST - pełne wypełnienie przy ponownym uruchomieniu

sundayman 22 Maj 2013 03:34 1809 3
REKLAMA
  • #1 12332487
    sundayman
    Poziom 26  
    Mam taki kłopot (Bascom + Atmega128) ;

    Korzystam z PWM w trybie FAST.
    Uruchamiam sobie to normalnie ;

    Tcnt0 = 0
    Ocr0 = 0
    Tccr0 = &B01101010                                          'timer0 in fast pwm mode, prescale = 8      10kHz
    Ocr0 = 0


    Następnie zmieniam zależnie od potrzeb wypełnienie, przez wpis do OCR0.

    Na koniec wyłączam PWM ;

    Ocr0 = 0
    Tccr0 = &B00000000
    Tcnt0 = 0


    PWM startuje zawsze od wypełnienia "0", i potem jest zwiększane (jak np. przy rozruchu silnika).

    No i niby wszystko jest dobrze, tylko, że czasem przy ponownym włączeniu tego PWM na samym początku pojawia mi się takie coś :

    BASCOM + Atmega128 - PWM FAST - pełne wypełnienie przy ponownym uruchomieniu

    Czerwony przebieg to wyjście z PWM.
    Jak widać, w pierwszym "cyklu", zaraz po uruchomieniu PWM pojawia się pełne wypełnienie - w następnych już jest takie, jakie jest zadane (krótkie piki).

    I teraz tak - przy pierwszym uruchomieniu (po resecie) - zawsze jest ok.
    W następnych uruchomieniach już różnie - raz dobrze, raz źle.

    Domyślam się, że coś pozostaje w jakimś rejestrze, ale w jakim ?
    Myślałem , że zerowanie Tcnt0 pomoże, ale nie.

    Wyłączam PWM, ponieważ kiedy OCR0 = 0 to na wyjściu są właśnie bardzo krótkie piki, a nie stabilny stan "0". Dlatego wyłączam to PWM, a potem jeszcze dodatkowo ustawiam ten pin na "0".
    Ale to chyba nie jest przyczyną tego problemu ?

    O co chodzi Waszym zdaniem ?
  • REKLAMA
  • #2 12332515
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • #3 12332552
    mpietras
    Poziom 17  
    nawiązując do wypowiedzi emarcus'a, "odwróć PWM'a" (COM01:0) i ustaw OCR0 na MAX pozbędziesz się wtedy szpilek
  • #4 12334173
    sundayman
    Poziom 26  
    No chyba coś robię nie tak, bo nie działa. Zrobiłem w ten sposób :

    Var_byte = Sfior
    Var_byte = Var_byte Or 128
    Sfior = Var_byte                                            ' ustawiam TSM na "1"
    
    Var_byte = Var_byte Or 2
    
    Sfior = Var_byte                                            ' wpisuję "1" do PSR0 - kasowanie preskalera
    
    
    ' *** TIMER0 JAKO PWM
    Ocr0 = 0
    Tccr0 = &B01101010                                          'timer0 in fast pwm mode, prescale = 8      10kHz
    Ocr0 = 0
    
    Var_byte = Sfior
    Var_byte = Var_byte And 127                                 ' ustawiam TSM na "0"
    Sfior = Var_byte


    i niestety nadal jest źle.

    *****

    Spróbowałem jeszcze tuż przed uruchomieniem PWM po prostu skasować preskaler wpisując "1" do PSR0, ale to nic nie daje. Może coś jest nie tak z tym rejestrem pod Bascomem ? Jak wpisać do rejestru bezpośrednio (nie używając zmiennej SFIOR w Bascomie)

    *****

    Problem co prawda stał się teoretyczny, bo okazało się, że w praktyce ten impuls na początku nic nie zmienia (w sensie - nie pogarsza pracy urządzenia).
    Niemniej dobrze by było wiedzieć, jak uniknąć tego rozsynchronizowania....
REKLAMA