So, nach ein paar längeren Tests der Ganggenauigkeit des 100KHz
Mini-Quarz, so klein wie ein 32KHz Uhrenquarz, läuft dieser, wie sollte
es auch anders sein, um ca. 2,5 Takte je Sekunde zu langsam.
Statt 100KHz sind es 99997,5Hz.
Für die jenigen, die es interessiert läßt sich das per folgendem
ASM-Code abgleichen:
.equ TC2Value=100000/1000-1
Timer2Cmp:
push xl ; 2 Register und SREG retten.
in xl,SREG ; 1
pushw x ; 4
ldsw x, Uhr+MilliSek ; 4 Millisekunden lesen,
adiw xl,1 ; 2 + 1
stsw Uhr+MilliSek ,x ; 4 und zurück schreiben.
lds xh,Uhr+Sekunde ; 2 Sekunde lesen.
andi xh,3 ; 1 auf Mod 4 prüfen.
breq SetMS2 ;1/2 Jede 4. Sekunde keine Taktkorrektur.
ldi xh,TC2Value ; 1 Timerwert für 1ms in xh.
tst xl ; 1 Ist low-Byte von ms = 0?
brne SetMS1 ;1/2
ldi xh,TC2Value-1 ; 1 Dann Timerwert - 1.
SetMS1: out OCR2,xh ; 1 Compare Register einstellen.
SetMS2: popw x ; 4 Register zurückholen.
out SREG,xl ; 1
pop xl ; 2
reti ; 4
Die ISR für Timer2 wird jede Millisekunde aufgerufen.
Zuerst wird Milliesekunde um 1 erhöht.
Als nächstes wird geprüft, ob die Sekunde / 4 = 0 ist. Ist das der Fall
wird keine Korrektur vorgenommen.
Ansonsten wird geprüft, ob das low-Byte der Millisekunden 0 ist.
Das ist der Fall bei einem Wert von 256, 512 und 768.
Dann wird der Timer2-Compare nicht auf 100 sondern auf 99 gesetzt und
somit kommt der nächste Timer2-Aufruf ein Takt früher.
Somit ergeben sich 3 Korrekturen je Sekunde. Da aber jede 4. Sekunde
keine Korrektur vorgenommen wird sind das dann in 4 Sekunden 9 Takte
weniger, das entspricht je Sekunde dann 9 / 4 = 2,25 Takte.
MfG
Andi