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
Ist das nicht so das du den Wert bis zum Überlauf erhöhst? .equ start = 65536 - 4835 (4836, 4837.....) Damit werden ja die Takte bis zum INterrupt mehr. Die Zeit bis zu neuen Start des Timers musst du auch dazurechnen.
Hallo, sry das das jetz solange gedauert hat. Ja das mit dem Überlauf stimmt, aber das ändert doch nichts^^ und den Timer zurücksetzten braucht doch auch nicht solange, oder? danke schonmal
Verwende entweder die Funktion clear on compare match, oder den compare match interrupt in dem du den Vergleichswert immer um einen Konstanten Wert erhöhst. siehe: Die genaue Sekunde http://www.mikrocontroller.net/forum/read-4-57760.html
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.