Nicht genug Timer im AVR!

Gast #157050
folgendes Problem:

möchte mit einem ATmega16 zwei Frequenzen (5-5000Hz) gleichzeitig
zählen. Dafür brächte ich eigentlich 3 Timer, einen für das Zeitfenster
(Timer)und zwei zum zählen (Counter). Gibt es da einen Trick wie man mit
den Resourcen im ATmega auskommt? Problem ist auch das ich in der Zeit,
wo die Timer zählen gerne was anderes machen möchte...Hatte mal
überlegt die Entladekurve eines Kondensators als Zeitfenster zu
nehmen...

Gibts da was elegantes?

Gruß
Falk S.
Gast #157051
Wie wäre es wenn du jeden Frequenzeingang auf jeweils einen externen
Interrupt Eingang legst. In jeder Interupt Routine zählst du dann
manuell eine 16Bit Variable hoch. Dann bräuchtest du nur einen Timer
der in regelmäßigen Abständen beide Variablen entsprechend weiter
verarbeitet.
Ansonsten hat der ATMEGA16 eigentlich doch drei Timer.
Gast #157054
Falsch, RTFM. Der Atmega hat zwei 8 Bit und einen 16 Bit Timer. 5kHz zu
zählen dürfte nicht das Problem darstellen, solange du die ISR klein
hältst, was man soundso immer machen sollte.
Gast #157055
Gibt wohl tatsächlich 3 timer...

Ich blätter gerade mal im Datenblatt...ich finde es etwa verwirrend,
das der 8bit Timer und der 16bit timer beide timer1 heißen...dachte
daher man könnte sie nur alternativ benutzen. Zumindest benutzen beide
alternativ den externen Pin T1, oder?

Gruß
Falk S.
Gast #157056
fuer dein vorhaben reicht 1 timer (16 bit)
dann kannst du alle X Sekunden den Timerwert auslesen, resetten und
ausrechnen, was fuer eine Frequenz du am eingang hast

alternativ gibt es aber auch frequenz spannungswandler nur das waere
nciht gerade so genau aber warscheinlich viel einfacher

Gruss Jens
Gast #157057
@Jens123:

Wie stelle ich denn fest, das x Sekunden rum sind, wenn nicht mit einem
weiteren Timer?
Außerdem brauche ich das Signal so alle 100ms...
Gast #157058
ich denke mal er meint, daß du einen timer nimmst
sagen wir mal den 16bit

den stellt du z.B. auf 1sek ein
deine beiden signalquellen hängst du an die externen ints und wenn der
int ausgelöst wird schiebst du den timerwert in ein register und somit
hast du die frequenz da du ja weiß wiel lang eine "timer-einheit"
ist.
Gast #157059
Inzwischen sehe ich sogar die chance 4 signale gleichzeitig zu messen
(was mein Ziel ist). Es gibt 3 externe IR. Gibt es noch eine weitere
Möglichkeit über einen der Pins einen IR zu erzeugen?
Gast #157060
Ja, gibt es...
Analog-Comparator, Timer-Input-Capture...

Übrigens gibt es nur einen Timer1, der hat 16 Bit Breite
Timer0 und Timer2 sind 8 Bit breit.

...
Gast #157061
>Außerdem brauche ich das Signal so alle 100ms...
Wenn du 10mal pro Sekunde die Frequenz misst dürfte es schwierig werden
wenn du am Eingang nur 5Hz hast.
Gast #157062
Es sei denn, man "zählt" nicht die Frequenz, sondern "misst" die
Zeitdauer der Periode (Timer1-Input-Capture und die 3 externen INTs)
und rechnet in Frequenz um.

...
Gast #157063
Ich habs jetzt mit 4 externen Interrupts (IR0, IR1, IR2,
Timer-Input-Capture) realisiert. Klappt prima!

Vielen Dank für Eure Hilfe!

Gruß
Falk S.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 21 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.