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.