Gast
#148321
Hallo, ich befasse mich seit einigen Tagen ein bischen mit Asm und Avr Programmierung. Das Pflichtprogramm mit LEDS und Tastern hab ich hinter mir und dachte mir, programmieren wir doch mal ne Uhr, hast ja eh noch LED Anzeigen (7-Segment) da. Ok nach ein bischen probieren bin ich dann auch auf die Timer Funktion gestoßen. Da ich mit einem 2313 arbeite, hab ich mich für den 16bit Timer entschieden. Diesen initialisier ich am Anfang vom Programm mit: .equ start = 65536 - 4883 .equ highvalue = high(start) .equ lowvalue = low(start) was bei einem 10Mhz Quarz laut meiner Rechnung eine knappe halbe Sekunde ist. Danach kommt die Einstellung: ldi temp, 1<<TOIE1 out TIMSK, temp ldi temp, highvalue out TCNT1H, temp ldi temp, lowvalue out TCNT1L, temp ldi temp, 0b00000101 out TCCR1B, temp sei Sprich 1024er Vorteiler. Nun läuft das Programm so ab, dass ich die Interrupts aktiviere und immer wenn der Timer überläuft das Prog in einen bestimmten Teil springt. Dort wird zuerst der Timer wieder gestartet: ldi temp, highvalue out TCNT1H, temp ldi temp, lowvalue out TCNT1L, temp und dann halt die Sekunde hochgezählt (bei 10 sek ein neues Register begonnen, dann halt bei 60 sek usw usf) Mein einziges Problem ist nun folgendes: warum passt der Wert für den Timer nicht. Ich habe einmal eine kleine Tabelle angefertigt, die die Abweichungen von einer Funkuhr dokumentiert: Da der Wert 4883 anscheinend vollkommen falsch war, habe ich einfahc mal ein paar andere Werte probiert: 4835 480 4836 852 4837 891 4838 960 4839 2040 4840 1442 die Zahlen hinter den Werten geben an, nach wievielen Sekunden die Uhr um eine Sekunde hinterher läuft(durchschnittlich). Kann mir bei dem Problem irgendjemand helfen? Wäre super da ich langsam wirklich verzweifel :( Im Anhang ist noch der komplette Sourcecode (nen bischen wirr, wie gesagt bin noch neu auf dem Gebiet) Vielen Dank schonmal für eure Hilfe