Gast
#434438
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