H
Helmut Neemann
Guest
Hallo,
ich habe das folgende Problem, und es will mir einfach keine Lösung
einfallen:
Ich habe den Timer0 so programmiert, dass er alle 1ms einen Interrupt
auslößt. In der Interrupt-Routine erhöhe ich einen 32-Bit-Zähler um eins
und erzeuge mir so eine Systemzeit. Funktioniert auch prima.
Dann und wann brauche ich aber eine genauere Zeitangabe. Da habe ich mir
gedacht ich kombiniere den 32-Bit-Zähler mit dem TCNT0-Register. Dieses
Register läuft bei mir immer bis 250 (Inhalt von OCR0), dann wird es auf
Null zurückgesetzt und ein Interrupt wird erzeugt.
Wie muß man das Auslesen des TCNT0-Registers und des 32-Bit-Zählers
programmieren, so das man eine korrekte Zeit erhält?
Die Kombination
IN R16,TCNT0
CLI
LDS R17,SYSTEMTIME ; uR17:R18:R19:R20="SystemTime"
LDS R18,SYSTEMTIME+1
LDS R19,SYSTEMTIME+2
LDS R20,SYSTEMTIME+3
SEI
funktioniert am besten. Wie zu erwarten kommt es aber manchmal zu
Problemen. Ich denke diese entstehen, wenn zwischen dem IN und dem CLI
der Zähler auf Null springt und ein Interrupt erzeugt wird. Vertauscht
man die Befehle jedoch gibt es viel häufiger Probleme. Das überrascht
auch nicht, denn der Zähler läuft ja um, egal ob Interrupts erzeugt
werden oder nicht.
Hat schon einmal jemand ein ähnliches Problem gehabt und eine Lösung
ersonnen?
mfg
Helmut
ich habe das folgende Problem, und es will mir einfach keine Lösung
einfallen:
Ich habe den Timer0 so programmiert, dass er alle 1ms einen Interrupt
auslößt. In der Interrupt-Routine erhöhe ich einen 32-Bit-Zähler um eins
und erzeuge mir so eine Systemzeit. Funktioniert auch prima.
Dann und wann brauche ich aber eine genauere Zeitangabe. Da habe ich mir
gedacht ich kombiniere den 32-Bit-Zähler mit dem TCNT0-Register. Dieses
Register läuft bei mir immer bis 250 (Inhalt von OCR0), dann wird es auf
Null zurückgesetzt und ein Interrupt wird erzeugt.
Wie muß man das Auslesen des TCNT0-Registers und des 32-Bit-Zählers
programmieren, so das man eine korrekte Zeit erhält?
Die Kombination
IN R16,TCNT0
CLI
LDS R17,SYSTEMTIME ; uR17:R18:R19:R20="SystemTime"
LDS R18,SYSTEMTIME+1
LDS R19,SYSTEMTIME+2
LDS R20,SYSTEMTIME+3
SEI
funktioniert am besten. Wie zu erwarten kommt es aber manchmal zu
Problemen. Ich denke diese entstehen, wenn zwischen dem IN und dem CLI
der Zähler auf Null springt und ein Interrupt erzeugt wird. Vertauscht
man die Befehle jedoch gibt es viel häufiger Probleme. Das überrascht
auch nicht, denn der Zähler läuft ja um, egal ob Interrupts erzeugt
werden oder nicht.
Hat schon einmal jemand ein ähnliches Problem gehabt und eine Lösung
ersonnen?
mfg
Helmut