mikrocontroller.net

Forum: Compiler & IDEs Grundsätzliche Frage zu Interrupts


Autor: Fritz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Tobi (Gast)
Datum:

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

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Fritz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Fritz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Tobi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oder eine Handvoll Dioden (ca. 8)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.