Forum: Mikrocontroller und Digitale Elektronik Atmel AVR Timer/counter


von Thomas (Gast)


Lesenswert?

Hi,

gibt es bei den AVRs eine möglichkeit einen Timer durch eine externe 
Signalquelle zu Stoppen bzw zu starten?

Also angenommen  PinX =1 dann soll timerX enabled sein.
Klar ich kann den Pin im Programm abfragen (bzw interrupt) und den timer 
dann stoppen/starten aber ich frage mich ob die Hardware das auch 
kann...

von james (Gast)


Lesenswert?

Ne, einen Dis/Enable gibt es in dem Sinne nicht. Wenn ich dich richtig 
verstanden habe, willst du über den Zustand einer externen Leitung 
bestimmen, ob der Timer weitergezählt wird oder nicht.

Wenn du noch die entsprechenden Resourcen frei hast, kannst du was 
tricksen.
Nimm einen Timer und lass den Pulse auf einem der zugehörigen Outputpins 
ausgeben. Einen zweiten Timer lässt du von einem externen Pin counten 
(können nicht alle Timer). Du verbindest den Output des einen Timers mit 
dem Input des zweiten über einen 4k7 Widerstand. Jetzt kannst du auf dem 
Inputpin des zweiten Timers über einen Openkollektor (Transistor) das 
Taktsignal unterdrücken, wenn du den Openkollektor einschaltest. Wenn du 
keine invertierte Logik willst, musst eben eine Kaskade aus zwei 
Transistoren aufbauen.

von james (Gast)


Lesenswert?

Das ist natürlich keine "smarte" Lösung, da du den "Ziel"timer damit 
nicht zurücksetzt oder ähnliches.

von Thomas E. (thomase)


Lesenswert?

james schrieb:
> Wenn ich dich richtig
> verstanden habe, willst du über den Zustand einer externen Leitung
> bestimmen, ob der Timer weitergezählt wird oder nicht.

Wenn ich ihn richtig verstanden habe, will er mit externen Ereignissen 
den Timer starten und stoppen, um damit die Zeit zwischen diesen beiden 
Ereignissen zu bestimmen.

Thomas schrieb:
> aber ich frage mich ob die Hardware das auch
> kann...

Nein.
Und das muss sie auch nicht. Für eine Zeitmessung gibt es Input Capture. 
Tritt am entsprechenden Pin ein Ereignis ein, d.h. ein Pegelwechsel, der 
konfigurierbar ist auf High oder Low, wird der aktuelle Timercounter in 
ein Register, das Input Capture Register, geschrieben und ein Interrupt 
ausgelöst. Damit hat man alles, um die Zeit zu messen.

Aber vielleicht solltest du einmal mitteilen, was du genau vorhast.

mfg.

von Thomas (Gast)


Lesenswert?

Hallo alle,

danke für die Hinweise.

Ja input capture ist das wohl dann was ich suche. Also ich habe vor eine 
Halbwelle einer Wechselspannung zu messen und die Frequenz zu bestimmen. 
(50hz)

Dazu läuft der Timer mit 1 Mhz und solange die Flanke >0,7V ist 
(Transistor vorgeschaltet) wird gezählt. dann kann man die Frequenz 
berechnen.

von Thomas E. (thomase)


Lesenswert?

Thomas schrieb:
> Hallo alle,
>
> danke für die Hinweise.
>
> Ja input capture ist das wohl dann was ich suche. Also ich habe vor eine
> Halbwelle einer Wechselspannung zu messen und die Frequenz zu bestimmen.
> (50hz)
>
> Dazu läuft der Timer mit 1 Mhz und solange die Flanke >0,7V ist
> (Transistor vorgeschaltet) wird gezählt. dann kann man die Frequenz
> berechnen.

Nein, der Timer läuft ständig.

Bei aufsteigender Flanke wird TCNT ins ICR geschrieben. In der ISR wird 
dann der gesicherte Wert der letzten Messung vom aktuellen Wert in ICR 
subtrahiert und man hat die Anzahl der Takte. Der aktuelle Wert wird 
dann als letzter Wert gesichert.
1
volatile unsigned int Takte;
2
3
ISR(TIMER1_CAPT_vect)
4
{
5
  static unsigned int Letzter = 0;
6
  Takte = ICR1 - Letzter;
7
  Letzter = ICR1;
8
}

Takte kann dann in Zeit oder Frequenz umgerechnet werden. In diesem Fall 
entsprechen 20ms oder 50Hz 20000 Takte.

Das wäre dann für eine Vollwelle. Zur Messung einer positiven Halbwelle 
muss die Flankenerkennung in der ISR jedesmal umgeschaltet werden und 
die Berechnung erfolgen, wenn der Interrupt mit abfallender Flanke 
auftritt.

Aber das tut ja eigentlich nicht Not.

mfg.

von Thomas (Gast)


Lesenswert?

Danke! ich werds mal in bascom versuchen.. ;-)

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.