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.
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
Ich möchte ja kein PWM betreiben, sondern nur den Timer Overflow Interrupt benutzen.
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.
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.