Forum: Mikrocontroller und Digitale Elektronik Pin Change Interrupt oder Pin pollen?


von Hans (Gast)


Lesenswert?

Hallo,

Um einen Wechsel an einem Pin zu erfassen, kann man ja zu einem einen 
Pin Change Interrupt ausführen, oder diesen Pin immer pollen und sehen, 
wann sich der Zustand geändert hat.
Letzteres hat den Vorteil, dass das Prellen abgefangen werden kann. Ist 
aber auch etwas langsamer.

Wann fragt ihr wie einen pin ab?
Z.b. wenn ein Taster drann geschlossen ist?

Wenn ihr den pin immer pollt und den Zustand abfragt, macht ihr das in 
einem Timer-interrupt oder normal in der while-schleife? (wodurch das 
erfassen noch später kommen kann)

Gibt es noch weitere sachen, wovon ihr es abhängig macht, wie ihr einen 
pin abfragt?

von Michael B. (laberkopp)


Lesenswert?

Hans schrieb:
> Wann fragt ihr wie einen pin ab?

Wenn er ein elektronisches, also prellfreies Signal ist: Per Pin Change 
Interrupt.

> Z.b. wenn ein Taster drann geschlossen ist?

Da Taster prellen: Immer per pollen, man will niemals die gesamte 
Rechenzeit des uC auf Beantwortung von Horden von Interrupts draufgehen 
lassen.

Hans schrieb:
> macht ihr das in
> einem Timer-interrupt oder normal in der while-schleife?

Kommt drauf an. Oftmals ist exaktes Timing egal, dann kommt es in die 
main-loop.

: Bearbeitet durch User
von simpel (Gast)


Lesenswert?

Man sollte eine Einstufung der Prioritäten vornehmen...

Je höher die Priorität eines Zustandswechsels am Pin für die 
Gesamtfunktion ist, umso mehr muß man ihm diese auch einräumen, z.B. 
durch einen Interrupt...

Bei niedriger Priorität ist es Wurscht, ob der Pin in der Mainschleife 
je nach Auslastung mal früher oder später gepollt wird...

Ist es ein mechnischer Taster, kommt noch das Entprellen dazu... ein 
Timerintervall mit der geeigneten Abtastrate ist ein adäquater Weg 
dahin, da die Mainschleife i.d.R. viel zu kurze Intervalle besitzt. Zeit 
verplempern durch Warteschleifen ist machbar, bei wenig beschäftigter 
CPU und wenn das Programm später nicht mehr erweitert werden soll... 
aber man sollte sich die Timerlösung (evtl. mit dem passend getimeten 
Watchdog-Int)angwöhnen.

von M. K. (sylaina)


Lesenswert?

Elektronische generierte Signale frage ich idR in ner ISR ab, mechnisch 
generierte Signale (wie z.B. nen Taster) frag ich via Pollen/Timer ab 
sofern er nicht prellfrei ist (also eine Hardware-Entprellung oder 
ähnliches hat).

von Biene Maja (Gast)


Lesenswert?

Gerade in Frühjahr gibt es durch eine Pollen-Allergie bei vielen 
Menschen einen Interrupt, der eine Taschentuch-Serviceroutine 
beinhaltet.

von Axel S. (a-za-z0-9)


Lesenswert?

Hans schrieb:
> Um einen Wechsel an einem Pin zu erfassen, kann man ja zu einem einen
> Pin Change Interrupt ausführen, oder diesen Pin immer pollen und sehen,
> wann sich der Zustand geändert hat.

> Wann fragt ihr wie einen pin ab?
> Z.b. wenn ein Taster drann geschlossen ist?

Kommt drauf an. Auch bei einem prellenden Taster kann ein Pin-Change 
Interrupt sinnvoll sein. Z.B. um den µC aus dem Tiefschlaf zu wecken.

> Wenn ihr den pin immer pollt und den Zustand abfragt, macht ihr das in
> einem Timer-interrupt oder normal in der while-schleife? (wodurch das
> erfassen noch später kommen kann)

Pollen zur Entprellung macht man immer unter Verwendung eines Timers. 
Da der µC nicht wissen kann, wann der Anwender einen Taster drücken 
wird, muß er den Taster ja ohnehin ständig im Auge behalten. Ein 
Timer-Interrupt im Hintergrund bietet sich daher an.

