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
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.
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
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
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.