Hallo BlackDevil,
Das dachte ich auch, daher auch meine Einmischung hier.Zitat von BlackDevil
Bitte nimm das nicht als vorwurfsvoll polemisch sondern eher als fachlich-pingelig: Interrupts laufen ja eigentlich fast immer "im Hintergrund". Sprich: Die Unterbrechung ist da, ohne dass "das Programm" was dazu tut - jedenfalls meistens.Zitat von BlackDevil
Jein. Der externe Interrupt ist (lass mich über den mega168 sprechen, da bin ich etwas zuhause) einer von zwei Interrupts mit z.B. folgenden Eigenschaften:Zitat von BlackDevil
1) Sie sind sehr hoch priorisiert - wichtiger als jeder Timer! Beim mega168 kommen die beiden - extINT0 und extINT1 - gleich nach dem RESET-Vektor.
2) Zitat aus dem m168-doc: The INT0 and INT1 interrupts can be triggered by a falling or rising edge or a low level. Ich kann also je nach meinen Wünschen auf eine der beiden Flanken triggern (0 geht auf 1 oder 1 geht auf 0) oder auf den low-Level. Letzteres dürfte mit Vorsicht zu geniessen sein, weil dieser hoch priorisierte Interrupt bei anstehendem low level möglicherweise ständigen Aufruf der ISR bedeutet = Koma für den Controller. Aber das habe ich noch nie ausprobiert.
Der Interrupt kommt kann eben genau dann kommen, wenn eine Signaländerung am Pin ansteht - meiner Meinung nach genau das, was für eine Drehzahlmessung wünschenswert ist. (Beim m168 gibts noch auf praktisch allen Pins den PCI = pin change interrupt, der ähnliches macht).
3) Die Interrupts können ohne Rücksicht auf die Portdefinition kommen (genaueres dazu steht im doc).
4) Die Flankeninterrupts sind zwar an eine Systemclock gebunden, aber der Levelinterrupt nicht. Das heisst, dass der Controller "schlafen" kann - meist aus Energiespargründen und wenn ein Levelsignal erkannt wird, wacht er auf. Es gibt Einschränkungen dazu, steht wieder im doc.
Langer Rede kurzer Sinn - ich finde diese beiden Interrupts für Drehzahlmessung ideal. Aktuell läuft das bei mir so: ein TimerInterrupt mit 50 µs zählt mir eine Variable bis auf 20000 = 1 sec. Der extINTx zählt seine Aufrufe und liest den aktuellen Zeitwert aus. Dieser Zeitwert wird dann im "normalen" Programm und insbesondere in der Regelung ausgewertet. Für mich war das hauptsächliche Entwicklungsziel: Messwert der Drehzeit für die Regelung und Zählwert für die Wegmessung. Wegmessung wird bei mir noch nicht ausgewertet, die Regelung läuft für meine Begriffe perfekt. Auf Wunsch kann ich Dir auch den aktuellen Code posten - wenn Du Dir das nicht lieber selber erarbeiten willst.
Lesezeichen