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

[ATMEGA8] [C] Ustawienie przerwania co 1 s

Maxe 30 Mar 2011 20:40 3924 13
  • #1 9342264
    Maxe
    Poziom 13  
    Witam.
    Chce aby przerwanie było wywoływane co 1s.
    Niestety dla:
    f=16Mhz
    Preskalera 1024
    Przerwanie jest wywoływane co więcej niż 1s...

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod



    Zaznaczone czasu kiedy występuje przerwanie:

    [ATMEGA8] [C] Ustawienie przerwania co 1 s



    Odpowiednikiem 1s jest 1 Hz...
    Ale nie działa to tak jak powinno, proszę o jakieś sugestie.
    Próbowałem też inny preskaler (256) przy częstotliwości 4 Mhz.. i dalej to samo..
  • Pomocny post
    #2 9342320
    rrytel
    Poziom 14  
    bierzesz pod uwagę nie to przerwanie.
    zobacz czasy dla TIMER/COUNTER1 OCR1A Compare Match
  • #3 9342343
    Maxe
    Poziom 13  
    Ale te czasy na wyżej załączonym screenie też są nieco większe o 1s..
  • #5 9342392
    Maxe
    Poziom 13  
    Ustawiam F_CPU w trzech miejscach.. W kompilatorze w opcjach projektru (uzywam AVR Studio 4), w pliku lcd.h - plik nagłowkowy wyświetlacza, i w Proteusie w opcjach Atmegi8.. w każdym z tych trzech miejsc ustawiam tą samą czestotliwość => 16 MHz, przy użyciu preskalera 1024.
  • Pomocny post
    #6 9342426
    dondu
    Moderator na urlopie...
    A może przyczyną jest nie wyzerowany licznik preskalera (strona 75):

    Cytat:
    Bit 0 PSR10: Prescaler Reset Timer/Counter1 and Timer/Counter0
    When this bit is written to one, the Timer/Counter1 and Timer/Counter0 prescaler will be reset.
    The bit will be cleared by hardware after the operation is performed. Writing a zero to this bit will have no effect. Note that Timer/Counter1 and Timer/Counter0 share the same prescaler and a reset of this prescaler will affect both timers. This bit will always be read as zero.
  • Pomocny post
    #7 9342451
    janbernat
    Poziom 38  
    Przy 16MHz, prescaler=256, początkowa wartość Timera1=3036 uzyskasz teoretycznie 1s.
    Można to oczywiście przeliczyć na wartość do wpisania do OCR1A.
    Z dokładnością do 6 miejsc po przecinku.
    Po czym poczytać o stabilności i dokładności kwarcu, o tym że jednak w tym przerwaniu coś trzeba zrobić, o prologu i epilogu wejścia w przerwanie i wtedy można sobie te całe obliczenia o kant d. potłuc.
  • #8 9342521
    Maxe
    Poziom 13  
    dondu napisał:
    A może przyczyną jest nie wyzerowany licznik preskalera (strona 75):

    Cytat:
    Bit 0 PSR10: Prescaler Reset Timer/Counter1 and Timer/Counter0
    When this bit is written to one, the Timer/Counter1 and Timer/Counter0 prescaler will be reset.
    The bit will be cleared by hardware after the operation is performed. Writing a zero to this bit will have no effect. Note that Timer/Counter1 and Timer/Counter0 share the same prescaler and a reset of this prescaler will affect both timers. This bit will always be read as zero.


    Spróbowałem tego rozwiązania wg. Twojej rady ale efekt taki sam jak na początku..
  • #12 9342750
    Maxe
    Poziom 13  
    No przecież! :) Dziękuję dondu kolejny raz za pomoc, to tutaj tkwił błąd.
  • #14 9448505
    Maxe
    Poziom 13  
    Problem rozwiązany :) Dzieki za pomoc
REKLAMA