Hallo, ich habe Probleme mit dem Timer2 in einem AtMega8. In AVRStudio läuft in der Simulation alles einwandfrei, nur auf dem Atmega macht der Timer, was er will. Grundsätzlich ist mein Vorhaben gar nicht so schwierig, ich rufe eine Sub- routine auf, möchte ein paar ms warten, um die Routine dann wieder aufzu- rufen, Anzahl der Aufrufe=4. In der ISR wird ein Flag zurückgesetzt, was ich vorher gesetzt habe. Die Steuerung des Timers soll mit den Clk- Bits erfolgen. Alle 0 --> Timer gestoppt, im Hauptprogramm wird der Timer mit dem Prescaler gestartet. Die Initialisierung: ldi TempA, ((1<<CTC2)|(0<<CS22)|(0<<CS21)|(0<<CS20)) out TCCR2, TempA ldi TempA, 1<<OCF2 out TIFR, TempA in TempA, TIMSK ori TempA, 1<<OCIE2 out TIMSK, TempA ldi TempA, Timer2Wert out OCR2, TempA Die ISR: Timer2serv: cli in save_sreg, SREG push TempA clr Timer2Ready ldi TempA, ((1<<CTC2)|(0<<CS22)|(0<<CS21)|(0<<CS20)) out TCCR2, TempA pop TempA out SREG, save_sreg sei reti Das Hauptprogramm: Send4Packets: rcall SendPacket ldi Timer2Ready, 1 ldi TempA, ((1<<CTC2)|(1<<CS22)|(1<<CS21)|(1<<CS20)) out TCCR2, TempA loop1: tst Timer2Ready brne loop1 rcall SendPacket ldi Timer2Ready, 1 ldi TempA, ((1<<CTC2)|(1<<CS22)|(1<<CS21)|(1<<CS20)) out TCCR2, TempA loop2: tst Timer2Ready brne loop2 rcall SendPacket ldi Timer2Ready, 1 ldi TempA, ((1<<CTC2)|(1<<CS22)|(1<<CS21)|(1<<CS20)) out TCCR2, TempA loop3: tst Timer2Ready brne loop3 rcall SendPacket ldi TempA, ((1<<CTC2)|(1<<CS22)|(1<<CS21)|(1<<CS20)) out TCCR2, TempA loop4: tst Timer2Ready brne loop4 Wenn ich den Timer im CTC- Mode durchlaufen lasse, kann ich auch die Zeit mit Timer2Wert einstellen, läuft das Programm so wie es oben beschrieben ist, funktioniert die Timereinstellung nicht. Hat irgendjemand eine Idee, woran das liegen kann? Gruß, bytebold
Erstmal so sieht mir das normal aus, außer dass ich nie auf die Idee gekommen wäre, das CTC-Bit (WGM21) beim Abschalten des Timers zu setzen. Alle CS-Bits 0 ist Timer AUS, und in dem Zustand passiert eh nichts, auch kein CTC... Im übrigen ist der CTC-Modus nicht wirklich für den Zweck da, für den Du ihn benutzt. Ansonsten zur ISR noch zweierlei: 1. cli/sei sind innerhalb einer ISR unnötig (cli passiert beim Aufruf und sei mit dem reti implizit), und 2. versuch mal, statt des OC-Interrupts den Timer Overflow zu verwenden. Womöglich ist TCNT bei dem hohen Vorteilerwert, den Du benutzt, noch gar nicht wieder 0, wenn Du den Timer abstellst... Der TOV-Interrupt kommt dagegen genau dann, denn TCNT den Wert 0 annimmt. Gruß Johannes
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.