Uhr in Asm (die 453465te ;))

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
Angehängte Dateien:
Gast
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.
Gast
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 21 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.