Interrupts mit Arduino Uno r4 Wifi Probleme

Hallo Zusammen, ich bin neu in dem Bereich Arduino.

Ich habe versucht ein Interrupts auf den Uno r4 Wifi auszulösen.

Hier mal die Sketch:

int counter;
int interruptPin = 3;

void setup() {
  pinMode(interruptPin, INPUT);
  Serial.begin(9600);
  attachInterrupt (digitalPinToInterrupt(interruptPin), interrupt_call, RISING);
}

void loop() {
  Serial.println(counter);
  counter++;
  delay(1000);
}

void interrupt_call() {
  Serial.println("Interrupt!");
}

jetzt das Problem mache ich den Sketch auf ein Uno funktioniert diese auch, aber leider nicht auf dem Uno r4 Wifi dort unterbricht er den countdown (Zähler) aber macht nicht weiter, bei Uno geht das ohne Probleme.

Wo könnte der Fehler liegen?

Dazu kann ich dir empfehlen, das Datenblatt des UNO R4 mal durchzulesen, evtl. hat der ja seine IRQ-Pins an anderer Stelle.
Ich verwenden den nicht, daher kann ich da auch nicht weiter helfen.

Frage, wozu glaubst du dass du deinen interrupt benötigst?
Einerseits blockierst du mit delay dein Programm, und dann schreibst du in deiner Interrupt Service Routine auch noch mit Serial etwas raus. Dazu verwendet man eine ISR eigentlich nicht.

Beschreib besser mal was du eigentlich vor hast.

Den Uno r4 Wifi habe ich nicht, weshalb ich Dir leider bei Deinem konkreten Problem nicht helfen kann.

Aber diese Kombination halte ich für schwierig. Wenn "Moba" im Namen Programm ist, dann gibt es für Deine Aufgabenstellung vermutlich eine einfacher zu handhabende Lösung. In diesem Forum sind ein paar Modellbahner aktiv, die Dich beraten können.

Wenn Du Wifi nutzen möchtest, ist der ESP32 zum Einstieg meines Erachtens einfacher zu programmieren als der UNO R4 Wifi.

Getestet mit einem ESP32, mit geänderter Pinnummer wohl aber auch auf einem UNO R3 lauffähig:

Testprogramm
#include <MobaTools.h>  // mittels Bibliotheksmanager zu installieren
MoToTimer timer1;
int counter;
int interruptPin = 33;
bool intAktiv = false;

void setup() {
  pinMode(interruptPin, INPUT_PULLUP);
  Serial.begin(115200);
  delay(500);
  Serial.println("\nStart!");
  attachInterrupt (digitalPinToInterrupt(interruptPin), interrupt_call, RISING);
}

void loop() {
  if ( !timer1.running() ) {
    timer1.setTime( 1000 );
    Serial.println(counter);
    counter++;
  }
  if (intAktiv) {
    intAktiv = false;
    Serial.println("Interrupt!");
  }
}

void interrupt_call() {
  intAktiv = true;
}

Die Bibliothek MobaTools hilft bei manchen Aufgaben, daher mal hier im Einsatz.

Hallo,
schau mal hier ob Du was findest
https://docs.arduino.cc/tutorials/uno-r4-wifi/cheat-sheet/

oder hier gleiches Problem denke ich

Serial.print() und Interrupts gehen nicht zusammen.

Warum nicht? Was macht Serial.print() so besonders, dass man es bei ein ISR nicht verwenden darf?

Die serielle nutzt auch IRQ und macht zudem die Verarbeitung langsamer.

Oben wird zwar gesagt, dass das beim UNO R3 funktioniert, aber das ist falsch, zumindest nicht richtig.

Denn:

  1. Innerhalb von Interrupt Routinen werden Interrupts gesperrt.
  2. Serial benötigt Interrupts um seine Daten auszuliefern

Das geht solange gut, bis die FIFO des Serial voll ist, dann bleibt der R3 stehen.

Beim R4 sieht das alles etwas anders aus. Aber das Prinzip bleibt gleich, trotz 32Bit ARM µC und anderer Prioritätenverwaltung,
Tipp: Datenblatt des µC lesen.

int ist Vorzeichen behaftet.
Ein Überlauf einer solchen zahl ist in C++ verboten und endet im "Undefined behavior"

Dann, zusätzlich:
Beim R3 muss auf die Variable atomar zugegriffen werden.
Beim R4 sollte volatile reichen.

1 Like

Ein Interrupt bedeutet alles liegen zu lassen und exklusiv was anderes zu machen.

Du schreibst einen Brief und legst ihn in den Postausgang. Der Postbote klingelt und du lässt alles liegen und gibst die gesammelten Briefe raus.

Angenommen deine Postbox ist voll und du machst einen Interrupt:

Lasse alles liegen und schreibe einen Brief. Warte bis deine Postbox leer ist um den Brief reinzulegen. Die Tür klingelt, aber da du schon im "alles liegen lassen" Modus bist ignoriert du die erstmal...

Wenn der Ausgabepuffer voll ist, wartet die write-Methode, bis wieder ein Zeichen in den Puffer passt. In einer ISR auf einen anderen Interrupt warten geht aber nicht.
Solange du weniger in den Ausgabepuffer schreibst als reinpasst, funktioniert das Ganze sogar (jedenfalls auf einem Uno R3, der kein Betriebssystem hat). Aber ein Problem das nur selten auftritt, ist erheblich schwieriger zu lösen.

Was beim R4 Wifi im Hintergrund noch läuft, weiß ich allerdings auch nicht.

attachInterrupt verursacht grundsätzlich mehr Probleme als es löst.
Und ist nicht die Basis für Multitasking.

Der R4 Wifi hat 2 CPUs. Ein ESP32-S3 und ein RA4M1. Es wird nur der RA4M1 programmiert. Es gibt hier kein spezielles Betriebssystem.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.