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

[AVR] Błąd w opisie trybu prostego timera w książce: Język C dla uC AVR

Bambzo 07 Lip 2012 23:19 2426 11
  • #1 11082419
    Bambzo
    Poziom 12  
    Czytam sobie w wolnych chwilach książkę "Język C dla mikrokontrolerów AVR". Dotarłem dzisiaj do rozdziału opisującego tryb prosty timerów i albo ja czegoś nie rozumiem, albo jest w książce błąd. Otóż autor opisując możliwość automatycznego generowania przebiegów na liniach OC1A i OC1B w tym trybie pisze, że:

    "Wykorzystanie zdarzenia Compare Match umożliwia także łatwą zmianę współczynnika wypełnienia przebiegu. W tym celu wystarczy zmienić wartości jakimi są zainicjowane rejestry OCR1A i OCR1B. Stosunek wartości tych rejestrów do stałej 65536 określa współczynnik wypełnienia"

    Przecież w trybie prostym timerów linie wyjściowe zmieniają stan tylko przy stanie zgodności licznika i rejestrów OCRxA. Licznik zaś zawsze liczy do wartości max 65536 i wtedy i tylko wtedy się zeruje. Tak więc zmieniając wartość rejestrów OCR1A i OCR1B możemy wpływać tylko na czas pierwszego porównania i tym samym pierwszej zmiany stanu na liniach OC1A i OC1B. Kolejne zmiany będą juz następowały zawsze po odliczeniu 65536 tików. Tak więc przebieg wyjściowy będzie miał stałe wypełnienie niezależnie od tego co wpiszemy do OCR1A i OCR1B. Tak mi się przynajmniej wydaje.
  • #2 11082477
    Fredy
    Poziom 27  
    Jeśłi wpiszesz w OC1A dajmy na to wartość 1 to niemal od razy zmieni się stan na wyjściu OCR1A i będzie to trwało długo, bo aż dopóki nie powróci do wartości mniejszej niz 1. Wtedy współczynynnik wypełnienia będzie bardzo mały, równy w przybliżeniu 1/65000, czyli prawie zerowe.
    Zupełnie odwrotnie będzie, gdy wpiszesz tam np 65530 . Wtedy timer będzie musiał doliczyć aż do 65530 aby zmienić stan , i stan ten będzie trwał b.krótko. W tym przypadku wypełnienie będzie bliskie jedności.

    Zatem chyba widzisz że wypełnienie będzie się zmieniać tak jak pisze autor. ksiązki.
  • #3 11082505
    Bambzo
    Poziom 12  
    O tym właśnie piszę - że to zadziała tylko pierwszy raz po zmianie wartości rejestru komparacyjnego. Jeżeli licznik będzie potem pracował w dalszym ciągu to kolejne zmiany na wyjściu będą już następowały zawsze w momencie komparacji czyli zawsze co 65536 tików licznika. Tak więc czy możemy mówić o zmianie współczynnika przebiegu ????
  • #4 11082507
    Fredy
    Poziom 27  
    opisałem ci 2 skrajne przypadki.
    W jednym masz wypełnienie prawie 0 w drugim prawie 1.
    Czy nadal nie widzisz wpływu wpisanej wartości w rejestr OC1 na wsp. wypełnienia?
  • #5 11082585
    Bambzo
    Poziom 12  
    Nie rozumiemy się. Może opisze to inaczej:

    - Wpisujemy do OC1A np. 10
    - Ustawiamy na wyjściu stan H
    - Startujemy Licznik (ustawiony tak aby przy każdej komparacji zmieniał stan wyjścia na przeciwny )
    - Licznik po doliczeniu do 10 zmienia stan wyjścia na L
    - Licznik liczy do maximum czyli do 65536 (cały czas mamy na wyjściu L) i się zeruje
    - po doliczeniu do 10 licznik zmienia stan na H
    - licznik liczy do maximum (cały czas mamy na wyjściu H) i się zeruje
    - po doliczeniu do 10 licznik zmienia stan na L
    - itd itd - stan wyjścia zmienia się faktycznie co 65536 (w momentach kiedy wartość licznika zrówna się z OC1A =10)

    Tak naprawdę nie mamy tutaj CIĄGŁEJ zmiany wypełnienia przebiegu bo stan wyjścia zmienia się (za wyjątkiem pierwszej iteracji) co 65536. Za pierwszym razem zmienił się co prawda po 10 ale potem już zawsze co 65536.
  • #6 11082612
    piotrva
    VIP Zasłużony dla elektroda
    A sprawdziłeś to chociaż? Czy tylko teoretyzujesz?
    Bo jeśli to pierwsze to coś robisz źle, a jeśli to drugie to weź procesor i.sprawdź.
    Bo działa to.inaczej niż piszesz.
    1. Mamy początkowo stan H
    2. Ocr ustawiony na 1000
    3. Licznik zlicza do 1000 i zmienia na L
    4. Licznik zlicza do 65535, następuje przepelnienie i mamy w Tcnt1 0. Jednocześnie, o tym zapominasz, licznik znów przelacza wyjście na H i zaczynamy od 1.
    Myślę że to kończy temat, jeśli nie jesteś przekonany odsyłam do rozdziału o timerach z datasheetu dowolnego AVR z kanałami PWM. Masz nawet tam, o ile dobrze pamiętam, ładne rysunki, a jeśli nie to tekst wszystko wyjaśnia...
  • #7 11082627
    Bambzo
    Poziom 12  
    Tak sprawdzę to dokładnie jutro, ale jeśli jest tak jak piszesz to błąd jest w książce kilka linijek wcześniej:

    "..... timer potrafi bezpośrednio sterować dedykowanymi wyjściami uP. W tym celu należy odpowiednio skonfigurować bity COMn. W tym trybie pojawia się jednak problem - stan wyjść może się zmieniać wyłącznie w wyniku zdarzenia Compare Match, natomiast przepełnienie nie ma na nie (tzn na wyjście) wpływu."

    Wynika z tego jasno że wyjście uP w "trybie prostym" (nie w "trybie PWM") gdy jest ono zmieniane hardwer'owo (tzn po konfiguracji bitów COMn) zmieniać się może tylko w momentach komparacji.

    Tak więc gdzieś jest niedomówienie. Sprawdzę to jutro na symulatorze bo nie mam w domu JTAG'a.

    P.S. Tych pięknych obrazków w datasheet'cie nie ma w opisie trybu prostego. Są tylko dla trybów CTC i PWM :)
  • #8 11082758
    piotrva
    VIP Zasłużony dla elektroda
    Moment, moment, coś jest nie tak, tak jak ja pisałem dziala tryb PWM. A tu rzeczywiście hmm... Coś jest dziwnego... Zwracam honor... Sam muszę to jutro wrzucić na układ.
  • #9 11085680
    Bambzo
    Poziom 12  
    Aby zakończyć już temat - sprawdziłem zachowanie timera w trybie prostym (podkreślam nie w trybie CTC lub PWM ale PROSTYM) w symulatorze. Wszytko jest zgodne z tym co pisałem w poprzednich postach. Reasumując w książce jest błąd. Errata mogłaby wyglądać następująco:

    strona 314, wiersz 20 od góry
    Jest: W efekcie diody będą migać dwukrotnie szybciej....
    Powinno być: Diody (po starcie programu) pierwszy raz zmienią stan 2 razy szybciej niż w poprzednim przykładzie a potem będą mrugały z taką samą częstotliwością

    strona 314, wiersz 9 od dołu
    Jest: Wykorzystanie zdarzenia Compare .....
    Powinno być: (Należałoby usunąć cały akapit bo to co jest w nim napisane nie jest prawdą)

    Pozdrawiam i przepraszam za dociekliwość. Lubię po prostu gdy wszytko jest jasne. :):)
  • #11 11087515
    tmf
    VIP Zasłużony dla elektroda
    Dziękuję za znalezienie błędu. Oczywiście timery zachowują się tak jak piszesz w tym trybie. Cały problem wynika z tego, że w tym rozdziale błędnie jest napisane, że przykład jest z rozdziału 18 - powinien być z rozdziału 14, str. 272 - sterowanie jasnością wyświetlacza LED. Chodzi o to, że uzyskanie PWM wymaga programowej zmiany stanu wyjść związanych z pinami OCx w przerwaniu nadmiaru timera (druga zmiana związana z compare match jest realizowana sprzętowo). Dzięki temu można uzyskać przebieg PWM o okresie zależnym od rejestru OCRnx. Oczywiście normalnie jest to skrajnie nieefektywne, gdyż wymaga obsługi przerwań i lepiej wykorzystać tryb PWM, lecz w pewnych sytuacjach (np. pokazanego sterowania LEDami) jest to rozwiązanie pożądane. Także nie tyle należałoby usunąć ten fragment, co dodać zdanie wyjaśniające do czego on się odnosi.
    Pozdrawiam i oczywiście jeśli miałbyś jakiś problem to z przyjemnością ci pomogę. Jako, że jesteś pierwszą osobą, która znalazła ten problem, więc jako nagrodę mogę ci zaoferować np. rabat przy zakupie w przyszłości książki o XMEGA (która za jakiś czas się ukaże). Jeśli byłbyś zainteresowany to wyślij mi PW.
  • #12 11334753
    Bambzo
    Poziom 12  
    Dzięki :) Dzięki :) Dzięki :)
REKLAMA