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:
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
DANKE!
Lg
Phips[/code]