Die Alternative wäre, den µC ständig in einer Dauerschleife nur die 
Tasten abfragen zu lassen. Wann soll er denn dann noch etwas sinnvolles 
tun? So geht das wirklich nur für simpelste Anwendungen.

von Teo D. (teoderix)


Lesenswert?

Axel S. schrieb:
> Pollen zur Entprellung macht man immer unter Verwendung eines Timers.

Nur nicht in Dipl.Arbeiten, Lehrbüchern etc. Der Leser ist ja dumm, man 
will Ihn ja keinesfalls überfordern. Papier spart's auch noch....

von Erwin D. (Gast)


Lesenswert?

Axel S. schrieb:
> Kommt drauf an. Auch bei einem prellenden Taster kann ein Pin-Change
> Interrupt sinnvoll sein. Z.B. um den µC aus dem Tiefschlaf zu wecken.

Aber dann eben nur zum Aufwecken. Wenn er läuft, pollt man den Pin.

von W.S. (Gast)


Lesenswert?

Hans schrieb:
> Wann fragt ihr wie einen pin ab?
> Z.b. wenn ein Taster drann geschlossen ist?

Warum stellst du so eine eingeengte Anfrage?
Gibt es etwa nur eine einzige Taste?
Und prellt diese?

Nein, allgemein ist das ja so, daß man nicht nur eine einzige Taste am 
Controller dran hat, sondern mehrere - und nichtprellende Tasten gab's 
mal, waren aber wegen der dort verbauten Elektronik teuer.

Deswegen sollte man sich eine Systemuhr in der Firmware gönnen, die 
einen sinnvollen, niedrig priorisierten Timer-Interrupt erzeugt (zumeist 
reicht es aus, alle 10 ms einen davon zu haben). Und eben in dieser ISR 
werden dann alle Tasten bzw. die gesamte Tastaturmatrix abgefragt und 
ggf. entsprechende Tasten-Ereignise generiert.

Eine Ausnahme gibt es, nämlich Drehgeber. Die haben bei schnellem Drehen 
eine für 10 ms Timertick zu hohe Datenrate und das zweite Signal des 
Drehgebers (Richtung) muß zeitnah zum ersten Signal erfaßt werden.

Deshalb ist bei Drehgebern eine Hardware-Entprellung und 
Interruptbetrieb sinnvoll. Natürlich kann man auch pollen, aber das 
muß man dann weitaus häufiger tun, verplempert also mehr Rechenzeit und 
das bloß wegen eines popligen Drehgebers.

W.S.

von Axel S. (a-za-z0-9)


Lesenswert?

W.S. schrieb:
> Eine Ausnahme gibt es, nämlich Drehgeber. Die haben bei schnellem Drehen
> eine für 10 ms Timertick zu hohe Datenrate

Dann nimmt man halt 5ms oder 1ms.

> und das zweite Signal des
> Drehgebers (Richtung) muß zeitnah zum ersten Signal erfaßt werden.

Sofern die Signale auf dem gleichen IO-Port liegen, ist das trivial zu 
machen.

> Deshalb ist bei Drehgebern eine Hardware-Entprellung und
> Interruptbetrieb sinnvoll.

Entprellung in Hardware ist nur bei Wechslern gut machbar. Praktisch 
alle mechanischen Encoder haben reine Schließerkontakte. Da muß man dann 
lange Zeitkonstanten vorsehen, weil es ja auch nach 10.000 
Betriebsstunden noch funktionieren soll, wenn alles etwas klappriger 
geworden ist.

Außerdem ist gerade die enge zeitliche Abfrage beider Phasen im 
Interruptbetrieb schlechter. Da liegt ja mindestens die 
Interrupt-Latenz dazwischen.

> Natürlich kann man auch pollen, aber das
> muß man dann weitaus häufiger tun, verplempert also mehr Rechenzeit

Selbst wenn der µC nur mit 1MHz läuft: der extra Aufwand für das Pollen 
liegt vielleicht bei 20 Taktzyklen je 1ms. Also 2% der Rechenzeit. Das 
ist doch Pillepalle.

von Michael B. (laberkopp)


Lesenswert?

W.S. schrieb:
> und das zweite Signal des
> Drehgebers (Richtung) muß zeitnah zum ersten Signal erfaßt werden.
> Deshalb ist bei Drehgebern eine Hardware-Entprellung und
> Interruptbetrieb sinnvoll.

