mikrocontroller.net

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


Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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ß!

Autor: inoffizieller WM-Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: inoffizieller WM-Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: ohb (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
32bit timer von peda: Beitrag "AVR Timer mit 32 Bit"

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.