Forum: Mikrocontroller und Digitale Elektronik Softwareuhr mit Compare


von Markus (Gast)


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

von bukongahelas (Gast)


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.

von Florian Pfanner (Gast)


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

von Werner Hoch (Gast)


Lesenswert?


von Markus (Gast)


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

von bukongahelas (Gast)


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

von Peter D. (peda)


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

von Markus (Gast)


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

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.