Uff, du hast Drehgeber leider überhaupt nicht verstanden.

Na ja, kann ja noch kommen: 
https://www.mikrocontroller.net/articles/Drehgeber

Obwohl, du hörst nicht das erste Mal von diesem Link.
Du MÖCHTEST also wohl dumm sterben.

von Stefan F. (Gast)


Lesenswert?

Hans schrieb:
> Wann fragt ihr wie einen pin ab?
> Z.b. wenn ein Taster drann geschlossen ist?

Bei Tastern niemals via Pin-Change Interrupt, weil völlig unklar ist, 
wie oft der aufgerufen wird (wenn der Taster prellt).

von S. R. (svenska)


Lesenswert?

Axel S. schrieb:
> Außerdem ist gerade die enge zeitliche Abfrage beider Phasen im
> Interruptbetrieb schlechter. Da liegt ja mindestens die
> Interrupt-Latenz dazwischen.

Naja, man kann ja im Interrupthandler beide Signale nochmal auslesen. 
Wenn die Interrupt-Latenz so schlecht ist, dass das zu Problemen führt, 
hast du ohnehin andere Probleme (denn dann ist dein Timer-Interrupt auch 
betroffen).

Optimal ist natürlich eine in der Timerhardware integrierte 
Drehgeberdecodiereinrichtung. Die schlägt sowohl Interrupt- als auch 
Pollinglösungen... gibt's aber auf AVRs nicht.

von LostInMusic (Gast)


Lesenswert?

Der tiefere Sinn hinter dieser Pin-Change-Interrupt-Sache ist die 
Möglichkeit, viele Pins zu haben, über die man den Controller aus dem 
Power-Down-Zustand aufwecken kann. Die Anwendung, wo man dieses Feature 
braucht, sind Fernbedienungen. Da hat man viele (matrix-abgefragte) 
Tasten und muss Power-Down nutzen, um Batteriestrom zu sparen.

Ohne PC-Interrupts könnte man dafür die externen Interrupt-Pins 
verwenden, aber von denen gibt es nur einen oder zwei. Bei einer 
Handvoll Tasten kann man noch mit Dioden tricksen, aber zwei Dutzend 
oder noch mehr Tasten sind  nur über eine Tastenmatrix ökonomisch zu 
handlen (geringe Anzahl benötigter µC-Pins + einfaches Platinenlayout) 
und dann scheidet diese Lösung aus.

von Falk B. (falk)


Lesenswert?

W.S. schrieb:
> Deshalb ist bei Drehgebern eine Hardware-Entprellung und
> Interruptbetrieb sinnvoll.

Und täglich grüßt das Murmeltier ;-)

