Forum: Mikrocontroller und Digitale Elektronik Bascom timer interrupt programmierung


von Julian W. (blubb86)


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)

von Samuel C. (dragonsam)


Lesenswert?

Code her.

Wahrscheinlich lädst du den Timer zu spät vor.

von Julian W. (blubb86)


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

von Julian W. (blubb86)


Lesenswert?

PS: der vorteiler ist auf 64 eingestellt

von Samuel C. (dragonsam)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

Timer vorladen

Isr_von_timer1:
   Timer1 = 65286


ist Scheisse. Genau deswegen gibt es den CTC Modus, damit man das nicht 
braucht.

von Julian W. (blubb86)


Lesenswert?

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

von MWS (Gast)


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.

von Julian W. (blubb86)


Lesenswert?

danke leute für die schnellen Antworten

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
Noch kein Account? Hier anmelden.