-
-
Erfahrener Benutzer
Robotik Einstein
Ja, also der Timer ist eingentlich ein Counter
hört sich zwar blöd an, ist aber so, deshalb spricht man oft von "Timer/Counter".
Er zählt alle Takt/Prescaler +1, Timer1 ist also selber eine Variable, die immer erhöht wird. wenn Timer 1 voll ist, bzw. überläuft, dass heißt den Wert 2^16 erreicht (16-Bit Timer) löst er einen Interrupt aus. Unser Ziel ist es jetzt, dass der Timer immer genau jede Sekunde überläuft.
Wenn wir den Timer mit 34286 vorladen, bleiben 31250 Impulse des Prescalers, bis der Timer überläuft.
31250 entspricht in unserem Fall:
8000000 [Takt meines uCs] / 256 [Prescaler]
Also genau einer Sekunde.
Ziehen wir nun von dem Überlaufwert den Wert für eine Sekunde ab, läuft der Timer1 genau jede Sekunde über, dann sollten wir ihn natürlich möglichst schnell wieder beladen, damit keine Fehler entseht.
In deinem fall würde ich einen größeren Prescaler nehmen (1024) weil der uC dann etwas entlastet wird. (Ich habe 256 gewählt, weil ich mit 1024 auf eine Komma-Zahl kam)
Mit 16000000/1024 kommen wir auf 15625. Nun Muss Timervorgabe
2^16-15625 sein, also 49911.
Alles klar?
Müsste mit Timervorgabe 49911 und Prescaler 1024 bei 16 Mhz genau auf eine Sekunde kommen. Kannst ja mal eine Diode toggeln, um es zu prüfen.
Natürlich entstehen aufgrund von Quarzungenauigkeiten etc. immer Fehler, aber da es sich ja nciht um eine Langzeituhr handelt, sollte das kein Problem sein. Bei anderen sind schonmal auf einen Tag einige Sekunden Differenz entsatnden, kannste ja runterrechnen.
Noch fragen?
MFG Moritz
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- Anhänge hochladen: Nein
- Beiträge bearbeiten: Nein
-
Foren-Regeln
Lesezeichen