Forum: Mikrocontroller und Digitale Elektronik Taster mit externe Interrupt ansteuern


von Nam (Gast)


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 !

von Karl H. (kbuchegg)


Lesenswert?

SIGNAL solltest du nicht mehr verwenden.

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Veraltete_Funktionen_zur_Deklaration_von_Interrupt-Routinen

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
1
ISR( PCINT1_vect )
2
{
3
  ...
4
  rausfinden welcher der Pins den Interrupt ausgelöst hat
5
}

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

von screwdriver (Gast)


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

von Nam (Gast)


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

von Justus S. (jussa)


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...

von Karl H. (kbuchegg)


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.

von Nam (Gast)


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 ?

von Hannes Lux (Gast)


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.

...

von Nam (Gast)


Lesenswert?

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

von gast (Gast)


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

von Peter D. (peda)


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/Entprellung#Komfortroutine_.28C_f.C3.BCr_AVR.29


Peter

von Hannes Lux (Gast)


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=%2Btast*+%2Bentprell*+%2Binterru*&forums%5B%5D=1&max_age=-&sort_by_date=1

...

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.