mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Softwareuhr mit Compare


Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ich möchte eine Softwareuhr realisieren. Ich benutze einen ATMEGA128
mit einem 16MHZ Quarz.
Ich möchte den Timer so initialisieren, dass genau alle 100ms ein IRQ
ausgelöst wird.
Dazu beutze ich einen 16-Bit Timer den Timer 1.
Die Initialisierung des Timers ist im Prinzip kein Problem.

Der Teiler des Timers liegt bei 256.
Ich benutze die Compare-Einheit, da diese den Timerwert (bei einem
Vergleich der zutrifft) wieder auf 0 setzt.
Alle 6250 Takte muss der Timer den Compare-IRQ auslösen.

(256/16000000)*6250=100ms

Soweit sogut, doch ich weiß nicht, was ich in das Compare-Register
reinschreiben soll. Soll ich den Wert 6250 hineinschreiben, oder
6249...
Meine Bedenken:
Der Zähler beginnt ja bei 0 zum Zählen. Also müsste ich den Wert, den
ich in das Register eintrage um 1 kleiner sein.
Dann besteht noch die Frage: Wann löst der Compare-IRQ aus? Ich habe
den Timer heruntergeteilt. Löst der Timer jetzt bei sofortiger
Gleichheit aus oder erst dann, wenn der Timerwert um eins größer werden
würde als der Compare-Wert (Also, wenn bei Gleichhiet die aktuelle
Periode (256/16MHZ) des Timers abgelaufen ist?)?

Danke für eure Antworten

Tschüss

Martin

Autor: bukongahelas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Uhr tagelang laufen lassen,mit DCF Zeit vergleichen,
Compare Wert korrigieren,wieder lange laufen lassen...usw.
Jeder Quarz hat eine etwas andere Frequenz.
Ich nehme gern Quarz mit 4194304 Hz.
Oft genug durch 2 geteilt kommt man auf 1 Sekunde.
In den Registern stehen dann "schöne,gerade" Werte (z.B:$4000/$3FFF)
Über das "fange ich bei 0 oder 1 an zu zählen" Problem
gehe ich durch Ausprobieren der Zeit in Realo hinweg.
Hatte auch das Problem aller Quarzuhren:Sekundenabweichungen
nach Tagen gegenüber DCF-Funkzeit.
Vielleicht lieber DCF decodieren und anzeigen ? (Funkuhr?).
Das Netz mit seinen 50Hz ist auch keine schlechte Zeitbasis.
Suche selbst eine "sichere" DCF Decoderroutine.

Autor: Florian Pfanner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

hab so was auch schon mal Programmiert. Wenn du das ganze im Studio
Simulierst, kannst du dir die benötigten Zyklen anzeigen lassen. Damit
findest du heraus, dass du den Compare mit 6249 laden musst. Der
Compare wird bei gleichheit ausgelöst. Also hast du damit keine
Verluste.

Gruß, Florian

Autor: Werner Hoch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

@Florian
Ich weiß, ich hab es schon im AVR-Studio simuliert. Ich dachte mir aber
ich frage trotzdem nach, da meine Erfahrungen mit dem AVR-Studio nicht
so besonders berauschend sind. Besonders beim ATMEGA128 weißt das
AVR-Studio4 schwerwiegende Mängel auf. Besonders im Bereich Timer. Z.B.
kann man den Timer so einstellen, dass wenn er den Maximalwert erreicht
hat, die Richtung ändert und nach unten zählt. Das mit dem Runterzählen
hat im AVR-Studio überhaupt nicht funktioniert. Ich habe sehr lange
herumprobiert, da ich an eine fehlerhafte Initialisierung glaubte, aber
als ich das Programm in den Prozessor spielte funktionierte alles so
wie es sollte.

@Werner
Danke ich werde mir das Programm mal ansehen.

Tschüss

Autor: bukongahelas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hatte ich auch bei verschiedenen Funktionen in
AVR Studio,z.B. stehen die Register nach reset
nicht wie erwartet auf $00,sondern auf Zufallswerten.
Muß erst alle regs im Prog resetten,um Studio auf
alle regs=$00 zu zwingen.
Es dauert auch 30 Sekunden,bis ein neues .obj file
geladen wird.
Verglichen mit den Windows Abstürzen ist das aber harmlos.
Uli

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da gibts eine Fallgrube bei den Timern:

Das Rücksetzen nach Compare benötigt einen CPU-Takt.
D.h. um durch 8000 zu teilen, muß man auf 7999 vergleichen.

Mit Vorteiler aber passiert das quasi gleichzeitig.
Also bei Vorteiler 1/8 muß man auf 1000 vergleichen für 8000
CPU-Zyklen.

Steht auch ausführlich im Datenblatt beschrieben.


Peter

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Peter!

Das ist aber interessant.
Also, wenn man keinen Teiler einstellt, dann benötigt es einen
CPU-Takt, um das Rücksetzen durchzuführen. Der Timer läuft hier in
derselben Geschwindigkeit wie der Takt.

Wenn ich aber jetzt teile, dann passiert die Rücksetzung zwar auch
einen CPU-Takt später, nur fällt das nicht so sehr ins Gewicht, da der
Timer jetzt wesentlich langsamer zählt als der CPU-Takt.

Habe ich das so richtig verstanden?

Tschüss

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.