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

[Atmega32][C] Jak używać dwóch źródeł przerwań na raz?

timtheenchanter 20 Sie 2011 17:03 1032 2
REKLAMA
  • #1 9844482
    timtheenchanter
    Poziom 10  
    Witam,
    w moim programie na atmegę 32 wykorzystałem timer0 oparty na zegarze procesora (8MHz) aby uruchamiać pewną funkcję ok. 100 razy na sekundę. Do programu postanowiłem dodać obsługę zewnętrznego kwarcu zegarkowego 32768Hz aby móc mierzyć w miarę dokładnie czas przy użyciu timera timer2. Po dopisaniu komend do obsługi kwarcu żaden timer nie działa. Po wykomentowaniu linii "TIMSK = 0x01;" timer2 zaczął działać ale timer0 nie działa nadal.
    Czy w ogóle możliwe jest użycie dwóch timerów na raz? Czy użycie kwarcu nie wpłynie negatywnie na prędkość działania programu?
    Oto kod programu:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Będę wdzięczny za jakiekolwiek sugestie.
  • REKLAMA
  • #2 9844496
    Fredy
    Poziom 27  
    Nie wolno ci w przerwaniu wywoływać takich ciężkich funkcji jak obsługa LCD. To trwa stanowczo za długo i blokuje ci inne przerwania.
    Przerób program tak, aby w przerwaniu miał tylko ustawianie flag. Resztę robisz w programie głównym.
    Drugi poważny błąd to jest taki że zmienna cstimer1 nie jest volatile.
  • #3 9844530
    timtheenchanter
    Poziom 10  
    Wywołanie LCD jest tylko w ramach sprawdzenia co się dzieje. W programie przerwanie będzie tylko zwiększać wartość jednej zmiennej.
    Żona zwróciła mi uwagę na rejestr TIMSK, którego wartość mam zdefiniowaną dwukrotnie.
    Zsumowałem wartości dla timerów 0 i 2 i zaczęło działać.
    Niniejszym zamykam wątek.
REKLAMA