Versuche gerade mit hilfe einens Uhrenquarz 6,5536MHz meinen Timer 1 von meinem Atmega644 zum laufen zu bekommen. Doch leider ergebnislos. void timer1_init() { OCR1A = 6400; // Vergleichswert setzen TCCR1A = 0; // Modus einstellen, Clear Timer on Compare-Mode TCCR1B = (1<<CS12) |(1<<CS10) | (1<<WGM12); //Teiler und Modus einstellen, Teiler 1024 //CTC-Mode (Clear Timer on Compare-Mode) TIMSK0 |= (1<< OCIE1A);// Interrupt zulassen bei TIMER1 }
ISR (TIMER1_OVF_vect) { sei(); sekunden++; if(sekunden == 60) { minuten++; sekunden = 0; } if(minuten == 60) { stunden++; minuten = 0; } if(stunden == 24) { stunden = 0; } if((stunden==23)&(minuten==59)&(sekunden==59)) { speichern = 1; } }
VON THRON schrieb: > sei(); Das gehört bei dir nicht in den Timerinterrupt, das gehört zur Initialisierung. Außerdem passt das > ISR (TIMER1_OVF_vect) und das > TIMSK0 |= (1<< OCIE1A);// Interrupt zulassen bei TIMER1 nicht zusammen. (Overflow ungleich Compare)
Im übrigen must du nicht das Timer Mask Register "0" setzen/beschreiben/definieren, sonder das des Timer "1"!
Floh schrieb: > Außerdem passt das >> ISR (TIMER1_OVF_vect) > und das >> TIMSK0 |= (1<< OCIE1A);// Interrupt zulassen bei TIMER1 > > nicht zusammen. (Overflow ungleich Compare) ??? Kapier ich gerade nicht. Admax schrieb: > Im übrigen must du nicht das Timer Mask Register "0" > setzen/beschreiben/definieren, sonder das des Timer "1"! Danke war ein Tipfehler!
VON THRON schrieb: > Kapier ich gerade nicht. Du aktivierst einen OutputCompare-Interrupt (OCIExx), definierst dir aber einen Overflow Interrupt. Das sind zwei verschiedene Sachen. Zeig doch dein Programm mal ganz (als Anhang).
volatile unsigned char sekunden = 0; volatile unsigned char minuten = 0; volatile unsigned char stunden = 0; void timer1_init() { sei(); OCR1A = 6400; TCCR1A = 0; TCCR1B = (1<<CS12) |(1<<CS10);// | (1<<WGM12); TIMSK1 |= (1<< OCIE1A); } ISR (TIMER1_OVF_vect) { sekunden++; if(sekunden == 60) { minuten++; sekunden = 0; } if(minuten == 60) { stunden++; minuten = 0; } if(stunden == 24) { stunden = 0; } if((stunden==23)&(minuten==59)&(sekunden==59)) { speichern = 1; } }
Ich wiederhole mich :-) > Du aktivierst einen OutputCompare-Interrupt (OCIExx), definierst dir > aber einen Overflow Interrupt. Das sind zwei verschiedene Sachen. Ändere mal deinen Interruptheader in ISR(TIMER1_COMPA_vect) Hoffe es ist richtig geschrieben, ansosnten kommt "misspelled interrupthandler".
Ja danke Flo das passt alles einwandfrei! jetzt zählt er schonmal nur noch net richtig! ;) 6553600/1024*1 das is doch die Formel oder?
VON THRON schrieb: > Ja danke Flo das passt alles einwandfrei! jetzt zählt er schonmal nur > noch net richtig! ;) > > 6553600/1024*1 das is doch die Formel oder? Einfach überlegen, wie der Timer arbeitet; wann daher welcher Interrupt kommt.
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.