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.