Forum: Mikrocontroller und Digitale Elektronik Uhr in Asm (die 453465te ;))


von Alexander Muthmann (Gast)


Angehängte Dateien:

Lesenswert?

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

von Hubert (Gast)


Lesenswert?

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.

von Alexander Muthmann (Gast)


Lesenswert?

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

von werner Hoch (Gast)


Lesenswert?

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

von Alexander Muthmann (Gast)


Lesenswert?

ahhh ok! danke für die Hilfe!!!

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.