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...
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.
Das ist natürlich keine "smarte" Lösung, da du den "Ziel"timer damit nicht zurücksetzt oder ähnliches.
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.
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.
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.
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.