Nabend,
ich lasse am Arduino Uno (Atmega328p) mittels PCINT eine Interrupt
Routine durchlaufen. Initialisiert habe ich die Pins mit
1
PCICR = ((1 << PCIE1) | (1 << PCIE2));
2
PCMSK1 = ((1 << PCINT12) | (1 << PCINT13));
3
PCMSK2 = (1 << PCINT20);
Die ISR lautet dann
1
ISR(PCINT1_vect){
2
...
3
uart_string("ISR PCINT1");
4
...
5
}
solange ich die Taste gedrückt halte, die an PC0 (PCINT8) angeschlossen
ist, läuft die ISR immer wieder durch. Lasse ich die Taste los und
drücke sie wieder, passiert nichts.
Eigentlich sollte die ISR doch nur auf Flankenwechsel reagieren, also
wenn ich gedrückt halte nur einmal durchlaufen und beim loslassen wieder
und beim erneuten drücken auch wieder usw.
Oder habe ich da was missverstanden?
Karl H. schrieb:> solange ich die Taste gedrückt halte, die an PC0 (PCINT8) angeschlossen> ist, läuft die ISR immer wieder durch. Lasse ich die Taste los und> drücke sie wieder, passiert nichts.>> Oder habe ich da was missverstanden?
Ja.
Wo hast du in deiner Init Routine irgendetwas am PCINT8 gesetzt ?
Richtig wäre es so:
1
DDRC&=~(1<<PC0);
2
PORTC|=(1<<PC0);
3
PCICR=(1<<PCIE1);
4
PCMSK1=(1<<PCINT8);
Und ein Taster (NO) zwischen PC.0 und GND.
Wieso deine ISR überhaupt angesprungen wird, ist mir unklar. Auf jeden
Fall wird die ISR nicht mit PC.0 getriggert.
Wo du deinen Taster angeschlossen hast...
Karl M. schrieb:> ich rufe keine komplexen Funktionen in einer ISR auf.
Das habe ich auch nur gemacht, um zu sehen, ob ich in die ISR
reinspringe. Sobald das alles zuverlässig funktioniert, wird diese
Funktion wieder entfernt.
Habe aber trotzdem noch einmal ein paar fragen, da mir das alles
merkwürdig vorkommt.
Da ich die internen pullups aktiviert habe, muss ich eigentlich alle
Ausgänge (die für die Tastatur verwendet werden) auf high setzen und
dann spalte 1 auf low schalten, reihen überprüfen, spalte 1 high, spalte
2 low usw.
Aber dann springe ich gar nicht in die ISR rein. Wenn ich allerdings
alle auf low schalte, funktioniert das.
Da macht das für mich aber keinen Sinn mehr. Ich schalte alle auf low,
schalte reihe1 auf low (was ja schon ist) und überprüfe, reihe1->high,
reihe2->low (was ja auch schon ist)...
Oder funktioniert das mit den internen pullups für die ISR nicht? aber
warum nicht?
Hallo,
ich habe diese Routine von Peter Dannegger Peda für eine Tastenmatrix
3x4 Problem im Einsatz.
Beitrag "Re: Tastenmatrix 3x4 Problem"
Kein PCINT sondern Pollen ist angesagt !
Wenn Du das Scan-Schemata verstanden hast, bekommst Du eine Idee, wie
man allg. Tastenmatrix abfragen kann.
Karl M. schrieb:> Kein PCINT sondern Pollen ist angesagt !
ich denke, du meintest Prellen? Dann müsste ich ja immer abfragen, ob
eine Taste gedrückt wurde. Ich wollte eigentlich das Haupt-Programm ohne
direkte Tastenabfrage machen. Durch PCINT kann ich das Haupt-Programm so
durchlaufen lassen und bekomme trotzdem den Tastendruck mit.
Karl H. schrieb:> Karl M. schrieb:>> Kein PCINT sondern Pollen ist angesagt !>> ich denke, du meintest Prellen?
LOL.
Wenn sich Fachleute unterhalten, verstehen die Normaluser kein
einziges Wort.
Egal, ob Pollen richtig oder falsch verstanden (habe ich auch falsch
verstanden).
Trotzdem muss ich so im Hauptprogramm immer aktiv nachfragen, ob eine
Taste gedrückt wurde. Das möchte ich ja vermeiden.
Karl H. schrieb:> Egal, ob Pollen richtig oder falsch verstanden (habe ich auch falsch> verstanden).> Trotzdem muss ich so im Hauptprogramm immer aktiv nachfragen, ob eine> Taste gedrückt wurde. Das möchte ich ja vermeiden.
Ich will nicht sagen, dass diese Absicht grundsätzlich zu kritisieren
wäre, aber warum willst Du im Hauptprogramm nicht aktiv nachfragen, ob
eine Taste gedrückt wurde?
Mal so gesehen:
Abgesehen von der Entprellung und anderen Kleinigkeiten, die "man" im
allgemeinen anders erledigt, wird "man" in der Mehrzahl der Fälle genau
das tun: Im Hauptprogramm aktiv nachfragen, ob eine Taste gedrückt
wurde.
Das ist einfach und braucht weder viel Zeit noch viel Resourcen.
Karl H. schrieb:> Das möchte ich ja vermeiden.
Warum?
Ist dir ein Sturm von Interrupts (beim prellen) lieber?
Du könntest die Tastatur auch in einem Timer Interrupt abfragen. Den
Timer, oder irgendeine Zeit, brauchst du sowieso um prellen zu erkennen.
Ich wollte nicht andauernd nach der Taste abfragen, da ich den
Kontroller, wenn der nichts zu tun hat schlafen legen wollte.
Auch war/bin ich mir nicht sicher gewesen, ob ich, wenn ich eine Taste
drücke, die Funktion aufgerufen wird.
evtl könnte ja auch passieren, dass ich die Taste kurz nach dem
Funktionsaufruf drücke und vor dem Funktionsaufruf wieder losgelassen
habe. Dadurch würde der Tastendruck ja verloren gehen.
Marc V. schrieb:> Karl H. schrieb:>> Karl M. schrieb:>>> Kein PCINT sondern Pollen ist angesagt !>>>> ich denke, du meintest Prellen?>> LOL.> Wenn sich Fachleute unterhalten, verstehen die Normaluser kein> einziges Wort.
Ist doch ganz einfach: Wegen dem Prellen muss man pollen.
Das Pollen muss aber nicht im Hauptprogramm gemacht werden, dazu kann
man auch einen Timerinterrupt nehmen, der z.B. alle 10 ms den Zustand
der Taste abfragt, und wenn sich über 50ms bzw. 5 Interrupts der Zustand
nicht geändert hat, dann hat man die Flanke für "Taste gedrückt" bzw.
"Taste losgelassen" erkannt. Dieses Ereignis schreibt die ISR in eine
Speicherzelle, und das Hauptprogramm reagiert darauf, wenn es grad
passt.
Karl H. schrieb:> Ich wollte nicht andauernd nach der Taste abfragen, da ich den> Kontroller, wenn der nichts zu tun hat schlafen legen wollte.
Gute Idee.
PCint ist dafür gut geeignet.
Aber nur zum wecken.
Danach pollen.
Karl H. schrieb:> evtl könnte ja auch passieren, dass ich die Taste kurz nach dem> Funktionsaufruf drücke und vor dem Funktionsaufruf wieder losgelassen> habe. Dadurch würde der Tastendruck ja verloren gehen.
Hei hei hei ....
Wie viele Tausend Tastendrücke pro Sekunde möchtest du denn auswerten
können?
Michael L. schrieb:> Marc V. schrieb:>> Karl H. schrieb:>>> Karl M. schrieb:>>>> Kein PCINT sondern Pollen ist angesagt !>>>>>> ich denke, du meintest Prellen?>>>> LOL.>> Wenn sich Fachleute unterhalten, verstehen die Normaluser kein>> einziges Wort.>> Ist doch ganz einfach: Wegen dem Prellen muss man pollen.
Aber dann kriegt man doch Heuschnupfen, oder ?
Und die gehen mit Prellen auch nicht weg, oder ?
Marc V. schrieb:> Aber dann kriegt man doch Heuschnupfen, oder ?>> Und die gehen mit Prellen auch nicht weg, oder ?
Kommt noch irgendwas sinnvolles von dir?
Michael L. schrieb:> Kommt noch irgendwas sinnvolles von dir?
Bei so etwas in der ISR ?
1
ISR(PCINT1_vect){
2
usart_transmit_string("ISR 1\r\n");
3
// row 1
4
row1_low;
5
while(PINC&(1<<DDC0)){}
Bei solch einem Unsinn kann nichts sinvolles kommen...
P.S.
Und sich dann beschweren:
Karl H. schrieb:> Aber dann springe ich gar nicht in die ISR rein. Wenn ich allerdings> alle auf low schalte, funktioniert das.