Interrupt geht nicht hab keinen Rat mehr

Hallo
Ich habe heute mal mein erstes Interrupt Programm geschrieben.

Habe für meinen Briefkasten eine abfrage gemacht. Wenn die Post da war bekomme ich eine Push- Nachricht auf mein Handy bei meiner Zeitungsrohr auch.
Das Programm läuft auch alles 100 pro.
Jetzt war nur das Problem wenn die Zeitung den Sensor dauerhaft drückt bekomme ich eine Push-Nachricht hintereinander.
Deswegen habe ich jetzt das Programm umgeschrieben mit Interrupt.

Der Interrupt springt aber nicht in das Unterprogramm

Hier mal der Sk

[#include <Pushover.h>
#include <ESP8266WiFi.h>
int d1 = 5; //OLED Pin
int d2 = 4; //OLED Pin 
#define BUTTON 4
#define BUTTON1 5
 
volatile int buttonState = 0;
int          buttonState1 = 0;
 
const char* ssid = "Repeater ";
const char* password = "00000000";
 
Pushover po = Pushover("000000000000","000000000000000000");//Zeitung

Pushover po1 = Pushover("00000000000000000","0000000000000000");// Post
WiFiClient espClient;
 
void setup() {
  Serial.begin(115200);
  pinMode(BUTTON, INPUT_PULLUP);
  pinMode(BUTTON1, INPUT_PULLUP);
  attachInterrupt(buttonState, TasterUnterbricht, CHANGE);
  setup_wifi();
}
 
void setup_wifi() {
 
  delay(10);
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
 
  WiFi.begin(ssid, password);
 
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
 
  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}
 
 
void loop() {


    buttonState1 = digitalRead(BUTTON1);
  if (buttonState1 == LOW) {
    Serial.println("pressed");
   po1.setMessage("Button gedrückt!");
    Serial.println(po1.send());
    delay(300);
  }
 
}
ICACHE_RAM_ATTR void TasterUnterbricht() {       // Sobald der Wert am Pin ändert sich 
  
  buttonState = digitalRead(BUTTON);
  if (buttonState == LOW) {
    Serial.println("pressed");
   po.setMessage("Button gedrückt!");
    Serial.println(po.send());
    delay(10);
  }
}/code] 


Ich weiß nicht warum das TasterUnterbricht  nicht ausführt wir.
Könnte mir BITTE erklären was ich falsch gemacht habe?
Aber BITTE Step by Step

Gruß Bodo

Hallo,

vergiss den Interrupt, polle den Taster weiterhin. Nur musst du ihn so programmieren das er nicht retriggerbar ist. Also dein Programm erst auf erneuten Tastendruck hin reagiert. Dazu musste ihn entprellen und die Pegeländerungen auswerten. Stichwort: nicht nachtriggerbares Monoflop.

Hi

Andere Frage - gerade bei so zeitkritischen Dingen wie ‘die Zeitung wird eingelegt’ sollte ein Interrupt nun wirklich nicht nötig sein - wenngleich Dieser dann trotzdem funktionieren muß.

Mein Herangehen wäre gewesen, im alten Sketch (Den ohne Interrupt) die Flanke auszuwerten, und nicht, ob der Taster betätigt ist.
Also MERKEN, wie der Zustand vorhin war und bei Unterschied diese Flanke auswerten.
Dann kommt nämlich auch nur eine Nachricht - vll. nach einer halben Stunde, daß die Zeitung nicht ganz eingeworfen wurde und nass werden könnte - da sind dem Spieltrieb keine Grenzen gesetzt.

Mit Interrupt und ESP bin ich nämlich draußen - Da soll’s aber Andere hier geben, Die Da Bescheid wissen.

MfG

Hi

Ok werde das mal versuchen mit dem Flanke auszuwerten.
Aber mich würde trotzdem interessieren warum das so nicht geht mit dem Interrupt.
Was hab ich das falsch gemacht oder vergessen zu machen.
Ich möchte ja gern dazu lernen.
Gruß Bodo

Bodo-Baller:
Aber mich würde trotzdem interessieren warum das so nicht geht mit dem Interrupt.
Was hab ich das falsch gemacht oder vergessen zu machen.
Ich möchte ja gern dazu lernen.

Was mir sofort ins Auge gesprungen ist:

attachInterrupt(buttonState, TasterUnterbricht, CHANGE);

buttonState ist eine Statusvariable, kein Eingang.

Hallo zusammen.

Habe das Problem nun auch und will das Thema wieder aufleben lassen.

Ich wollte über eine Photodiode mit dem Wemos D1 Wifi schnelle Impulse einlesen.
Lese diese über Interrupts "auf Flanke" ein und habe das Problem des "Prellens" wie der Themenstarter ?

Dachte, dass es an der Photodiode liegt und habe das Gleiche auf dem UNO probiert :
da funktioniert das mit den Interrupts ohne Probleme !

