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ß!
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).
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.
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?
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.
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.