Forum: Mikrocontroller und Digitale Elektronik 10 ms Interrupt mit 8bit Timer


von Interrupt (Gast)


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.

von Oliver J. (skriptkiddy)


Lesenswert?

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

Dafür nimmt man den CTC Modus.

Gruß Oliver

von Interrupt (Gast)


Lesenswert?

Ich möchte ja kein PWM betreiben, sondern nur den Timer Overflow 
Interrupt benutzen.

von Stefan E. (sternst)


Lesenswert?

Interrupt schrieb:
> Ich möchte ja kein PWM betreiben, sondern nur den Timer Overflow
> Interrupt benutzen.

CTC hat nichts mit PWM zu tun.
Also nimm den CTC-Modus und den Compare-Match-Interrupt. Das ist genau 
das, was du haben möchtest.

von Interrupt (Gast)


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

von Interrupt (Gast)


Lesenswert?

PS: Benutze AVR Studio 4.18

von Stefan E. (sternst)


Lesenswert?

Interrupt schrieb:
> Stimmt die Formel aus dem Datenblatt nicht?

Doch, aber man sollte natürlich auch genau lesen, was die Formel 
überhaupt angibt, nämlich die Frequenz an einem Pin, der im Interrupt 
getoggelt wird.

von Interrupt (Gast)


Lesenswert?

Ahhh mist, das habe ich verpennt. Ok, vielen Dank für deine Hilfe. Dann 
ist die Formel auch richtig.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.