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 !
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)
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. ...
@ Hannes: kannst du mir erklären, wie so ist Ext. interrupt die schlechteste Lösung ist ?
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
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 ...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.