mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Probleme mit dem genauen timing


Autor: Andy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Ich versuche zur Zeit eine Uhr zu bauen und das ohne Uhrenquarz sondern
mit einem normalen 8 MHz Quarz.

Mein problem ist es, dass ich es nicht schaffe, dass ich genau jede
Sekunde um eins weiterzählen kann.
Ich hoffe jemand von euch weiß wo der Fehler liegt.

Der Vorteiler wurde durch folgenden Code auf 1 gestellt, so müsste ich
doch alle 256 Tackte ein Interrupt bekommen:

  LDI  temp1, 0x01  ;Timervorteiler auf 1
  OUT  TCCR0, temp1  ;1Sek = 8.000.000 Takte = 31250*Int

Der Interrupt springt dann in Timer und dort steht folgendes:

Timer:
  PUSH temp1    ;temp und SREG sichern
  IN   temp1, SREG
  PUSH temp1

  INC  time0    ;zählen
  CPI  time0, 0x7D  ;wenn nicht 125, dann Ende!
  BRNE End_Timer

  CLR  time0    ;auf Null für nächsten Interrupt
  INC  time1    ;125er zählen
  CPI  time1, 0xFA  ;weiter nur bei 250*125=31250
  BRNE End_Timer

  CLR  time1    ;für nächste Sekunde

  INC  sek0    ;Zeit zählen

Das Problem ist, dass nach ca. 3 Minuten der µC bereits 1 Sekunde
nachgeht, dass kann doch nicht an der Ungenauigkeit des Quarzes liegen,
oder?´

Andy

Autor: KLAUS (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
1 Sekunde funktioniert bei mir so.


TIM_OVF0:    push   rmp
             ldi   rmp,0x6   ;timer 0 auf 6 setzten (zählen
                                   von 6-256 = 250 mal)
             out        tcnt0,rmp
       in   rmp,sreg   ;Statusregister sichern
       inc   taktlow    ;TakteLow erhöhen
       brne   tim001
             inc   takthi     ;Taktehi erhöhen

tim001:      cpi   taktlow,low(taktzaehler) ;vergleich auf 500
             brne   tim002
       cpi   takthi,high(taktzaehler) ;vergleich auf 500
       brne   tim002
       sbr   FlagReg,1
;wenn Tak=500
(taktzaehler=8000000/16000) --> 1 sek fertig --> bit 0 in FlagReg
setzen

      clr   taktlow         ;taktzaehler löschen
      clr   takthi

tim002:      out   sreg,rmp
            pop         rmp
      reti

Vorteiler Timer 0 auf 64 setzten
Interrupt T0 bei Überlauf
     ldi   rmp,0b00000011    ;Teiler für Timer0 (=64)
     out  tccr0,rmp
         ldi  rmp,0b00000010        ;  T0 Interrupt bei überlauf
         out  TIMSK,rmp

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Code sieht o.k. aus.

Laß ihn dich mal im Simulator laufen, da kriegst Du dann genau die
Anzahl der Taktzyklen angezeigt.

Hast Du auch wirklich auf externen Quarz gestellt und nicht auf den
8MHz RC-Oszillator ?


Peter

Autor: Andy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Klaus
Wie genau sind bei dir die Sekunden?

@Peter
Ich verwende einen AVR90S8535, der hat glaunbe ich keinen internen
Oscillator, also kann es nicht daran liegen, aber danke.
ich verwende einen vertigen Chip Oscillator, also sind auch die
starjken einflüsse von Temperatur, ... doch zimlich abgeschwächt, wie
es auf den anderen Seiten heißt, wenn man einen einfachen Oscillator
verwendet.

Andy

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.