Hallo Leute! Hab da ein kleines Problem. Ich will eine 7-Segment Stoppuhr programmieren, die den CTC Counter verwendet. Ein und ausgeschalten wird das ganze über den externen Interrupt INT0. Mit einem normalen Counter hat das ganze schon funktioniert. Allerdings war das viel zu ungenau. Also wollte ich es mit CTC versuchen. Das Problem: Beim Betätigen der Taste kommt er zwar in die ISR von INT0 aber startet den Timer nicht! Hier mal der relevante Code: ISR(INT0_vect) { if(OCIE1A) //Wenn timerinterrupt läuft { TIMSK= (0 << OCIE1A); //Timerinterrupt ausschalten }else { TIMSK= (1 << OCIE1A); //ansonsten Timerinterrupt einschalten } _delay_ms(20); //Schalterentprellen } int main (void) { //***************** // Initialisierung //***************** DDRB = 0xFF; //PORTB auf Ausgang setzen (7-Segmente) DDRC = 0xFF; //PORTC auf Ausgang für Segmentwahl //Interrupt konfigurieren MCUCR = (1<<ISC01); //Int0 auf fallende Flanke konfigurieren GICR = (1<<INT0); //Int0 aktivieren //Timer Configurerien OCR1A = 39999; TCCR1B=( 1 << WGM12 ) | ( 1 << CS10 ); TIMSK= (0 << OCIE1A); sei(); Was mach ich falsch? Grüße Markus
Evtl. könnten es die beiden Zeilen sein: TIMSK= (0 << OCIE1A); //Timerinterrupt ausschalten TIMSK= (1 << OCIE1A); //ansonsten Timerinterrupt einschalten Würd ich anders schreiben: TIMSK &= ~(1 << OCIE1A); //Timerinterrupt ausschalten TIMSK |= (1 << OCIE1A); //ansonsten Timerinterrupt einschalten Und ne delay hat in ner ISR nix zu suchen. Wird die ISR aufgerufen, während sie noch läuft, gibts Chaos. Ausserdem ist die Abfrage if(OCIE1A) immer wahr, da OCIE1A ein fester Wert ist und sich nie ändern wird.
Hallo! Aja vielen Dank für deine Antwort. Das delay wurde jetzt gelöscht - funktioniert auch ohne. Obwohl das TIMSK= (0 << OCIE1A); //Timerinterrupt ausschalten TIMSK= (1 << OCIE1A); //ansonsten Timerinterrupt einschalten funktioniert, hab ich es jetzt umgeschrieben auf deine Art. Und das if(OCIE1A) wurde jetzt auf if(TIMSK == 0b00010000) umgeändert. Jetzt klappt alles ganz toll! Vielen Dank für die Hilfe! Grüße Markus
limbo! schrieb: > Das delay wurde jetzt gelöscht - funktioniert auch ohne. > Obwohl das > TIMSK= (0 << OCIE1A); //Timerinterrupt ausschalten > TIMSK= (1 << OCIE1A); //ansonsten Timerinterrupt einschalten > > funktioniert, aber nur zufällig. Eine 0 kann man nach links schieben sooft man will, sie bleibt immer eine 0. > TIMSK= (0 << OCIE1A); //Timerinterrupt ausschalten ist also nichts anderes als TIMSK = 0; Dein Glück ist, dass du noch keine anderen BIts in TIMSK benutzt hast. > Und das if(OCIE1A) wurde jetzt auf if(TIMSK == 0b00010000) umgeändert. > Jetzt klappt alles ganz toll! Autsch. Weiter unten hast du das so schön geschrieben. Warum nicht hier? if( TIMSK & ( 1 << OCIE1A ) )
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.