Bascom timer interrupt programmierung

OP #2041506
Lesenswert?

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)
OP #2041540
Lesenswert?

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
Gast #2041623
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren