Verständnisproblem mit dem Interrupt-Befehl

Ein schönes Hallo in die Gemeinschaft,
ich muss gestehen, dass ich absolut neu in der Gemeinschaft der Arduino-Nutzer bin.

Ich bin nun Nutzer eines Arduino Uno.

Dank Google und Youtube gibt es ja einige sehr gute Anleitungen und Tutorials, aber an einem
Problem hänge ich fest und komme einfach nicht weiter.

Bei der Verwendung des Interrupt Befehls komme ich einfach nicht weiter. Ich möchte einen laufenden Sketch durch die Bedienung eines Rotarry Encoders unterbrechen, und den Wert mittels des Rotarry Encoders verändern. (Vergleichbar mit der Steuerung eines Ofens)

Ich habe mich hierzu an folgendem sehr gut beschriebenen Tutorial orientiert:

Der Verwendete Sketch hierzu:

volatile int encoderWert = 0;

void setup() {
pinMode(2, INPUT);
pinMode(3, INPUT);
attachInterrupt(2, encoderLesen, FALLING);

Serial.begin(9600);
}

void loop() {
Serial.println (encoderWert);
}

void encoderLesen() {
if (digitalRead(3) == HIGH) { encoderWert++; }
else { encoderWert--; }
}

Die Hardware habe ich mehrfach unter Kontrolle exakt wie im Video beschrieben aufgebaut.

Das der Rotarry Encoder wie ein normaler Taster prellt, ist mir bekannt und bewusst.

Aber genau diese Konfiguration funktioniert nicht. Im Serialmonitor ändert sich der Wert nicht.

Habe ich irgendwo einen Denkfehler oder muss man den Ardunio erst noch für die Verwendung einstellen?

Für den ein oder anderen Hilfreichen Hinweis wäre ich sehr Dankbar.

Viele Grüße
Mike

Hi

Hast Du Pull-Widerstände verbaut?
FALLING deutet an, daß die Pins gegen GND gezogen werden und im Idle auf HIGH liegen - dazu müsstest Du Pull-UP-Widerstände benutzen, oder Dein pinMode auf INPUT_PULLUP (interne Pull-UPs einschalten) ändern.

MfG

PS: Du brauchst für so Pipi-Kram keinen Interrupt, so schnell kannst Du den Encoder nicht drehen, daß der Arduino Da ins Schwitzen käme - richtige Programmierung vorausgesetzt.
Auch wirfst Du Auflösung weg, Du prüfst nur bei fallender Flanke des einen Pin, wie der Andere gerade steht.
Und: Code besser in Code-Tags [*code] ... [/*code] - nur ohne Sternchen (geht auch nachträglich)

attachInterrupt(2,

Das solltest du nochmal überprüfen. Pin-Nummer und Interrupt-Nummer sind unterschiedlich.
Beim Uno ist vermutlich

attachInterrupt(0, encoderLesen, FALLING);

was du eigentlich willst.

Hallo ,

ich denke die syntax zum Befehl ist falsch

attachInterrupt(digitalPinToInterrupt(pin), ISR,mode)

schau dir das mal unter Hilfe /Referenz an

Heinz

Hab mir mal das video angeguckt.

Du hast keinen teensy, sondern einen richtigen :slight_smile: Arduino.
Da gibt es einige besser passende Diskussionen.

Auch ob man mit einem Interrupt bei prellenden Kontakten das richtige Werkzeug verwendet, gibt es Meinungen, die sich vom video-Autor unterscheiden.

Erste Grund-Regel für Anfänger: "Interrupts braucht man nicht, bei Bedarf lieber loop schneller machen"

der uno hat doch auch den 328 er chip? wen ja wiie beim Nano.
Interrupt.0 befindet sich beim digitalen Pin 2 bei 328 MCU
Interrupt.1 befindet sich beim digitalen Pin 3 bei 328 MCU

attachInterrupt(1, PIN, Zustand); // Aktiviere Interrupt auf Pin3
attachInterrupt(0, PIN, Zustand); // Aktiviere Interrupt auf Pin2

also die erste zahl gibt den Interrupt an und nicht den Pin! entweder 0 oder 1 Beim 328er MCU Stehen immer nur 2 Interrups zur verfügung.. der Mega hat mehr.

Das ist die alte schreibweise welche man angeblich nicht mehr benutzen sollte. bei klappe es aber auch wunderbar. mit den neuen schreibweise hatte ich Probleme :confused: DigitalPinToInterrupt(Pin)

Syntax
attachInterrupt(digitalPinToInterrupt(pin), ISR, mode); (recommended)
attachInterrupt(interrupt, ISR, mode); (not recommended)
attachInterrupt(pin, ISR, mode); (not recommended Arduino Due, Zero, MKR1000, 101 only)

Parameters
interrupt: the number of the interrupt (int)
pin: the pin number (Arduino Due, Zero, MKR1000 only)
ISR: the ISR to call when the interrupt occurs; this function must take no parameters and return nothing. This function is sometimes referred to as an interrupt service routine.
mode: defines when the interrupt should be triggered. Four constants are predefined as valid values:

LOW to trigger the interrupt whenever the pin is low,

CHANGE to trigger the interrupt whenever the pin changes value

RISING to trigger when the pin goes from low to high,

FALLING for when the pin goes from high to low.

The Due, Zero and MKR1000 boards allows also:

HIGH to trigger the interrupt whenever the pin is high.

https://www.arduino.cc/reference/en/language/functions/external-interrupts/attachinterrupt/

Vielen Dank für Eure Hilfe.
Dank Eurer Tipps habe ich dann nun doch den Fehler gefunden.
Der Vektor war falsch.

Ich wünsche Euch noch ein frohes neues Jahr.

Vielen Dank nochmal.

Mike