Hallo, Ich habe ein Problem mit der Nutzung eines Uhrenquarzes 32...kHz Habe Prescaler und TCNT2 auf gegebene Werte gesetzt sowie das Bit AS2 im Register ASSR. Habe keine Kondensatoren an den Eingängen, das Bit für die internen Kondensatoren ist doch standardmäßig gesetzt? Habe ich etwas vergessen oder warum läuft der Timer noch nicht einmal an??? Danke im Voraus.
Hi >Habe ich etwas vergessen oder warum läuft der Timer noch nicht einmal >an??? Wie wäre es mit der vollständigen Initialisierung? MfG Spess
void isr_init(void) { ASSR = (1<<AS2); TIMSK |= (1<<TOIE2); TCCR2 = (1<<CS22)|(1<<CS21); sei(); } //..... ISR(TIMER2_OVF_vect) { TCNT2 = 128; //.......Minute erhöhen }
*Sekunde und nicht Minute Der Uhrenquarz ist einfach zwischen PB6 und PB7 geschaltet.
Hi Sieh dir mal die Umschaltung in den Async Mode im Datenblatt an: Asynchronous Operation of Timer/Counter2 .... 1. Disable the Timer/Counter2 interrupts by clearing OCIE2 and TOIE2 2. Select clock source by setting AS2 as appropriate 3. Write new values to TCNT2, OCR2, and TCCR2 4. To switch to asynchronous operation: Wait for TCN2UB, OCR2UB, and TCR2UB 5. Clear the Timer/Counter2 Interrupt Flags 6. Enable interrupts, if needed ..... MfG spess
>das Bit für die internen Kondensatoren ist doch standardmäßig gesetzt?
Nein, die CKOPT Fuse ist ab Werk nicht gesetzt.
void isr_init(void) { //OCIE2 and TOIE2 bereits 0 ASSR = (1<<AS2); TCCR2 = (1<<CS22)|(1<<CS21); TCNT2 = 128; while((1<<TCN2UB)||(1<<OCR2UB)||(1<<TCR2UB)){} //Warten TIMSK |= (1<<TOIE2); sei(); } So geht es immer noch nicht.
> while((1<<TCN2UB)||(1<<OCR2UB)||(1<<TCR2UB)){} //Warten
Das ist zu 99,9% Unfug. Es soll wohl
while(REGISTER&(1<<TCN2UB) || REGISTER&....);
heissen.
void isr_init(void) { //OCIE2 and TOIE2 bereits 0 ASSR = (1<<AS2); TCCR2 = (1<<CS22)|(1<<CS21); TCNT2 = 128; while((ASSR &(1<<TCN2UB))||(ASSR &(1<<OCR2UB))||(ASSR &(1<<TCR2UB))){} //Warten TIMSK |= (1<<TOIE2); sei(); } Nun scheint er dauerhaft in der Warteschleife hängen zu bleiben, auch wenn ich die 3 Bedingungen negiere.
Meine Güte, habe es nun alles nach Anleitung wie folgt im Programm: void isr_init(void) { //Disable timer2 interrupts TIMSK = 0; //Enable asynchronous mode ASSR = (1<<AS2); //set initial counter value TCNT2=0; //set prescaler TCCR2 = (1<<CS22)|(1<<CS21); //wait for registers update while (!(ASSR & ((1<<TCN2UB)|(1<<TCR2UB)))); //clear interrupt flags TIFR = (1<<TOV2); //enable TOV2 interrupt TIMSK |= (1<<TOIE2); sei(); } Er zählt trotzdem noch nicht!
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.