10 ms Interrupt mit 8bit Timer

Gast #2718971
Lesenswert?

Hallo Leute,

ich möchte mit dem 8bit Timer jeweils einen Interrupt nach 10 ms 
erzeugen.
Als µC verwende ich den AtMega644p mit 14.745600 MHz Quarz.

Ich muss den TCNT0 mit einem bestimmten Wert vorladen.

Folgende Rechnung habe ich gemacht : 14745600 / (1024 * 144) = 100
Das heißt, dass ich einen 1024 Prescaller und eine Zähldauer von 144 
Takten brauche.

Somit muss ich doch das TCNT0 Register auf ( 256-144)-1 = 111 vorladen, 
oder?


Wenn ich mir aber im Entprell-Artikel 
(http://www.mikrocontroller.net/articles/Entprellung) die Formel TCNT0 = 
(uint8_t)(int16_t)-(F_CPU / 1024 * 10e-3 + 0.5);  // preload for 10ms

anschaue, dann erhalte ich für TCNT0 = 112 und nicht 111, wie ich es bei 
meiner Rechnung erhalten habe.
Gast #2719083
Lesenswert?

Ich habe jetzt versucht den CTC Modus zum Laufen zu bekommen.

Laut der Formel im atmega644p Datenblatt müsste ich OCR0A = 71 stellen.
Leider geht meine Uhrzeit, die mit dem 10 ms Interrupt gesteuert wird, 
viel zu schnell ( doppelt so schnell wie nötig).

Woran kann das liegen?

Jetzt habe ich die Formel :  f =  Xtal / (2*1024 *(1+OCR0A )) abgeändert 
auf

f =  Xtal / (1024 *(1+OCR0A ))

und erhalte OCR0A = 143 ;

Damit geht die Uhrzeit jetzt sehr genau.

Stimmt die Formel aus dem Datenblatt nicht?



ISR(TIMER0_COMPA_vect)             // Timer0 Compare Interrupt, 8bit, 
10ms
{
  Zeit++;

}

  TCCR0A = (1<<WGM01);          //CTC Mode
  TCCR0B = (1<<CS02)|(1<<CS00);         // divide by 1024
    OCR0A = 143 ;            // preload for 10ms
    TIMSK0 |= (1<<OCIE0A);                // enable timer interrupt

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren