PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ATMega32 Timerproblem



michaelF
24.01.2006, 21:05
Ich habe ein Problem mit einem 8bit Timer des ATMega32.

Ich möcht den Timer mit einem Wert vorladen, aber der Wert wird einfach ignoriert. Ich hänge den Code mal dran, vielleicht fäll jemande etwas ein.
Ich bin schon am verzeifeln.



$regfile = "m32def.dat"
$crystal = 16000000

Dim Count As Word
Const Reload = 240

'########## Timer2 ###########
On Timer2 Ueberlauf: Interrupt-Routine Timer2
Config Timer2 = Timer , Prescale = 64 'Takt: Quarz/64
Enable Timer2 'Timer2 einschalten
Enable Interrupts 'Interrupts global zulassen
Load Timer2 , Reload 'Timer2 mit offset vorladen

Config Portb.2 = Output 'Portb.2 als output

'### begin loop ###
Do
nop 'do nothing
Loop
'### end loop ###

End 'end program

'#### Label #######
Ueberlauf:
Incr Count 'Variable count erhoehen
If Count = 1000 then 'Ist der count xxx, dann
Toggle Portb.2 'Toggle Portb.2 (blink LED)
Count = 0 'Variable count auf 0
Load Timer2 , Reload 'Offset
End If
Return

Marco78
24.01.2006, 21:15
Load Timer2 , Reload 'Offset
End If

Das scheint das Problem zu sein. In der ISR wird der Timer nur dann wieder geladen, wenn Count=1000 ist.
Der Timer muss aber immer in der ISR neu geladen werden. Am besten gleich zu anfang, damit es mit den errechneten Zeiten noch passt.

michaelF
24.01.2006, 21:29
@Marco78

Das stimmt, so soll es auch sein. Weiter oben steht die Zeile noch einmal.
In der Interruproutine wird er dann erneut mit der Constanten Reload mit 240 vorgeladen. Aber ob in der Constanten 0 oder 240 steht ist egal. Der Timer benötigt immer die gleiche Zeit. Ich habe es auch mit der einfachen Schreibweise versucht
timer2 = 240
Aber auch hiermit Fehlanzeige.

Marco78
24.01.2006, 22:14
Weiter oben steht die Zeile noch einmal.

Ja, aber diese Zeile wird nach einem Reset nur einmal ausgeführt. die in der ISR jedesmal wenn sie aufgerufen wird.

Im Moment wird der Timer ja nur beim Start und wenn count=1000 ist aufgeladen. Somit fehlt dir 999 mal das vorladen des Timer. Er fängt also 999 mal bei 0 an.

Eine andere Erklärung sehe ich z.Zt. nicht.

Ich würde dir auch gerne einen Link geben, aber ich weiss selbst nicht genau, wo das Programm ist. Also musst du mal im Forum oder im Internet nach RNAVR suchen. Das Programm liefert dir einen fertigen Code für die Timer. Du musst nur den Takt und Auslösezeit/Frequenz angeben.

michaelF
24.01.2006, 22:36
@Marco78

Jetz habe ich es kapiert. Klar, das Vorladen muss natürlich vor der IF Klausel passieren.
Vielen Dank de Michael aus Hamburg.



'#### Label #######
Ueberlauf:
Incr Count 'Variable count erhoehen
If Count = 1000 then 'Ist der count xxx, dann
Toggle Portb.2 'Toggle Portb.2 (blink LED)
Count = 0 'Variable count auf 0
Load Timer2 , Reload 'Offset
End If
Return

##################################
'#### Label #######
Ueberlauf:
Load Timer2 , Reload 'Offset
Incr Count 'Variable count erhoehen
If Count = 1000 then 'Ist der count xxx, dann
Toggle Portb.2 'Toggle Portb.2 (blink LED)
Count = 0 'Variable count auf 0
End If
Return