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.