Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Atmega8 - [C]Timer nie odlicza zadanej wartości

afterparty 19 Lut 2013 12:52 900 4
  • #1 19 Lut 2013 12:52
    afterparty
    Poziom 12  

    Cześć, właśnie próbuję opanować Timera0 w Atmedze8. Chciałem odmierzyć dokładnie jedną sekundę. Napiszę jak ja to widzę. Mikrokontroler pracuje na 12MHz. Użyłem preskalera 256, i mam 46875. A, że to duża liczba to podzieliłem przez 125, i dostaję 375. Czyli licznik musi 375 razy odliczyć 125 żebym dostał jedną sekundę.

    No to napisałem program:

    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    No i co? Stan Portu B zmienia się tak szybko, że diody na porcie wyglądają na stale świecące. Co tu jest nie tak?

    0 4
  • Pomocny post
    #2 19 Lut 2013 13:03
    Sparrowhawk
    Poziom 21  

    Zmienna licznik powinna być przy inicjalizacji poprzedzona słowem: volatile.

    0
  • Pomocny post
    #3 19 Lut 2013 13:20
    piotrva
    Moderator na urlopie...

    Poza tym to:

    Code:
    TCNT0 = 130;
    

    Powinna być pierwszą instrukcją w przerwaniu, a tak w ogóle polecam poczytanie o trybie CTC - nie będzie trzeba martwić się o ciągłe ładowanie wartości timera.
    EDIT:
    A problemem właściwym jest nadmiarowy średnik, o tu:
    Code:

     if(licznik == 375);

    jak go wywalisz to będzie w miarę OK.

    A zmienna nie musi być w tej sytuacji volatile, bo nie ma do niej odwołań w innych miejscach poza przerwaniem.
    Może być zadeklarowana nawet wewnątrz przerwania z atrybutem static.

    0
  • Pomocny post
    #4 19 Lut 2013 14:12
    BlueDraco
    Specjalista - Mikrokontrolery

    Przy takim trybie pracy timera (zamiast sugerowanego przez piotrva CTC) Twój zegarek będie się zawsze późnił, bo od zgłoszenia przerwania do przeładowania timera zawsze upłynie pewien czas, w dodatku nie zawsze taki sam. To nie jest dobry sposób na dokładne odmierzanie czasu.

    0
  • #5 19 Lut 2013 14:47
    afterparty
    Poziom 12  

    Faktycznie, problemem był średnik, teraz wszystko działa.
    Dzięki wszystkim, idę poczytać o volatile i tym trybie CTC.

    0