Hallo NG, ich verstehe folgendes Verhalten des Timer 1 nicht: Eine Routine, die definierte Verzögerungzeiten ermöglicht: übergeben werden prescaler und wert für compare register void T1_delay( u08 prescaler, u16 value ) // d = { // Timer 1 Timer register mit Werten laden // währenddessen Interrupts global sperren CLI(); OCR1A=value; TCNT1=0; TCCR1A=0; TCCR1B=prescaler; TCCR1B |=8; T1_Delay_Flag=FALSE; TIMSK |=1<<OCIE1A;TIFR = 1 <<OCF1A; SEI(); // Endlosschleife, bis Timer abgelaufen ist, INT-Routine setzt Flag neu ! while(T1_Delay_Flag==FALSE); // dann Timer aus TIMSK &= ~(1 << OCIE1A); } // Nach Ablauf der Zeit wird das Sperrflag rückgesetzt void TimerCompA_Int(void) { T1_Delay_Flag=TRUE; } Klappt sowohl mit CompReg. A. oder mit dem Timer Overflow CompReg. B geht aber nicht, es wird schlichtweg kein Comp-Int. B ausgelöst. Wo ist mein Denkfehler ? (µC ist ATMega 16!) Danke für Eure Hilfe, Gruss Thomas
Wozu überhaupt der Interrupt? Wenn du eh nur darauf wartest, kannst du auch genauso gut (oder eigentlich besser) einfach nur direkt auf das Interrupt-Flag warten.
Es geht mir nicht um die Lösung der Delay Routine, sondern um's Prinzip. Laut Handbuch müßten sich Comp-Reg. A und B gleich verhalten, das ist das Problem ! Gruß Thomas
Hi Mit 'TCCR1B |=8;' stellst du Timer-Mode 4 ein. OCR1A ist dann Top vom Timer. Bei Erreichen von OCR1A wird der Timer zurückgesetzt ind der Interrupt ausgelöst. Einen Timer-Mode, bei den OCR1B Top ist gibt es nicht. MfG Spess
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.