Forum: Projekte & Code Wie realisiert man einen 16-bit Timer?


von Stefan (Gast)


Lesenswert?

Hallo,

ich suche nach Möglichkeiten, wie man einen möglichst genauen 16-bit
Timer in Software realisiert, wenn man

a) wie bei einem ATtiny13 nur einen 8-bit Timer zur Verfügung hat

oder

b) wie bei einem ATtiny15 zwei 8-bit Timer/Counter hat.


Könnt ihr mir bitte mit Vorschlägen weiterhelfen? Oder gibt es ein
fertiges Beispiel, das man anpassen kann?

Danke und Gruß!

von inoffizieller WM-Rahul (Gast)


Lesenswert?

1. Was hat diese Frage in der Codesammlung zu suchen?

2. Man zählt bei jedem Überlauf des Timers eine 8Bit-Variable hoch.
Dann muß man "nur noch" darauf achten, dass bei einer Timerabfrage
auch das niederwertige Byte (also der Zähler selbst) einen sinnvollen
Wert hat - nicht, dass man den Zähler abfragt, wenn er gerade einen
Überlauf hatte.
Peter Dannegger schreibt dann immer, dass ein 16-Bit-Zugriff nicht
atomar abläuft (der AVR arbeitet nun mal nur mit 8Bit. 16 sind daraus
eine Zusammensetzung, die dazu führen kann, dass sich Teile der
16Bit-Zahl während des Zugriffs ändern).

von Rolf Magnus (Gast)


Lesenswert?

Man kann zuerst den low-Teil lesen, dann den high-Teil und nochmal den
low-Teil. Dann vergleicht man die low-Teile. Wenn der zweite kleiner
als der erste ist, gab's inzwischen einen Überlauf. In diesem Fall muß
man den high-Teil nochmal lesen.

von Stefan (Gast)


Lesenswert?

Danke erstmal für die Antworten. Die Anfrage ist in der Codesammlung,
weil ich gehofft hatte da was zu finden oder, daß jemand was hat.

Mein Problem ist außerdem, daß ich den zusammengesetzten 16-bit
Timerwert auch noch mit einem Vergleichswert comparen und möglichst
zeitnah eine Routine starten oder einen SW-Interrupt auslösen will.

Wie könnte man so einen Vergleich machen, außer den Timerwert in der
Hauptschleife ständig zu pollen?

von inoffizieller WM-Rahul (Gast)


Lesenswert?

Wenn der Tiny ein OnCompare-Interrupt erzeugen kann, dann sollte man
diesen auf das untere Byte einstellen. Dadurch wird bei jedem
Timerdurchlauf ein Interrupt erzeugt, in dem man dann das obere Byte
mit dem "Überlaufzähler" vergleicht. Bei Gleichheit wird ein Flag
gesetzt, das in der Hauptschleife ausgewertet wird.
Sollte er diesen Interrupt nicht zur Verfügung stellen, wird es
entsprechend umständlicher.

von ohb (Gast)


Lesenswert?

32bit timer von peda: Beitrag "AVR Timer mit 32 Bit"

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.