Hallo zusammen, ich bin an einem Projekt dran, der mir paar Probleme bereitet. Ich programmiere mit Bascom nen Zähler und zwar benutze ich den timer1 vom atmega16. Das Problem das auftritt ist folgendes: wenn ich den timer1 in ganzen sekunden zählen lasse (sprich den timer so einstelle dass es jede sekunde nen interrupt gibt und die voreingestellte Zeit um eine Sekunde dekrementiert wird), funktioniert die ausgabe der zeit auf dem lcd exakt, habe das mit einer stoppuhr gemessen^^. Sobald ich den timer1 so einstelle, dass er in millisekunden zählt und ich dabei eine variable bis 1000 hochzählen lasse, damit es wieder dann jede Sekunde der lcd aktualisiert wird, gibt es schon nach 2min, eine sekunde Abweichung, habe das wieder mit der Stoppuhr parallel zu meinem programmierten Zähler gemessen. Habt ihr vielleicht eine Idee, warum es zu dieser Abweichung kommt? (wenn ihr mehr Informationen braucht, bitte bescheid geben)
hier mein code (nur die Zählschleife):
Do
Locate 1 , 8
Lcd seconds
If Seconds < 0 Then
Seconds = 9
Decr Seconds2
If Seconds2 < 0 Then
Seconds2 = 5
Decr Minutes
If Minutes < 0 Then
Minutes = 9
Decr Minutes2
If Minutes2 < 0 Then
Minutes2 = 5
Decr Hours
If Hours < 0 Then
Hours = 9
Decr Hours2
Locate 1 , 1
Lcd hours2
End If
Locate 1 , 2
Lcd hours
End If
Locate 1 , 4
Lcd minutes2
End If
Locate 1 , 5
Lcd minutes
End If
Locate 1 , 7
Lcd seconds2
End If
If Hours2 = 0 And Hours = 0 And Minutes2 = 0 And Minutes = 0 And
Seconds2 = 0 And Seconds = 0 Then
Stop Timer1
Seconds = 0
Seconds2 = 0
Minutes = 0
Minutes2 = 0
Hours = 0
Hours2 = 0
Disable Interrupts
End If
Loop
Isr_von_timer1:
Timer1 = 65286
Incr A
If A = 1000 Then
Decr Seconds
A = 0
End If
Return
Wie hast du den Timer konfiguriert? Wie schnell läuft der µC? Am besten spielst du mit dem Preload-Wert bis es passt. Dann hast du das ganze auch gleich unabhängig von Taktungenauigkeiten.
Timer vorladen Isr_von_timer1: Timer1 = 65286 ist Scheisse. Genau deswegen gibt es den CTC Modus, damit man das nicht braucht.
Samuel C. schrieb: > Wie hast du den Timer konfiguriert? > Wie schnell läuft der µC? > > Am besten spielst du mit dem Preload-Wert bis es passt. Dann hast du das > ganze auch gleich unabhängig von Taktungenauigkeiten. sorry, der atmega16 läuft mit einem externen 16Mhz Quarz
Das Problem sollte daher rühren, daß vom Auslösen des Timerinterrupts bis zum eigentlichen Zeitpunkt des Preloads noch ca. 60-70 Takte vergehen, bedingt durch die Sicherung der Prozessorregister. Der Timer wird also später auf 0 gesetzt und damit sollte die Uhr nachgehen, denn aus 250 * 64 = 16000 Takten werden dann 16070 Takte, was etwa eine halbe Sekunde ausmachen würde. Nimm einfach einen Preload von 65287, dann sollte sich das kompensieren. Oder besser, wie Karl-Heinz schon gesagt hat, nimm CTC, da gibt's das Problem nicht. Nennt sich beim Config des Timers "Clear Timer = 1", danach noch das Compare1A auf 249 setzen. Die ISR muss in "On Compare1A ..." geändert werden. Die Hilfe gibt Auskunft und ein Beispiel sollt's auch geben.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.