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

Konfiguracja timera TCB0 w ATtiny3216 dla cyklicznego przerwania 100Hz

robiw 14 Paź 2021 14:30 486 14
  • #1 19655794
    robiw
    Poziom 26  
    Witajcie,
    Chciałem uruchomić cykliczne przerwanie (100Hz) od timera TB0 i robię coś nie tak, bo przerwanie nie jest wyzwalane. Mikrokontroler taktowany wewnętrznym RC 2.66MHz. Konfiguracja Timera:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Przerwanie:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    No i przerwanie nie jest wyzwalane. Próbowałem ustawiać rejestr EVCTRL i bit CAPTEI i też nie działa. Chyba tu czegoś nie rozumiem. Dokumentacja:

    https://ww1.microchip.com/downloads/en/DeviceDoc/ATtiny3216-17-DataSheet-DS40002205A.pdf

    Prośba o pomoc... robiw
  • #3 19655846
    robiw
    Poziom 26  
    Mikrokontroler taktowany jest 2.66MHz, więc jeśli TOP określimy na 26666 to przerwanie powinno być 100 razy na sekundę. R
  • #4 19655875
    excray
    Poziom 41  
    Nie włączyłeś globalnie przerwań. Poza tym brakuje pętli głównej w kodzie.
  • #5 19655893
    robiw
    Poziom 26  
    Włączyłem. Inne przerwania działają. Sorki, nie wklejalem całego kodu, bo nic tam nie ma oprócz testowego sprawdzania flagi w pętli while. R

    Dodano po 1 [minuty]:

    Ten tryb Periodic Interrupt jest bardzo niejasno opisany, bo przerwanie nazywa się Capture i raczej powinno się włączyć Capture timera. Włączone też nie działa. R
  • #6 19656025
    excray
    Poziom 41  
    A czemu go uruchamiasz w trybie Capture Mode, skoro z opisu wynika, że interesuje Cię Compare Mode?
  • #7 19656028
    robiw
    Poziom 26  
    Uruchamiam w trybie Periodic Interrupt (0x00)... R
  • #8 19656075
    excray
    Poziom 41  
    @robiw Pokaż resztę kodu. Ta część jest ok.
  • #10 19656345
    robiw
    Poziom 26  
    JarekC napisał:
    Jak jest zadeklarowana zmienna Flaga?


    Litości, to są podstawy 😉. Volatile... R

    Dodano po 5 [minuty]:

    excray napisał:
    @robiw Pokaż resztę kodu. Ta część jest ok.


    Jutro zamieszczę, jestem poza domem. Ale generalnie nie ma tam nic takiego: konfiguracja timera TB0 według zamieszczonego kodu (łącznie z przerwaniem), sei() oraz pętla główna, w której wyświetlam zmienną Flaga. Dam inkrementację zmiennej, bo co ciekawe przez bardzo drobną chwilę przerwania zachodzą i potem już nie. Dziwne... R
  • #11 19656367
    excray
    Poziom 41  
    robiw napisał:
    tro zamieszczę, jestem poza domem. Ale generalnie nie ma tam nic takiego: konfiguracja timera TB0 według zamieszczonego kodu (łącznie z przerwaniem)

    Jeśli to nie jest jakiś babol w stylu <żart>"zapomniałem podłączyć zasilanie", albo "w ustawieniach kompilatora miałem ATTINY13"</żart>, to na pewno tam coś jest - coś na pierwszy rzut oka nieoczywistego.
  • #12 19656394
    robiw
    Poziom 26  
    Co ciekawe mam pewne wątpliwości odnośnie dokumentacji. Timer TB0 uruchamiam w domyślnym trybie Periodic Interrupt mode, gdzie TOP określam wartością rejestru CCMP = 26666, co przy częstotliwości taktowania timera równej domyślnej częstotliwości taktowania mikrokontrolera 2.66MHz powinno dać przerwanie co ok. 10ms (100Hz). Co ciekawe jedynym przerwaniem dla tego timera (rejestr INTCTRL) jest przerwanie o nazwie Capture Interrupt. A gdzie jest Periodic? Dokumentacja opisująca tryb Periodic mówi z kolei "A CAPT interrupt and event is generated when the counter is equal to TOP". No, ale nie zachodzi... R

    Dodano po 7 [minuty]:

    excray napisał:
    to na pewno tam coś jest - coś na pierwszy rzut oka nieoczywistego


    No musi być, bo na początku przerwanie odpala się na chwilę, drobną chwilę, by przestać działać. A inne przerwania w tym czasie działają bez problemu... R
  • #14 19656431
    robiw
    Poziom 26  
    Tak, masz rację. Zauważyłem, że przez chwilę jest wyzwalane. W aplikacji mam jeszcze przerwanie z PORT_A wyzwalane zegarem RTC co 1s, ale w przerwaniu kasuje flagę, więc to nie to. Ogólnie program aplikacji działa poprawnie poza tym, że TB0 nie wyzwala przerwań na stałe. Jutro uproszczę na maksa aplikację i sprawdzę ponownie. Ale przyznać trzeba, że nazewnictwo w dokumentacji nie rozjaśnia sprawy... R
  • #15 19657602
    robiw
    Poziom 26  
    excray napisał:
    to na pewno tam coś jest - coś na pierwszy rzut oka nieoczywistego


    Tak dokładnie było... Babol... W projekcie używam jeszcze timera TCA0 do generowania przebiegu zasilającego buzzer (4Khz) w związku z czym w jednym z plików nagłówkowych było makro #define BEEP_OFF TCB0.CTRLA = 0.... właśnie TCB0...a powinno być TCA0. Pozostało tak, bo zmieniałem funkcje timerów...no i to makro wyłączało po chwili TCB0...stąd brak przerwań. Czułem, że coś musi być nie tak... Serdecznie dziękuję wszystkim za udział w dyskusji. Pozdrawiam... Robert

Podsumowanie tematu

Użytkownik próbował skonfigurować timer TCB0 w mikrokontrolerze ATtiny3216 do generowania cyklicznego przerwania o częstotliwości 100Hz, jednak przerwanie nie było wyzwalane. Po analizie kodu i dyskusji, zauważono, że problem mógł wynikać z niepoprawnej konfiguracji trybu przerwania oraz z błędów w kodzie, takich jak nieprawidłowe wywołanie makra, które wyłączało timer TCB0. Użytkownik potwierdził, że inne przerwania działają poprawnie, a po uproszczeniu aplikacji i poprawieniu błędów, przerwanie zaczęło działać. Wskazano również na niejasności w dokumentacji dotyczącej trybów pracy timera.
Podsumowanie wygenerowane przez model językowy.
REKLAMA