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] - timer0 odlicza 100 razy za szybko

bercik999 21 Lip 2013 23:20 987 8
  • #1 21 Lip 2013 23:20
    bercik999
    Poziom 10  

    Moim celem było aby mikrokontroler odliczał w górę co sekundę i wynik pokazywał na wyświetlaczu - pierwsze podejście do timer0. Początkowo sam obliczyłem wartości preskalera dla 8MHz, jednak na wyświetlaczu liczby pojawiały się ok 100 razy za szybko. Zastąpiłem swoje obliczenia tymi z tej strony: http://www.robotyka.net.pl/mikrokontrolery-avr-czesc-6-timer0/ jednak nie rozwiązało to problemu. Próbowałem linijkę

    Kod: c
    Zaloguj się, aby zobaczyć kod
    zamienić na
    Kod: c
    Zaloguj się, aby zobaczyć kod
    nic to jednak nie zmienia. Poniżej cały kod programu:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    [atmega8][C] - timer0 odlicza 100 razy za szybko
    fusebity w użytej atmedze.

    0 8
  • #2 21 Lip 2013 23:46
    Mol
    Poziom 30  

    Nie znam się na C , ale w linijce
    #define F_CPU 1000000
    nie musisz czasem wpisać , że to ma być 8MHz

    0
  • #3 21 Lip 2013 23:49
    bercik999
    Poziom 10  

    Początkowo było dla 8MHz, teraz procesor działa na 1MHz więc ta linijka jest w porządku.

    0
  • Pomocny post
    #4 22 Lip 2013 00:26
    mickpr
    Poziom 39  

    Nie chcę grać roli lokalnego guru (zwłaszcza korzystającego z cudzych stron WWW),, ale widzę następujące błędy:
    F_CPU nie defniuje się w kodzie -> http://mikrokontrolery.blogspot.com/2011/03/fcpu-gcc-gdzie-definiowac.html
    Twoje zmienne używane w przerwaniu powinny być volatile ->
    http://mikrokontrolery.blogspot.com/2011/04/problemy-c-volatile.html

    Nie napisałeś czy włączyłeś optymalizację.
    O timerach możesz poczytać tutaj: -> http://mikrokontrolery.blogspot.com/2011/03/led-sterowany-przez-timer.html
    Tutaj masz kalkulator: http://www.et06.dk/atmega_timers/

    0
  • #5 22 Lip 2013 01:24
    bercik999
    Poziom 10  

    Cytat:
    Twoje zmienne używane w przerwaniu powinny być volatile ->
    http://mikrokontrolery.blogspot.com/2011/04/problemy-c-volatile.html


    Próbowałem z volatile, nic nie zmieniło, czytałem o tym tutaj: http://mirekk36.blogspot.com/2011/08/test.html

    Cytat:
    Pokaż stan fusebitu CKDIV8 - nie wiadomo z jaką częstotliwością chodzi MCU! Wcale nie musi być to 1MHz - jak sądzisz.
    Nie napisałeś czy włączyłeś optymalizację.

    Atmega8 nie ma takiego fusebitu

    Cytat:
    Nie napisałeś czy włączyłeś optymalizację.

    Była włączona, próbowałem teraz wyłączyć, bez zmian.

    Za stronę o timerach dzięki wielkie, postaram się jeszcze coś z niej wyciągnąć, z kalkulatora również.

    F_CPU też już jest gdzie powinno.

    0
  • #6 22 Lip 2013 01:36
    mickpr
    Poziom 39  

    Volatile musi być. Inaczej wartości zmiennych nie są przechowywane między wywołaniami przerwania - a to w twoim przypadku prowadzi do błędu.

    0
  • Pomocny post
    #7 22 Lip 2013 05:17
    zumek
    Poziom 39  

    bercik999 napisał:
    ...jednak na wyświetlaczu liczby pojawiały się ok 100 razy za szybko.

    Raczej 125 razy za szybko.

    Winowajca ukrył się, w tej oto linii:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • Pomocny post
    #8 22 Lip 2013 09:35
    tronics
    Poziom 36  

    Średnik za IFem :) Kompilator traktuje to jak koniec warunku. Czy nie masz włączonych warningów? U mnie od razu taka konstrukcja wyrzuca warning dzięki -Wempty-body

    0
  • #9 22 Lip 2013 11:32
    bercik999
    Poziom 10  

    Tak, chodziło właśnie o ten średnik za if :D dopiero się przesiadłem na C i nie byłem sam w stanie zauważyć błędu. Dziękuje wszystkim.

    0