Forum: Mikrocontroller und Digitale Elektronik Probleme mit dem genauen timing


von Andy (Gast)


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

von KLAUS (Gast)


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

von Peter D. (peda)


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

von Andy (Gast)


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

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.