Zuerst einmal: Hallo!
Ich lese schon einige Zeit immer wieder im Forum und hole mir dadurch nützliches Wissen! Und eines muss gesagt werden, das Forum ist wirklich toll!
Jetzt muss ich aber doch einmal selbst schreiben, da ich nicht mehr weiterkomme!
Ich beiße mir nun schon seit 2-3 Tagen die Zähne an den Timern aus. Irgendwie habe ich damit leider so meine Probleme. Ich habe zwar die Vorladewerte mehrmals erfolgreich berechnet, komme aber in der Praxis nie zum richtigen Ergebnis.
Zuerst ging ich davon aus, dass die Timer mit dem externen Quarz arbeiten...Nach einigen Versuchen kam ich leider drauf, dass dies nicht so ist?
Ich habe mir dann Gedanken gemacht ob es noch irgendwo einen Takt gibt und habe es einmal mit dem Takt des Atmegas probiert. Und siehe da, bei einem Takt von 8 MHz und einem Vorladewert von 34285 an Timer1 war ich einer Sekunde nicht mehr so fern.
Meine neue Erkenntnis ist also, es ist vom Takt des Atmegas abhängig. Stutzig macht mich nur, dass ich eigentlich immer was von einem Quarz lese, welcher den Takt angibt.
Zur Annäherung habe ich ein kleines Programm geschrieben. Dieses gibt bei jedem Interrupt, also rein theoretisch, jede Sekunde die Uhrzeit und einen Zählerstand aus. Damit war es mir möglich Korrekturen beim Vorladewert zu treffen. Dies mache ich nun schon seit einem Tag mit mehreren Läufen, bekomme das aber nicht unter Kontrolle. Heute war dann ein Stromausfall und es fiel mir auf, dass bei gleichem Vorladewert in zwei Läufen die Abweichung unterschiedlich hoch ist. Im 1. Lauf war es eine Sekunde auf 20 Minuten und im 2. Lauf waren es 2 Sekunden auf 20 Minuten.
Kann mich bitte jemand aufklären, warum und wie das möglich ist?
Zum Einsatz kommt ein myAVR USB Board inkl. Display mit einem Atmega8.
Mein Annäherungsprogramm:
DANKE!Code:$regfile = "m8def.dat" $crystal = 32768000 Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2 Config Lcd = 16 * 2 Config Portd = Output Config Timer1 = Timer , Prescale = 256 On Timer1 Timer_irq Enable Timer1 Const Timervorgabe = 33742 Dim Zaehler As Integer Zaehler = -1 Config Pinc.2 = Output Led3 Alias Portc.2 Enable Interrupts Config Clock = Soft Timer1 = Timervorgabe Time$ = "00:00:00" Do Loop Timer_irq: Timer1 = Timervorgabe Zaehler = Zaehler + 1 If Zaehler = 60 Then Zaehler = 0 Cls Lcd Time$ ; " " ; Zaehler Return
Lg
Phips[/code]









Zitieren


Lesezeichen