Helmut Neemann schrieb:
[Timer0, alle 1ms einen Interrupt, 32-Bit-Zähler, OCR0%0]
Output Compare Interrupt mit Prescalerd bei 16Mhz?
>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.
Dieser Fehler kann doch nicht so oft vorkommen?
Alle (250*Timer0 Prescale) Zyklen ist so eine kritische Situation.
Diese muss auch noch mit der Abfrage kollidieren.
Mein Vorschlag:
CLI
IN R16, TCNT0
IN temp, TIFR
ANDI temp, 2 ;(1<<OCF0)=2, test for flag
BREQ 1f ;skip next instruction if flag set
SEI
NOP
IN R16, TCNT0 ; "hmm, sollte eigentlich immer 0 sein"
CLI
1:
LDS R17,SYSTEMTIME ; uR17:R18:R19:R20="SystemTime"
LDS R18,SYSTEMTIME+1
LDS R19,SYSTEMTIME+2
LDS R20,SYSTEMTIME+3
SEI
Wenn du einfach nach dem Sichern des TCNT0, das zum Output Compare
Interrupt gehoerige Flag abfragst, kannst du den Reset des TCNT0
abfangen.
Ist OCF0 gesetzt, verwirfst du den gelesenen TCNT0 und laesst
den Output Compare Interrupt ausfuehren und SYSTEMTIME updaten.
Danach muss der TCNT0 und die SYSTEMTIME (fuer 1ms) atomic sein.
Was mit mehreren Interruptsflag mit verschiedenen Prioritaeten
nach dem SEI geschieht, weiss ich momentan nicht. Das NOP ist
notwendig da ein Befehl nach dem SEI auf jeden Fall ausgefuehrt wird.
servus thomas
«
--
Die 4. Österreichische Fan-Convention zum Thema Japanische Popkultur
** AniNite 2004 ** 20.-22.August 2004 **
http://www.aninite.at/ **
Anime & Manga * J-Pop Bar * Cosplay * Videogames * Go * DDR * AMV *
Manga Workshop * Quiz * Trading Cards * Vortraege * Origami * Kyudo *