Go Down

Topic: Interrupt geht nicht hab keinen Rat mehr (Read 524 times) previous topic - next topic

Bodo-Baller

Dec 22, 2019, 11:40 pm Last Edit: Dec 22, 2019, 11:47 pm by Bodo-Baller
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
Code: [Select]
[#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

Doc_Arduino

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.
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

postmaster-ino

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
Dein Problem, Dein Sketch, Deine Bilder.
Ob ich ohne Diese an Deinem Problem arbeiten will, entscheide aber immer noch ich.
Große Buchstaben? Immer wieder, neben Punkt und Komma, gerne gesehen.

Bodo-Baller

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

combie

#4
Dec 23, 2019, 12:44 am Last Edit: Dec 23, 2019, 12:45 am by combie
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:
Quote
Code: [Select]
attachInterrupt(buttonState, TasterUnterbricht, CHANGE);
buttonState ist eine Statusvariable, kein Eingang.
Man sollte keine Dummheit zweimal begehen, die Auswahl ist schließlich groß genug.
Quelle: Jean-Paul Sartre

eriklaux

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

Tommy56

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

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

StefanL38

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

Code: [Select]

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

eriklaux


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

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

Tommy56

Wenn mir einer sagt, daß er schon mit Interrupts auf dem Wemos D1 Wifi erfolgreich gearbeitet hat,
würde mir das genügen !  :)
Meld. Ich habe. Das wäre zwar auch normal im loop gegangen, ich wollte es aber mal mit ISR probieren.

Code: [Select]

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
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

eriklaux

@Stefan :
Antwort hatte sich überschnitten..

Die Deklaration der Interruptroutine hatte ich aus einer Anleitung.

Ich probiere Deine Deklaration einmal aus.

Erik

eriklaux

@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 !  :)

Erik

Tommy56

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

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

eriklaux

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 ... )  :)

Gruß
Erik

Tommy56

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
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

Go Up