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

[atmega8] [atmega8][c] - Timer0 nie zmienia wartości zmiennych licznik i czas

siwy2411 19 Gru 2012 23:13 1275 4
REKLAMA
  • #1 11675122
    siwy2411
    Poziom 11  
    Witam.

    W załączeniu kod - problem polega na tym, że w programie nigdy nie następuje zmiana wartości zmiennej "licznik", a co za tym idzie - również zmiennej "czas". Przerwanie timera drugiego działa bez zarzutu (obsługuje ono multipleksowanie wyświetlacza 4 cyfrowego wyświetlacza 7 segmentowego, który ma wyświetlać czas), jednak mam wrażenie że przerwanie timera zerowego w ogóle sie nie wykonuje... Co tu jest nie tak?

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • Pomocny post
    #2 11675160
    Fredy
    Poziom 27  
    Temat maglowany już chyba z 1000 razy - licznik ma być volatile
  • REKLAMA
  • Pomocny post
    #3 11675234
    dondu
    Moderator na urlopie...
    1. Do tego co napisał Fredy wyżej: http://mikrokontrolery.blogspot.com/2011/04/problemy-c-volatile.html

    2. Zmienną akt_wyswietlacz zdefiniuj sobie jako lokalną statyczną w funkcji przerwania.

    3. F_CPU definiuj w opcjach, a nie w kodzie: http://mikrokontrolery.blogspot.com/2011/03/fcpu-gcc-gdzie-definiowac.html

    4. W jakim celu zerujesz TCNT2 w przerwaniu od przepełnienia licznika?

    Cytat:
    Normal Mode The simplest mode of operation is the Normal mode (WGM21:0 = 0). In this mode the counting
    direction is always up (incrementing), and no counter clear is performed. The counter simply
    overruns when it passes its maximum 8-bit value (TOP = 0xFF) and then restarts from the bottom (0x00).
  • REKLAMA
  • #4 11675258
    BlueDraco
    Specjalista - Mikrokontrolery
    5. Stałe deklaruj jako stałe, a nie zmienne. Najlepiej dorzuć jeszcze atrybut PROGMEM, ale wtedy trzeba też zmienić odwołania do nich.
  • #5 11675378
    siwy2411
    Poziom 11  
    dondu napisał:
    3. F_CPU definiuj w opcjach, a nie w kodzie: http://mikrokontrolery.blogspot.com/2011/03/fcpu-gcc-gdzie-definiowac.html

    4. W jakim celu zerujesz TCNT2 w przerwaniu od przepełnienia licznika?


    ad 3. - w swoim kodzie mam tą linijkę zakomentowaną, ale źle skopiowałem
    ad 4. - z rozpędu, skopiowałem jej obsługę z timera zerowego i zmieniłem żeby miała wartość początkową zero nie zastanawiając się nad sensownością tego rozwiązania ;p

    a za volatile dziękuję - nie wiedziałem o tym, szczerze mówiąc.
    wszystko działa, więc zamykam
REKLAMA