www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Pin Change Interrupts - ATmega168 - Pin fesstellen?


Autor: Bastian H. (bastianh)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

ich bin noch recht neu auf dem Gebiet der mC also bitte entschuldigt
falls diese Frag doof ist.

Also ich benutze einen ATmega168 und Programmiere mit WinAVR. Ich
möchte mehrere Taster per Interrupt "abfragen". Funktioniert soweit
auch erstmal jetzt stellt sich mir nur die Frage: wie kann ich in der
Interruptroutine herausfinden welcher Pin den Pin Chanhe Interrupt
ausgelöst hat? Wenn ich mehrere Schalter(oder Taster) habe dann muss
ich ja feststellen können welcher den Interrupt ausgelöst hat.

Schon mal vielen Dank und freundliche Grüße
Bastian Hundt

Autor: peter dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der PCI eignet sich bestenfalls zum Aufwachen, falls man Strom sparen
muß (Batteriebetrieb).

Zum Unterdrücken von Störimpulsen (Elektrostatik) und zum Entprellen
eignet er sich aber überhaupt nicht, das geht am besten mit einem
Timerinterrupt:

http://www.mikrocontroller.net/forum/read-4-310276.html#new


Peter

Autor: Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Entprellen und Interrupts ist nicht wirklich sinnvoll (siehe Peters
Post).
Wenn du allerdings quasi-störungsfreie Signale an den PCI-Eingängen
hast (z.B. Interrupt-Request-Leitungen von externen Bausteinen), dann
kannst du durch einfaches Einlesen des Ports (PINx) und bitweisem
Prüfens die Interrupt-Quelle herausfinden. Zumindest habe ich das
Datenblatt bzw. die PCI-Funktion bis jetzt so verstanden.

Autor: Bastian H. (bastianh)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die schnellen Antworten.

Dan werde ich doch wieder dazu übergehen die Tasten in einer Schleife
abzufragen.

Autor: Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Dan werde ich doch wieder dazu übergehen die Tasten in einer Schleife
abzufragen.

so etwa:
Port in X einlesen
einen Moment WARTEN
Port in y einlesen
mach irgendwas, wenn x=y?

das WARTEN kann man durch einen regelmässigen Timer-Interrupt viel
besser machen, indem man man in der Interrupt-Routine den Port einliest
und guckt, ob sich etwas verändert hat. Wenn sich etwas verändert hat,
kann man ein Flag setzen und in der Hauptschleife darauf reagieren.
In der Codesammlung findet man zu dem Thema schöne Programme von Peter
Dannegger.

Autor: Bastian H. (bastianh)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Ergänzung. Hab mir schon den Quellcode von Peter
(Dannegger) zur Entprellung geholt und werd mal versuchen den zu
verstehen.

Danke euch nochmal für die Antworten!

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.