Um die Diode/Pegel etc. auszuschliessen, habe ich auf dem Wemos einen zyklischen DO programmiert und mit dem DI-Interrupteingang verbunden : gleiches Problem !?

Pinmode, andere Pins etc. habe ich durchprobiert.

Problem müsste somit am Wemos und der Interruptverarbeitung liegen...

Habt ihr hierfür ( mittlerweile ) eine Lösung ?

Gruß
Erik

Deinen Code und die Schaltung sollen wir uns erwürfeln?

Gruß Tommy

Hallo Erik,

wie genau hast du "auf Flanke" programmiert? Dazu müsstet du schon den COde posten oder falls zu lang als attachment anhängen.

Ich erfasse bei einem Ventilator die Drehzahl mit einer kleinen Interrupt-Routine
Das funktioniert prima.

Hier die entsprechenden Code-Ausschnitt:e zusammengefasst

const int RPM_pulses_InputPin = 12;

attachInterrupt(RPM_pulses_InputPin, isr_counting_pulses, RISING);

void IRAM_ATTR isr_counting_pulses() 
{
  RPM_pulses++;  
}

Über die Ursache warum es bei dir nicht funktioniert kann man ohne code nur spekulieren.
Deshalb bitte den Code posten. "Schnelle Impulse" heißt was für eine Maximalfrequenz in Hz?
Einzelne Impulse von 2 femto-Sekunden Dauer wären einfach zu kurz. Ebenso wäre eine Frequenz von 100 MHz einfach zu hoch.
viele Grüße Stefan

Wenn mir einer sagt, daß er schon mit Interrupts auf dem Wemos D1 Wifi erfolgreich gearbeitet hat,
würde mir das genügen ! :slight_smile:

Ich habe extra einen zweiten Wemos bersorgt, um einen Defekt des Wemos Boards auszuschliessen.

Am Arduino UNO geht das mit den Interrupts und gleicher Diodenhardware ohne Probleme !

In den Foren wird häufiger von gleichen Problemen berichtet ( = Mehrfachauslösung des Interrupts ).
Aber Lösungen habe ich keine gefunden.

Ein einfaches Pollen des Einganges geht auch auf dem Wemos.
Eine Interruptverarbeitung mit Rücklesen eines eigenen Ausgang geht schon nicht ( was die Diodenhardware auschliesst ).

Kleine Code-Zusammenfassung :

volatile unsigned long raw_zaehler;

// interrupt routine
void ICACHE_RAM_ATTR interruptRoutine1()
{
raw_zaehler++;
}

Im Setup :
// Zähler
pinMode(D12, INPUT );

attachInterrupt(digitalPinToInterrupt(D12), interruptRoutine1, FALLING);

Mehr ist es nicht ...

Der raw_zaehler zählt hoch , scheinbar solange das Signal ansteht.

Eingang, Flanke und Pinmode habe ich schon variiert.

Gruß
Erik

eriklaux:
Wenn mir einer sagt, daß er schon mit Interrupts auf dem Wemos D1 Wifi erfolgreich gearbeitet hat,
würde mir das genügen ! :slight_smile:

Meld. Ich habe. Das wäre zwar auch normal im loop gegangen, ich wollte es aber mal mit ISR probieren.

const byte regenPin = 2;
const uint16_t PRELL_ZEIT = 5; // in ms
volatile uint16_t regenCounter = 0;
volatile uint32_t lastRegenMillis = 0;

void ICACHE_RAM_ATTR regenISR() {
  if (millis() - lastRegenMillis >= PRELL_ZEIT) {
    regenCounter++;
    lastRegenMillis = millis();
  }  
}

void setup() {
  Serial.begin(115200);
  Serial.println("Start");
  pinMode(regenPin,INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(regenPin),regenISR,FALLING);

}

void getRegenCount() {
static uint16_t regenCounterOld = 0;
uint16_t regenCounterLocal;
uint32_t lastRegenMillisLocal;

  cli();
  regenCounterLocal = regenCounter;
  lastRegenMillisLocal = lastRegenMillis;
  sei();
  if (regenCounterLocal != regenCounterOld) {
    regenCounterOld = regenCounterLocal;
    Serial.print("Counter: ");Serial.print(regenCounterLocal);
    Serial.print(" Millis: ");Serial.println(lastRegenMillisLocal);
  }
}

void loop() {
  getRegenCount();
}

Gruß Tommy

@Stefan :
Antwort hatte sich überschnitten..

Die Deklaration der Interruptroutine hatte ich aus einer Anleitung.

Ich probiere Deine Deklaration einmal aus.

Erik

@Tommy :
so ein Interrupt-Entprellen(!!??) habe ich mir dann auch reingeflick ! :o

Das kann es aber doch nicht sein, wenn das Signal stabil ist und man auf Flanke
abfragt !
Ich wollte seriös arbeiten ! :slight_smile:

Erik

Ich hatte einen mechanischen Schalter, der prellt. Was Du am Eingang hast, kannst nur Du (mit einem Oszi) ermitteln.

