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.
@ 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
Soweit ich weiß hat der mega16 noch keinen Pin Change Interrupt (ausser die 3 INT0..2).
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.
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.
>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.
>>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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.