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
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
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
@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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.