Taster mit externe Interrupt ansteuern

Gast #1366962
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 !
#1366980
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)
Gast #1367041
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
Gast #1367091
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
#1367103
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.
Gast #1367191
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.

...
#1367481
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
Gast #1367485
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

...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren