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

Atmega8 - Timer1 częstotliwość obliczona a realna

nanab 13 Lip 2013 11:19 1404 13
  • #1 12516235
    nanab
    Poziom 27  
    Mam problem z przerwaniem od timer1, wywołuje się ok. 64x wolniej niż wynika z obliczeń.
    Przykładowy prosty program:
    Kod: text
    Zaloguj się, aby zobaczyć kod


    Fusebity ustawione na wewnętrzny generator 8MHz, prescaler = 8, ładuję do licznika 1000 więc 8000000:8:1000=1000 czyli przerwanie powinno być wywołane co 1ms. Co 1s powinna zostać wyświetlona na lcd wartość "A". W rzeczywistości to dzieje się co ok. 65 sekund
  • #3 12516260
    Konto nie istnieje
    Poziom 1  
  • #4 12516295
    zabex
    Poziom 22  
    Przy kwarcu 8MHz i danych trwa to 279ms. Kalkulatory dostępne są online.
  • #5 12516348
    nanab
    Poziom 27  
    Zaznaczone błędy poprawiłem-bez zmian.
    zabex napisał:
    Przy kwarcu 8MHz i danych trwa to 279ms. Kalkulatory dostępne są online.

    "To" czyli samo przerwanie czy cały cykl programu rzem z wyświetleniem zmiennej na lcd? Poza tym te 279ms nijak nie pasuje do tego 64x spowolnienia.
  • #6 12516357
    zabex
    Poziom 22  
    Że co? co to jest "rzem"?
    Poczytaj kolego ile czasu zajmują jakie instrukcje a będziesz w stanie to wyliczyć. Dostęp do AVR jest spory także warto poczytać.
  • #7 12516423
    nanab
    Poziom 27  
    "Razem"
    Spowolnienie nie jest spowodowane przez obsługę lcd. Wywaliłem całkiem lcd, zamiast niego dałem toggle port(na wykonanie tej instrukcji chyba potrzeba mniej niż kilka tysięcy cykli?).
    Pętlę zmieniłem na taką:
    Kod: text
    Zaloguj się, aby zobaczyć kod

    Stan portu zmienia się co ok 64 sekundy.
  • #9 12516495
    nanab
    Poziom 27  
    Zmieniłem na if 1ms>999 then ...

    Bez zmian.
    Może uszkodzony procek?
  • Pomocny post
    #10 12516511
    Konto nie istnieje
    Poziom 1  
  • #11 12516533
    piotrva
    VIP Zasłużony dla elektroda
    nanab napisał:
    Może uszkodzony procek?

    Takich rewelacji bym się nie spodziewał ;) Atmega8 jest już zbyt znanym procesorem, żeby tak podstawowy błąd umknął komuś ;)
  • #12 12516601
    nanab
    Poziom 27  
    atom1477 napisał:
    A zmieniłeś Timer na Timer1?
    Przecież bez tej zmiany Timer nie jest ładowany i zlicza nie 1000 lecz 65536 cykli.
    Co daje właśnie około 64-krotne spowolnienie.

    Zmieniłem i nie pomogło, ale to dobry trop. Zauważyłem ze niezaleznie jaką wartość wysyłam do timera, 10, 1000 czy 10000 zawsze przerwanie występuje po takim samym czasie.Problem jest chyba gdzieś przy wpisywaniu wartości do rejestru timera. Próbowałem zmienić load timer1 1000 na timer1=1000 ale też bez zmian.
    EDIT:
    problem rozwiązany i okazał się być głupim drobiazgiem. Zapomniałem, że timer1 zlicza w górę a nie w dół więc zamiast odliczyć 1000 cykli odlicza 16 bitów minus 1000 cykli co odpowiada tym ~64000 cykli. Dziękuje za pomoc :)
  • #13 12516610
    Konto nie istnieje
    Poziom 1  
  • #14 12516625
    nanab
    Poziom 27  
    Problem rozwiązany.
REKLAMA