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] [BASCOM] problem z kwarcem czy cos nie rozumiem

marciu11 01 Sie 2008 00:23 1518 2
REKLAMA
  • #1 5397338
    marciu11
    Poziom 15  
    Witam
    Staram się zrobić odliczanie na przerwaniach - jak do tej pory nie używałem jeszcze przerwań, więc proszę o wyrozumiałość za banalne pytanie.

    A więc tak. Potrzebuję za pomocą Timera0 wprowadzić diodę w pulsację z częstotliwością 10Hz (to tak dla testu)
    Wszystko wydaje się w miarę proste. Skonfigurować T0 i przerwanie na ten zegar.
    A więc mam tak:

    
    $regfile "m8def.dat"
    $crystal = 8000000
    ...
    Config Timer0 = Timer , Prescale = 1024
    Load Timer0 = 78
    On Timer0 Klik
    Enable Interrupts
    Enable Timer0
    
    ....
    
    Klik:
    Incr Y
    If Y = 10 Then
         Set Portd.7
         Waitms 2
         Reset Portd.7
         Y = 0
    End If
    
    Load Timer0 = 78
    
    Return
    


    Analizując konfiguruję Timer0 z preskalerem 1024. Ładuję licznik wartością początkową 78. W momencie wystąpienia przerwania w podprogranie zwiększam wartość licznika Y i gdy ten osiągnie wartość 10 na 2ms zapalam diodę.

    Teraz licząc to dla zastosowanego kwarcu 8MHz: 8000000/1024/78/10 daje częstotliwość 10Hz (w przyblizeniu) więc o to mi chodzi.
    A przynajmniej taki podział rozumuję z helpa do Bascoma i konfiguracji timera.
    Niestety moja dioda "mruga" w przybliżeniu z częstotliwością 3Hz a nie 10...

    Proszę o zerknięcie mądrym okiem i ewentualną korektę mojej wiedzy na temat obliczania Timerów i ich przerwań.

    A może kwarc jest jakiś trefny i przez to źle Timer jest taktowany?

    MarCiu
  • REKLAMA
  • #2 5397402
    Dr.Vee
    VIP Zasłużony dla elektroda
    Witam,

    Musisz przeładowywać timer zaraz zgłoszeniu przerwania, wtedy błąd jest najmniejszy. W Twoim przypadku najpierw zmieniasz stan portów, później czekasz i w końcu ładujesz timer - w tym czasie timer też liczy, a więc pomiar czasu jest niedokładny. "Wyższa szkoła jazdy" to odjęcie od wartości ładowanej do timera czasu, który upływa między zgłoszeniem przerwania a przeładowaniem licznika. A najlepiej używać timera w trybie CTC, jeśli Twoj AVR go obsługuje, wtedy przeładowuje się sam.

    Druga rzecz - po co używasz Wait w przerwaniu? Normalnie obsługa przerwania powinna być jak najkrótsza (przerwanie - przerywa wykonanie głównego programu). Możesz np. normalnie resetować diodę, a przy Y = 10 ją ustawiać.

    No i po trzecie - jesteś pewien, że układ działa na 8 MHz? Domyślne ustawienie fuse bitów w ATmega8 powoduje pracę z wewnętrznym oscylatorem 1MHz.

    Pozdrawiam,
    Dr.Vee
  • #3 5397528
    crazy_phisic
    VIP Zasłużony dla elektroda
    Jesteś pewien że powinieneś ładować do Timera0 wartość 78? Przecież Timer będzie zliczał od tej wartości do TOP (255) i otrzymujemy nie 78 a 177 co daje częstotliwość ~ 4Hz.
REKLAMA