Forum: Compiler & IDEs Grundsätzliche Frage zu Interrupts


von Fritz (Gast)


Lesenswert?

Hallo

Ich hab einen ATmega16 an dem jede Menge Reed Kontakte hängen (ca. 8). 
Ich möchte nun, dass der Controller erkennt wenn ein Kontakt geschlossen 
wird und möglichst unverzögert darauf reagiert. Der Fall, dass 2 
Kontakte (fast) gleichzeitig geschlossen werden muss nicht beachtet 
werden.

Ich habe mir überlegt, dass mit einer Schleife zu machen, die ständig 
alle PIN's überprüft, bin davon aber nicht sehr begeistert.

Ich habe mich deshalb gefragt ob es nicht eine Möglichkeit gibt das via 
Interrupt zu machen. Vielleicht, dachte ich mir, gibt es eine 
Interruptrutine, die immer dann aufgerufen wird, wenn irgendein PIN 
seinen Zuständ ändert, oder so. In der Routine stelle ich dann fest 
welcher PIN es war und führe den entsprechenden Befehl aus. (Um das 
Enprellen braucht ihr euch keine Sorgen machen, das machen wird dann 
schon)

Ist sowas prinzipiell möglich, oder nur mit den drei INT0...2 PIN's? 
(drei sind leider zu wenig)

Von Interrupt's habe ich leider nur sehr wenig Ahnung.

Vielen Dank schon mal.

von Falk B. (falk)


Lesenswert?

@ Fritz (Gast)

>Ich möchte nun, dass der Controller erkennt wenn ein Kontakt geschlossen
>wird und möglichst unverzögert darauf reagiert. Der Fall, dass 2

Wie schnell? In 1us oder 1ms? Soind das Tasten, Endlagenschalter??

>Ich habe mir überlegt, dass mit einer Schleife zu machen, die ständig
>alle PIN's überprüft, bin davon aber nicht sehr begeistert.

Das macht man über eine periodische Abfrage in einem Timer.

>Interruptrutine, die immer dann aufgerufen wird, wenn irgendein PIN
>seinen Zuständ ändert, oder so. In der Routine stelle ich dann fest

Kann man machen, Pin Change Interrupt.

>welcher PIN es war und führe den entsprechenden Befehl aus. (Um das
>Enprellen braucht ihr euch keine Sorgen machen, das machen wird dann
>schon)

naja . . .

>Ist sowas prinzipiell möglich, oder nur mit den drei INT0...2 PIN's?
>(drei sind leider zu wenig)

Pin Change Interrupt.

MFG
Falk

von Tobi (Gast)


Lesenswert?

Soweit ich weiß hat der mega16 noch keinen Pin Change Interrupt (ausser 
die 3 INT0..2).

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Wenn du vom Atmega16 zu einem Atmega wechselst, der PCINT Interrupts 
zulässt, ist dein Problem schon halb gelöst. Jeder Wechsel am Eingang 
löst einen PCINT Interrupt aus und welcher es war steht in einem 
Register. Ein Beispiel für einen solchen PCINT fähigen Atmega ist der 
Atmega168 (und die kleinen Brüder 48 und 88)

Eine andere Lösung wäre alle Signale der REED-Kontakte per ODER auf eine 
der beiden Interrupteingänge zu geben und wenn der Interrupt feuert, den 
Port mit den acht Pins per eigenes Polling in Software abzufragen.

von Fritz (Gast)


Lesenswert?

Danke für die rasche Antowrt.

Es handelt sich um eine Modelleisenbahn. Der Zug hat einen Magneten 
eingebaut und fährt über den Reed-kontakt. Die Sache ist also nicht so 
zeitkritisch. Die Hauptaufgabe des Controllers ist aber eine andere, 
deshalb wollte ich das ständige Abfragen (mit oder ohne Timer) 
vermeiden, auch um das Programm übersichtlich zu halten.

Pin Change Interrupt:
hört sich interessant an. Wie geht das nun genau? bzw wo kann man da 
nachlesen?

Vielen Dank.

von Fritz (Gast)


Lesenswert?

>Eine andere Lösung wäre alle Signale der REED-Kontakte per ODER auf eine
der beiden Interrupteingänge zu geben<

Dann brauch ich aber einen zusätzlichen Hardwarebaustein.

von Tobi (Gast)


Lesenswert?

>>Eine andere Lösung wäre alle Signale der REED-Kontakte per ODER auf eine
>>der beiden Interrupteingänge zu geben<

>Dann brauch ich aber einen zusätzlichen Hardwarebaustein.

Ja.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Oder eine Handvoll Dioden (ca. 8)

von Karl H. (kbuchegg)


Lesenswert?

Wenns ohne Zusatzhardware sein soll:

So ziemlich die meisten Programme haben einen Timer ausschliesslich
dafür reserviert um zb. all 10ms etwas zu unternehmen. Sei es,
dass eine Uhr weitergestellt werden muss, oder dass irgendwelche
Tasten abgefragt werden müssen oder eben auch dass irgendwelche
Kontakte überwacht werden müssen. Du kannst ja mal ausrechnen
wieviele Zehntel-Millimeter deine Modelleisenbahn in 10ms
zurücklegt um zu entscheiden ob eine Erkennung im 10ms Raster
ausreichend ist oder nicht.

Timer, der alle 10ms einen Interrupt auslöst.
Im Interrupt die 8 Eingänge abfragen und feststellen ob einer
davon geschaltet hat. Wie es dann weitergeht hängt von der
Anwendung ab und was im Falle einer Betätigung zu geschehen hat.
Das unterscheidet sich nicht grundsätzlich vom Pin-Change
Interrupt. Auch dort muss ja dann eine Aktion folgen.

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.