Atmega32 Timer 1

OP #2752191
Heyho,

ich möchte mit meinem Atmega32 eine einstellbare Frequenz im Hz Bereich 
(ca. 1 - 20 Hz) erzeugen. Dafür benötige ich den Timer 1 (16bit).
Diese Frequenz will ich dann auch noch messen, dafür gibt es ja den 
Input Capture.
Nun ist meine Frage, ob das gleichzeitg funktioniert, weil ich glaube, 
dass sich die beiden Funktionen normalerweise in die Quere kommen 
müssten (weil sie nicht ganz die selben Startpunkte zum Loslaufen des 
Timers haben).

Falls das nicht gleichzeitig nutzbar ist, müsste ich dann eines der 
beiden (Frequenz messen oder Frequenz erzeugen) softwaremäßig machen. 
Was wäre da besser?

Grüße Joe
Joe B. schrieb:
> Heyho,
>
> ich möchte mit meinem Atmega32 eine einstellbare Frequenz im Hz Bereich
> (ca. 1 - 20 Hz) erzeugen. Dafür benötige ich den Timer 1 (16bit).
> Diese Frequenz will ich dann auch noch messen, dafür gibt es ja den
> Input Capture.

Nööö, Input-Capture ist ein stinknormaler externer Interrupt, der als 
Zugabe den aktuellen Zählerstand des Timer1 im dafür vorgesehenen 
(Doppel-)Register speichert.

> Nun ist meine Frage, ob das gleichzeitg funktioniert, weil ich glaube,
> dass sich die beiden Funktionen normalerweise in die Quere kommen
> müssten (weil sie nicht ganz die selben Startpunkte zum Loslaufen des
> Timers haben).

AVR-Timer müssen micht "loslaufen" und "gestoppt werden". Timer lässt 
man frei durchlaufen.
Wenn man nur eine Funktion (regelmäßigen Takt) braucht, nutzt man den 
CTC-Mode, der setzt den Timer bei Erreichen des Compare-Wertes 
automatisch auf 0 zurück.
Wenn man mehrere Funktionen des Timers braucht, dann lässt man ihn frei 
durchlaufen. Jeder Compare-Interrupt kann in der ISR das 
Compare-Register auslesen, das Intervall draufaddieren und den dadurch 
entstandenen "neuen Termin" in das Compare-Register zurückschreiben.
Der ICP-Interrupt liest das Capture-Register aus und subtrahiert davon 
den gemerkten Wert des Capture-Registers beim letzten Interrupt und 
erhält somit das Intervall. Geht natürlich nur bei guter Vorbereitung, 
also wenn die zu messende Periodendauer ins Timer-Raster passt.

>
> Falls das nicht gleichzeitig nutzbar ist, müsste ich dann eines der
> beiden (Frequenz messen oder Frequenz erzeugen) softwaremäßig machen.
> Was wäre da besser?

Das kommt auf den Einzelfall an. Den kenne ich nicht, Deiner 
Fragestellung fehlt die nötige Präzision.

Meist braucht ein Programm nicht nur einen Sekundentakt, sondern auch 
einen Takt im Bereich 30...1000 Hz (Tastenentprellung, 
Drehgeberauswertung, kleine Verzögerungen, usw). Da bietet es sich an, 
diese mit einem Timer zu generieren und daraus per Software die 
langsamen Frequenzen abzuleiten.

>
> Grüße Joe

...

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.