mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Taster mit externe Interrupt ansteuern


Autor: Nam (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Leute,

es ist bisschen unklar wenn ich die Datenblatt von Atmega88 lese. Ich 
will 4 Taster mit externe Interrupt benutzen. Die 4 Taster werden an 4 
Pins: PCINT8, PCINT9,PCINT10,PCINT11 beschaltet. Jeder Taster hat eigene 
Funktion wenn ich die bestätige. die Frage ist:
Wie kann ich denn für jeder Taster eine ISR in C schreiben ? Wie heißt 
der Interrupt vektor für die Pins. Wie sieht ser Struktur des ISR aus ?

Wie ich vorstelle, sieht ein ISR so aus (aber nicht sicher):

SIGNAL(PCINT8)
{
  // to do something
}

schon mal Danke !

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

Bewertung
0 lesenswert
nicht lesenswert
SIGNAL solltest du nicht mehr verwenden.

http://www.mikrocontroller.net/articles/AVR-GCC-Tu...

Was ist im Datenblatt unklar?
Da steht eindeutig, dass jeder Wechsel an einem der Pins PCINT14..8 
(also deine Pins) einen Pin Change Interrupt 1 auslöst.

Also
ISR( PCINT1_vect )
{
  ...
  rausfinden welcher der Pins den Interrupt ausgelöst hat
}

Hat es einen speziellen Grund, warum du die Tasten unbedingt auf einen 
Interrupt legen willst (zb. Aufwecken aus einem Sleep Mode oder 
dergleichen)

Autor: screwdriver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
kbuchegg schrieb:
>Hat es einen speziellen Grund, warum du die Tasten unbedingt auf einen
>Interrupt legen willst (zb. Aufwecken aus einem Sleep Mode oder
>dergleichen)

Das scheint gerade groß in Mode zu sein, weil auch in anderen Foren 
danach gefragt wird. Hat meiner Meinung nach mit der "Geiz ist 
geil"-Mentalität zu tun. Man möchte seinen µC schonen und nur Code 
ausführen lassen, wenn auch tatsächlich eine Taste gedrückt wird. Oder 
täusche ich mich da?

MFG
screwdriver

Autor: Nam (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Buchegger:
"Da steht eindeutig, dass jeder Wechsel an einem der Pins PCINT14..8
(also deine Pins) einen Pin Change Interrupt 1 auslöst."

JA , das Problem ist das, dass alle 4 Taster haben ein ISR: Pin Change 
Interrupt 1 (PCINT1_vect). Wie ich verstehe, macht der ISR 1 das gleiche 
wenn ich irgendein Taster bestätige. Das will ich aber nicht, weil jeder 
Taster macht was anders.  Wie kann ich dann rausfinden, welche Taster 
von 4 Taster bestätigt wurde ? Damit ich für jeder PCINTx ein ISR 
schreiben kann.

Funktion von der Taster habe ich so vorgestellt: ich mache ein 
Spannungsquelle mit mehre Ausgangsports. Mit 2 Taster kann ich die Port 
wählen und mit 2 andere Taster kann ich dann die auszugebende Spannung 
ändern (hoch und runter).

Gruß,
Nam

Autor: Justus Skorps (jussa)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nam schrieb:

> Taster macht was anders.  Wie kann ich dann rausfinden, welche Taster
> von 4 Taster bestätigt wurde ? Damit ich für jeder PCINTx ein ISR
> schreiben kann.

gar nicht, es gibt nur eine ISR, die sich 8 Pins teilen...du musst 
checken, welcher Pin den nun tatsächlich den Interrupt ausgelöst hat...

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

Bewertung
0 lesenswert
nicht lesenswert
Nam schrieb:
> @ Buchegger:
> "Da steht eindeutig, dass jeder Wechsel an einem der Pins PCINT14..8
> (also deine Pins) einen Pin Change Interrupt 1 auslöst."
>
> JA , das Problem ist das, dass alle 4 Taster haben ein ISR: Pin Change
> Interrupt 1 (PCINT1_vect). Wie ich verstehe, macht der ISR 1 das gleiche
> wenn ich irgendein Taster bestätige.

Genau

> Das will ich aber nicht, weil jeder
> Taster macht was anders.

Na und, macht ja nichts.

Du wirst ja wohl noch in der ISR den PINC einlesen können und mit dem 
vorher gespeicherten Zustand vergleichen können um rauszufinden, welcher 
Pin es denn nun war.
Man braucht nicht für jeden Mückenfurz eine eigene ISR.

> Funktion von der Taster habe ich so vorgestellt: ich mache ein
> Spannungsquelle mit mehre Ausgangsports. Mit 2 Taster kann ich die Port
> wählen und mit 2 andere Taster kann ich dann die auszugebende Spannung
> ändern (hoch und runter).

Und wozu brauchst du da eine Interrupt Lösung?
Ist doch viel zu kompliziert mit all dem notwendigen Entprellkram.

Autor: Nam (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
jetzt ist klar mit dem Interruppt.

ich benutze Interrupt, weil ich momentan keine vernüntiger Lösung finde.
soll ich dann jede Tasterzustand in einem endlos schleife abfragen ?

Autor: Hannes Lux (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> ich benutze Interrupt, weil ich momentan keine vernüntiger Lösung finde.

Ext. Interrupt ist aber die schlechteste Lösung.

> soll ich dann jede Tasterzustand in einem endlos schleife abfragen ?

Nein, aber in regelmäßigen Zeitabständen, von einem Timer 
synchronisiert. Schau mal ins AVR-Tutorial (ASM) unter Entprellung, 
da haben sich einige Leute sehr viel Mühe gegeben, das ausführlich zu 
erklären.

...

Autor: Nam (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Hannes: kannst du mir erklären, wie so ist Ext. interrupt die 
schlechteste Lösung ist ?

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bin zwar nicht Hannes aber bei Interrupts hat man oft Probleme mit 
EMV...das stört bei zyklischem Abfragen der Pins nicht so sehr.

Gruß

Gast

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nam schrieb:
> @ Hannes: kannst du mir erklären, wie so ist Ext. interrupt die
> schlechteste Lösung ist ?

Weil mechanische Tasten prellen.

Du brauchst also in jedem Fall nen Timerinterrupt zum Entprellen.
Und sofort stellt sich die Frage, wozu dann noch extra den externen 
Interrupt, das ist nur verschwendeter Code.
Im Timerinterrupt ist das Flankenerkennen nur noch ein einfacher 
EXOR-Befehl.

http://www.mikrocontroller.net/articles/Entprellun...


Peter

Autor: Hannes Lux (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> @ Hannes: kannst du mir erklären, wie so ist Ext. interrupt die
> schlechteste Lösung ist ?

Das könnte ich, aber ich sehe keinen Sinn darin, denn das ist von 
mehreren Leuten in diesem Forum bereits erschöpfend erklärt worden.

Ein Anfang wäre es, wenn Du mal den oben geposteten Link verfolgen 
würdest. Hier nochmal, für Dich ganz persönlich:

Entprellung

Desweiteren besteht auch noch die Möglichkeit, dieses Forum nach 
Beiträgen zu diesem Thema zu durchsuchen. Hier mal ein Anfang, Du kannst 
ja etwas mit den Suchbegriffen spielen:
http://www.mikrocontroller.net/search?query=%2Btas...

...

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.