www.mikrocontroller.net

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


Autor: Alexander Muthmann (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Hubert (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Alexander Muthmann (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: werner Hoch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Alexander Muthmann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ahhh ok! danke für die Hilfe!!!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.