-
-
Erfahrener Benutzer
Robotik Visionär
Den ICP per software auszulösen ist nicht nötig und macht auch nicht allzuviel Sinn.
Antworten:
a) Wenn die ICP Funktion aktiviert wird, kann auch ein Interrupt ausgelöst werden.
b) Das ist der Input Capture interrupt.
c) der Interrrupt wird nicht anders benutzt
d) Die Flanke, die das ICP event und damit den Interrupt auslöst kann eingestellt werden (Rgister TCCR1C beim Tiny2313)
e) ja, im Register TIMSK, oder durch Abstellen von ICP in TCCR1C
f) ?
g) Wenn die Zeiten länger werden, sodass der Zähler überläuft, muss man das getrennt behandeln, aber darum sollte man sich später kümmern.
Die Zeitmessung geht am genauesten, wenn man für start und stop die ICP funktion nutzt. Im ICP Interrrupt, von der zuletzt gemessenen Zeit die vorherige abziehen um die Periodendauer zu bekommen. Die Gemessene Zeit merken für das Nächste mal. Man bekommt dan bei jeder passenden Flanke einen neuen Wert für die Periodendauer.
Wenn schon unbedingt der überlauf behandelt werden soll, dann nimmt man dazu den overflow interrrupt, und zählt darin eine integervariable hoch. Diese Integervariable bildet dann die oberen 2 Bytes der Zeit. So weit eigentlich noch ganz einfach, etwas komplizierter wird es dann den Fall zu berücksichtigen, das der overflow und ICP interrrupt fast gleichzeitig auftreten: Es dann möglich, das der ICP Interrrupts schon ausgeführt wird, bevor der overflow Interrupt dran war. Das Merkt man daran, das der ICP Wert sehr klein ( < 1000) ist, und das Signalbit für den overflow Interrrupt an ist. In diesen Fall ist dann der Zähler aus den overflow interrrupt noch um eins zu klein.
So kompliziert sind interrrupts in C eigentlich nicht, man muss nur die richtige Form einmal raus haben (ISR(...) ). Das einzige worauf man achten muss, ist dem Compiler zu sagen, welche variablen von der ISR routine verändert werden, und diese als "volatile" kennzeichnen. Lokale Variablen die zwischen den ISR aufrufen erhalten bleiben sollen sind mit dem Zusatz "static" zu deklarieren.
Das einzige wo ich selber noch ein Problem hätte ist es in C, die 2 unsigned integer Werte (ICP Zeit und Overflow Zäher) einfach zu einer unsigned longint Zahl zusammenzufassen. Wie das auf die langsame Art (mit <<16) geht weiss ich.
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- Anhänge hochladen: Nein
- Beiträge bearbeiten: Nein
-
Foren-Regeln
Lesezeichen