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