Hi,
ich bin noch ziemlicher Mikrocontroller Neuling und versuche mich gerade
an einem kleinen Programm (nur so zum Spass und zum lernen).
Ein Input Capture Interrupt zieht von dem aktuellen Timerstand den
vorherigen ab und die Differenz wird dann per 7-Segment Anzeige
ausgegeben. Soweit funktioniert das auch sehr gut ausser, dass die
Anzeige in periodischen Abständen immer mal "zuckt". Ich dachte der
Grund könnte sein, dass der Timer überläuft und deshalb der vorherige
Timerstand größer als der neue ist und deshalb die berechnete Differenz
nichtmehr stimmt.
Ich habe probiert mit einem Sprung in so einem Fall das Setzen des Flags
das in der Hauptschleife die Ausgabe auslöst zu überspringen aber auch
das funktioniert irgendwie nicht.
Hier noch mein Code:
1 | icp:
|
2 | lds outl, ICR1L ; Timertwert (16bit) nach outl und outh kopieren
|
3 | lds outh, ICR1H
|
4 |
|
5 | lds ticp1, oldl ; Den alten Timerwert aus dem Ram nach ticp1 und ticp2 kopieren
|
6 | lds ticp2, oldh
|
7 |
|
8 | sts oldl, outl ; Aktuellen Timerwert in den Ram speichern
|
9 | sts oldh, outh
|
10 |
|
11 | sub outl, ticp1 ; Aktueller Timerwert - alter Timerwert = Differenz die zur Anzeige gebracht werden soll
|
12 | sbc outh, ticp2 ; (16bit Rechnung)
|
13 |
|
14 | brcs end
|
15 | ser flag
|
16 |
|
17 | end: reti
|
Kann mir jemand sagen wo mein Fehler liegt?
Gruß,
Thomas
PS: Wenn ich in den Interrupt so "umbaue" dass der Timerstand einfach
jedes mal wieder auf 0 zurückgesetzt wird funktioniert es wunderbar ohne
"zucken". Ich gehe also davon aus, dass der Rest meines Programms
funktioniert.