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 !
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
@ 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
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...
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.
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 ?
> 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.
...
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
> @ 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
...