von Erwin D. (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:
> Bei Tastern niemals via Pin-Change Interrupt, weil völlig unklar ist,
> wie oft der aufgerufen wird (wenn der Taster prellt).

Wenn du mit dieser Taste den µC wecken willst, wie geht das ohne 
Interrupt?
Ich schrieb ja schon, wenn er wach ist, pollt man natürlich. Aber zum 
Wecken?

von W.S. (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:
> Bei Tastern niemals via Pin-Change Interrupt, weil völlig unklar ist,
> wie oft der aufgerufen wird (wenn der Taster prellt).

Schreib doch nicht eine derart absolut klingende Antwort.

Gegenbeispiel: Ich hatte vor geraumer Zeit einen µC von Freescale vor 
der Nase, der für seine Portpins eine _Hardware_-Entprellung eingebaut 
hat. Irgend ein Kinetis.

Bei solchen hardwareseitigen Vorkehrungen hast du vom Programm aus ein 
bereits entprelltes Signal und dein obiger Satz ist in solchen Fällen 
eben falsch.

Ebenso falsch wäre er, wenn am Portpin ein bereits extern entprelltes 
Signal vom besagten prellenden Taster anläge. Und fast immer reicht dazu 
1x R/C und ein Schmittriggerverhalten des Portpins aus.



Axel S. schrieb:
> Sofern die Signale auf dem gleichen IO-Port liegen, ist das trivial zu
> machen.

Aber eben nur dann, wenn man entweder auf nen Interrupt reagiert oder in 
recht kurzen Abständen pollt. Bei 10 ms muß man dem Benutzer sagen, daß 
er nur vorsichtig und langsam dran drehen darf.

> Außerdem ist gerade die enge zeitliche Abfrage beider Phasen im
> Interruptbetrieb schlechter. Da liegt ja mindestens die
> Interrupt-Latenz dazwischen.

Hä?
Wovon redest du?
Ganz viele übliche DG haben Rastung und zumindest eines der Signal 
ändert sich weitab von der Rastung. Das ist das Signal, was man entweder 
pollt oder entprellt und nen Port-Change-Interrupt benutzt. Und das 
andere Signal ist zum Zeitpunkt der Änderung des ersten stabil und 
wird zeitnah erfaßt, um die Drehrichtung anzuzeigen. Wenn man zu lang 
wartet (oder eben zeitlich zu weitab gepollt hat), dann merkt man zwar, 
DASS sich was getan hat, aber weil das Richtungssignal sich inzwischen 
geändert hat, verliert man dann eben die Richtung beim Pollen.


Michael B. schrieb:
> Du MÖCHTEST also wohl dumm sterben.

Danke für die Blumen.
Mein Rat: werde hier nicht unsachlich und versuche erstmal einen der 
heutzutage üblichen Drehgeber zu verstehen, bevor du hier dich daneben 
benimmst.


So.
Uff.
Aus den gezeigten Beiträgen sieht man einmal wieder, daß es reinen 
Programmierern immer wieder schwerfällt, sich analoge elektrische 
Vorgänge wirklich vorzustellen.

Als Folge sieht man, daß entweder irgendwelche göttlichen Gebote 
aufgestellt werden ("Du sollst NIEMALS dies oder jenes tun"), oder daß 
Dinge einfach mißverstanden werden - und folglich fällt Softwareleuten 
nichts ein, um an der richtigen Stelle die Dinge in Ordnung zu 
bringen.

Die Folgen sieht man: einen popligen Drehgeber, der nur alle halbe 
Stunde mal gedreht wird, soll man im 1 ms Takt pollen, bloß weil man zu 
unfähig ist, dessen Prellen an der richtigen Stelle zu beseitigen.

Dabei sollten gerade Softwareleute das Allererste, was ihnen beigebracht 
wird, besser erinnern: Hat man störbehaftete Signale, dann muß man sie 
zuerst von den Störungen befreien, bevor man sie zum Erzielen von 
Ergebnissen benutzt.

W.S.

von Zygizmund Zindholz (Gast)


Lesenswert?

Hans schrieb:
> Pin immer pollen und sehen,
> wann sich der Zustand geändert hat.
> Letzteres hat den Vorteil, dass das Prellen abgefangen werden kann

Nein, das ist ein Nachteil.

von W.S. (Gast)


Lesenswert?

Falk B. schrieb:
> Und täglich grüßt das Murmeltier ;-)

Tja.

Das Problem ist, daß es logischemaßen zu allen Zeiten den Nachwuchs 
gibt, der zwar wißbegierig ist, aber noch nichts gelernt hat. Und dem 
muß man eben immer wieder die Dinge erklären.

jaja: ERKLÄREN! und nicht bloß ne eigene Dressur ("sowss MUSS SO UND 
NICHT ANDERS gemacht werden") weitergeben.

Da sind die Einlassungen von Leuten, die in diesem Falle nicht 
begreifen, wozu die Chiphersteller den Pin-Change-Interrupt in ihre 
Chips eingebaut haben, schlichtweg nicht hilfreich.

W.S.

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

W.S. schrieb:
> schlichtweg nicht hilfreich.

Ja, deine Beiträge sind so hahnebüchen, dass diese nicht hilfreich sind.

W.S. schrieb:
> Schreib doch nicht eine derart absolut klingende Antwort.

Du bist lustig, wer schreibt denn hier sonst immer im Absoluten?
Zb bei der Verteufelung von DMA und Debuggern?
Hardwarefilter am Portpin sind aber eher selten (der Raspi hat auch 
welche).
Wegen der Seltenheit ist ersteinmal abzuraten bis der Controllertyp 
bekannt ist.
Wer noch RC Hardwareentprellung macht, dem ist nicht mehr zu helfen.

W.S. schrieb:
> Aber eben nur dann, wenn man entweder auf nen Interrupt reagiert oder in
> recht kurzen Abständen pollt. Bei 10 ms muß man dem Benutzer sagen, daß
> er nur vorsichtig und langsam dran drehen darf.

Alle 1ms nen IRQ wäre aber auch kein Problem, selbst bei mehreren Ports.
Selbst bei vielen UART Baudraten ist die IRQ Last höher.
(Also wieso verteufelst du immernoch einen UART DMA wenn dir alles 
weniger als 10ms zu viel IRQ Last für die CPU ist? Wie blöd bist du 
eigentlich?)

W.S. schrieb:
> Mein Rat: werde hier nicht unsachlich und versuche erstmal einen der
> heutzutage üblichen Drehgeber zu verstehen, bevor du hier dich daneben
> benimmst.

Mein rat: benimm dich erstmal selber im Forum oder wer beschimpft hier 
andauernd Leute im Projekte UNterfprum wenn er nicht genauso schlecht 
programmiert wie du?

Zusammenfassung:
Du bist der größte Dummschwätzer den das Forum je gesehen hat!

von Axel S. (a-za-z0-9)


Lesenswert?

W.S. schrieb:
> Axel S. schrieb:
>> Sofern die Signale auf dem gleichen IO-Port liegen, ist das trivial zu
>> machen.
>
> Aber eben nur dann, wenn man entweder auf nen Interrupt reagiert oder in
> recht kurzen Abständen pollt. Bei 10 ms muß man dem Benutzer sagen, daß
> er nur vorsichtig und langsam dran drehen darf.

Das ist doch albern. Wenn ich einen Drehgeber im Timer-Interrupt polle, 
dann muß ich vorher mal überschlagen, wieviele Zustandswechsel der pro 
Sekunde machen kann und dann lege ich das Timerintervall fest. Genauso 
bin ich bei meinem Platinenbelichter auf 1ms gekommen.

>> Außerdem ist gerade die enge zeitliche Abfrage beider Phasen im
>> Interruptbetrieb schlechter. Da liegt ja mindestens die
>> Interrupt-Latenz dazwischen.
>
> Hä?
> Wovon redest du?

Wovon redest du?

> Ganz viele übliche DG haben Rastung und zumindest eines der Signal
> ändert sich weitab von der Rastung. Das ist das Signal, was man entweder
> pollt oder entprellt und nen Port-Change-Interrupt benutzt. Und das
> andere Signal ist zum Zeitpunkt der Änderung des ersten stabil und
> wird zeitnah erfaßt, um die Drehrichtung anzuzeigen.

Ja. Eben. Du mußt es zeitnah abfragen. Wann du es abfragen mußt, sagt 
dir aber der Interrupt. Der wird ja mit der Flanke des einen Signals 
ausgelöst. Und erst in der ISR, einige Dutzend Takte später kannst du 
das zweite Signal abfragen. Sie werden also gerade nicht gleichzeitig 
abgetastet. Und das zusätzliche Abtasten des ersten Signals in der ISR 
bringt auch nichts, weil das Ereignis ja die Flanke ist. Und die ist 
lange vorbei, wenn die ISR angesprungen wird.

Wenn die Entprellung jetzt noch ein bißchen Verzögerung rein bringt und 
der Interrupt vielleicht verspätet ausgeführt wird (die CPU war gerade 
in einem ATOMIC_BLOCK) dann kann es schon zu spät sein. Und die tolle 
Flankenmethode  zählt den Impuls in der falschen Richtung.

Beim Pollen fragt man immer beide Signale gleichzeitig ab. In der 
Timer-ISR. Das Ereignis (Zustandwechsel) kriegt man durch den Vergleich 
mit den Werten vom letzten Mal raus.

> Die Folgen sieht man: einen popligen Drehgeber, der nur alle halbe
> Stunde mal gedreht wird, soll man im 1 ms Takt pollen

Und was ist daran jetzt das Problem? Selbst auf einem sehr langsam 
getakteten µC braucht man dafür nur 1 oder 2% CPU-Zeit. Kriegst du Geld 
dafür, wenn der µC statt dessen in der Main-Loop herumidled?

Wenn der Drehgeber still steht, dann braucht man einen IO-Zugriff, 
einmal das Ausmaskieren von 2 Bits, einen Vergleich und den bedingten 
Sprung zum Ende der Auswertung. 20 Taktzyklen sind dafür sehr sehr 
großzügig angesetzt.

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.