Gruß Tommy

Meine Dioden-Shield hat am Arduino Uno mit Interrupt ohne Prellen funktioniert !

Danach hatte ich mir einen einzelnen Ausgang vom Wemos auf den Interrupteingang gelegt !
Das ging schon schief...
Entweder geht die Flankenerkennung nicht oder da ist etwas andere faul.

Den Interrupt habe ich übrigens gewählt, da ich mehrere Zähler parallel abfrage und
auch Daten per Wifi übertrage.
Die Impulse haben 5ms ( aus einem Stromzähler optisch abgegriffen ).
Da will ich nichts verlieren.
Aber selbst wenn ich den Code auf die 3 Zeilen minimiere, "prellt" das Ganze...

( Bei einem mechanischen Taster ist natürlich Interruptverarbeitung kontraproduktiv ... ) :slight_smile:

Gruß
Erik

eriklaux:
Meine Dioden-Shield hat am Arduino Uno mit Interrupt ohne Prellen funktioniert !

Der ESP8266 ist auch um einiges schneller, als der UNO. Evtl. erkennt der eine unsaubere Flanke als 2 Signale, was der UNO nicht schafft. Genau kann da nur ein Oszi helfen.

Gruß Tommy

Wenn ich das "Entprellen" bei WEMOS entferne, habe ich bei Flankenwechsel ca. 300 Zählerinkremente !!

Wenn das Signal nicht wechselt, steht der Zähler und keine Interrupts werden ausgelöst.

Genau so ist es ja auch bei dem digitalen Ausgang des Wemos.
Da müsste ja das digitale Ausgangssignal dann auch schwanken ( was nicht minder schlecht wäre ).

Ich habe auch schon mit Eingangsbeschaltungen( = Widerständen ) rumgespielt.
Das scheint aber auch schon im Shield drin zu sein.

Ich wollte eigentlich keine Doktorarbeit daraus machen ...

Muss wohl weiter grübeln ...

Trotzdem danke erstmal !

Erik

Probiere mal ohne Shield. Ich verwende keins.

Ich nhabe auch noch nie etwas von so einem Effekt am ESP8266 gehört. Im Zweifel würde ich die Ursache in Deiner Hardware vermuten.

Gruß Tommy

PS: Der mechanische Reedkontakt hat ca. 3-5 Mal geprellt. Auch das passt nicht zu Deinen 300 Impulsen.

Hatte doch das Shield schon durch einen digitalen Ausgang aus dem Wemos ersetzt…
Das prellt genau so !

Probiert mit
2 x verschiedene Wemos D1
2 x verschiedene Shields
Verschiedene Digitalausgänge auf verschiedene Eingänge :
immer prellt es ausgiebig !

Am Uno : kein einziger überzähliger Impuls !

Wenn es einfach zu verstehen wäre, hätte ich nicht im Forum nachgefragt ! :smiley:

Gruß
Erik

Arduino Uno arbeitet mit 5V, Das Wemos D1 Mini mit 3,3V.
Könnte es sein das das Signal genau auf der Grenze zwischen LOW/HIGH rumwackelt?

Ein Oszilloskop wäre echt am besten. Wie sieht denn die Schaltungs aus? Kannst du mal einen Schaltplan posten?
Hast du 0815-Operationsverstärker im Hause? Damit könnte man mal einen Schmitt-Trigger mit Hysterese aufbauen.

Dann könntest du mal probieren wie es mit verschieden langen Impulsen ist.
Also gaaanz langsam mit 100 millisekunden anfangen und dann die Impulszeit immer halbieren um zu sehen ob es denn bei langen Impulsen auch so ist oder nur bei kurzen.

Die Beschaltung wie du das angeschlossen hast wäre schon interessant. Vielleicht fängst du dir EMV ein die auch noch Impulse erzeugt.

viele Grüße Stefan

Anbei ein Bild von dem Lichtsensor, welcher mit 3.3 und 5V arbeiten soll und
für den Einsatz des LED-Impulszählens geeignet sein soll.
Der scheint am Wemos D1 R1 wirklich zu prellen.

Der Effekt, dass auch der programmierte digitale (Impuls-)Ausgang auf den Interrupt-Eingang ( D2 auf D12 ) innerhalb des Wemos prellt,
konnte ich nämlich plötzlich nicht mehr nachvollziehen !(?) :disappointed_relieved:
Kann mir das eigentlich nur mit Kontaktierung der einfachen Brücke(??) o.ä. erklären…

In anderen Foren wurde von Einstreuungen vom Wifi-Modul beim Wemos berichtet.
Aber das bezog sich auf den analogen Eingang. :confused:

Ich lasse die Interrupt-Entprellung :’( erst einmal drin und vermesse den Lichtsensor
bei Gelegenheit mit dem Oszi.
Das er am Uno nicht geprellt hat, lässt sich u.U. wirklich mit der Prozessor-Geschwindigkeit erklären.

Erik