mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Bascom timer interrupt programmierung


Autor: Julian W. (blubb86)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Samuel C. (dragonsam)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Code her.

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

Autor: Julian W. (blubb86)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Julian W. (blubb86)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
PS: der vorteiler ist auf 64 eingestellt

Autor: Samuel C. (dragonsam)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Timer vorladen

Isr_von_timer1:
   Timer1 = 65286


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

Autor: Julian W. (blubb86)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: MWS (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Julian W. (blubb86)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke leute für die schnellen Antworten

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.