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

[ATmega88PA] [ATmega88PA][C] - Timer0 w trybie CTC blokuje pętlę główną, LED na PC0 nie działa

GanzConrad 04 Paź 2014 11:43 1233 6
REKLAMA
  • #1 14013540
    GanzConrad
    Poziom 25  
    Posty: 934
    Pomógł: 67
    Ocena: 203
    Witam,
    Robiłem to kilkanaście razy na innych procesorach, a nie mogę zrobić na ATmega88PA.
    link do DSa:
    http://www.atmel.com/images/Atmel-8271-8-bit-...PA-168A-168PA-328-328P_datasheet_Complete.pdf
    opis rejestrów TIMER0 na stronie 105

    Timer1 i Timer2 mam ustawione w trybie PWM i działają bez zarzutu. Walczę już 2 dzień i nie rozumiem pewnych mechanizmów. - włączenie Timera0 powoduje, że pętla główna nie działa...
    Do portu PC0 (TQFP32) mam podłączoną diodę LED.
    Zegar 1MHz (wewnętrzny oscylator 8MHz i włączony fusebit "CKDIV8", który dzieli przez 8)
    Częstotliwości PWM i wypełnienia sprawdzałem oscyloskopem i działają poprawnie.
    poniższy kod działa jak powinien:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    na porcie PC0 mam prostokąt 100Hz
    na PB1 dioda się rozjaśnia i gaśnie i tak w kółko:
    [ATmega88PA] [ATmega88PA][C] - Timer0 w trybie CTC blokuje pętlę główną, LED na PC0 nie działa

    natomiast gdy dodam init TIMER0 i obsługę przerwania,
    na porcie PC0 (White_LED) nie mam nic, a na dodatek rozjaśnianie PWM na PB1 (OCR1A) przestaje działać (LED świeci się ciągle):

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

    Jakieś pomysły?
  • REKLAMA
  • Pomocny post
    #2 14013565
    dondu
    VIP Zasłużony dla elektroda
    Posty: 13906
    Pomógł: 1292
    Ocena: 809
    Witam.

    Tak na szybko analizując kod: Dla Timer0 włączasz dwa przerwania od porównania:

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


    a funkcję obsługi masz tylko dla jednego z nich:

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

    Co się stanie w takim przypadku, skoro mają osobne wektory?:

    [ATmega88PA] [ATmega88PA][C] - Timer0 w trybie CTC blokuje pętlę główną, LED na PC0 nie działa
  • REKLAMA
  • #3 14014081
    GanzConrad
    Poziom 25  
    Posty: 934
    Pomógł: 67
    Ocena: 203
    dzięki dondu, działa.
    dondu napisał:
    Co się stanie w takim przypadku

    nie wiem...przynajmniej nie do końca. Jak już zwróciłeś na to uwagę to domyślam się, że wystąpi przerwanie, program wykona skok do adresu wektora przerwania, w którym powinna być funkcja jego obsługi, ale jej tam nie będzie, więc... co dalej?
    Domyślam się też, że prolog i epilog funkcji przerwania (razem z instrukcją RET) jest generowany przez kompilator i nie zostanie wygenerowany, jeśli takiej funkcji nie ma w kodzie?
  • REKLAMA
  • Pomocny post
    #4 14014166
    mi14chal
    Poziom 28  
    Posty: 1021
    Pomógł: 112
    Ocena: 23
    Jeżeli nie ma obsługi przerwania to nastąpi reset układu.
  • REKLAMA
  • Pomocny post
    #6 14016184
    dondu
    VIP Zasłużony dla elektroda
    Posty: 13906
    Pomógł: 1292
    Ocena: 809
    mi14chal napisał:
    Jeżeli nie ma obsługi przerwania to nastąpi reset układu.

    Dodać należy, że nie będzie to dokładnie reset taki jak w przypadku pinu RESET, czy włączenia zasilania. Będzie to jedynie skok do początku programu, co wynika z kodu przygotowanego przez kompilatora C. Tablica nieużywanych wektorów przerwań jest bowiem wypełniona skokami do __bad_interrupt, a tam jest skok do początku programu:

    Kod: text
    Zaloguj się, aby zobaczyć kod

Podsumowanie tematu

✨ W dyskusji poruszono problem z działaniem Timera0 w mikrokontrolerze ATmega88PA, który blokuje pętlę główną, co uniemożliwia działanie diody LED podłączonej do portu PC0. Użytkownik zauważył, że włączenie przerwań dla Timer0 bez odpowiedniej obsługi prowadzi do nieoczekiwanych zachowań, w tym do resetu układu. Ostatecznie, po wskazaniu błędów w kodzie, użytkownik zrozumiał, że brak funkcji obsługi przerwania skutkuje skokiem do początku programu, co nie jest równoważne z pełnym resetem.
REKLAMA