INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Interrupt Problem
11.05.2019, 16:07
Beitrag #1
Interrupt Problem
Hallo,

Ich teste hier grade einen Stromzähler den ich mittels S0 auf den ESP8266 bringen möchte. Dieses lasse ich über einen Interrupt laufen, daß auch soweit funktioniert. Das Problem ist nur, das er bei jeden Impuls mal 3 oder mehr Impulse zählt.

Nun habe ich gelesen, daß die Funktion "delay" nicht in der Rutiene funktioniert.
Der Stromzähler liefert Impulse um 100ms .

Frage: Wie kann ich den ausbremsen, daß er nur einen Impuls nimmt?


Im Setup
Code:
#include <Wire.h>
#include <LiquidCrystal_PCF8574.h>
#include <StopWatch.h>
#include <SPI.h>

#define GPIO_PIN 2  // Pin für die S0-Schnittstelle

double imp = 0;
uint8_t led = LOW;

StopWatch MySW;
StopWatch SWarray[5];

LiquidCrystal_PCF8574 lcd(0x27);
int i;
char numbuffer[20];



float kwh, watt;

//---------------------------------------------------------------------
// SETUP
//---------------------------------------------------------------------
void setup() {
  Serial.begin(115200);
  lcd.setBacklight(0);
  lcd.begin(20, 4);
  pinMode(GPIO_PIN, INPUT_PULLUP);
  attachInterrupt(GPIO_PIN, stopwatch, HIGH);
  pinMode(BUILTIN_LED, OUTPUT);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Impulszaehler ");
  lcd.setCursor(0, 1);
  lcd.print("Warte auf signal");
  delay(1000);
  lcd.setBacklight(1);
  delay(1000);
}

//---------------------------------------------------------------------
// Loopschleife
//---------------------------------------------------------------------
void loop() {
  
while (true)
  {

  kwh =  (imp / 1000);
  watt = 3600 / (zeit / 1000);
  Serial.print(imp);
  Serial.print("\t");
  Serial.print(kwh);
  Serial.print("\t");
  Serial.println(watt);

    delay(100);
}
}


//---------------------------------------------------------------------
// Messung der Impulse
//---------------------------------------------------------------------
void stopwatch() {

  MySW.stop();
  zeit = MySW.elapsed();
  imp ++;
  MySW.reset();
  MySW.start();
}


Sieht alles noch ziehlich wüst aus
Ausgabe nach jeden Impuls!
Code:
5.00    0.00    inf
11.00    0.01    inf
16.00    0.02    inf
21.00    0.02    inf
26.00    0.03    inf
32.00    0.03    inf
etc

Gruss Gandi

Ich möchte niemanden reinwaschen, ich möchte den dreck besser verteilenHuh
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.05.2019, 16:23
Beitrag #2
RE: Interrupt Problem
Du hast richtig erkannt, dass delay() in Interruptroutinen nicht funktioniert. Du musst das mit millis() umsetzen.
In einer globalen volatile uint32_t Variablen den Zeitpunkt des 1. Impulses speichern und erst nach x Millis diese wieder auf 0 setzen. Nur wenn die 0 ist zählen.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.05.2019, 23:14
Beitrag #3
RE: Interrupt Problem
Hallo.
Da stellt sich mal grundsätzlich die Frage wie der ESP8266 Interrupts verarbeitet...
Passt das so wie wenn man es für einen ATmega schreiben würde ?
lgbk

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
12.05.2019, 12:24
Beitrag #4
RE: Interrupt Problem (Gelöst)
Moin,

Ich hatte es schon auf dem Uno getestet, der erfolg war genauso wie beim ESP8266.
Auch die Verkürzung der Impulszeit von 100ms auf 60ms brachte nicht gewünschten erfolg. als Lösung hatte ich zufällig das gefunden!
Code:
// Tasten Interrupt mit Entprellung

int LED=13;
volatile unsigned long alteZeit=0, entprellZeit=20;

void setup() {
  pinMode(LED, OUTPUT);    // LED Pin
  pinMode(2, INPUT);       // Pin 2 ist INT0
  digitalWrite(2, HIGH);   // interner Pull up Widerstand auf 5V
  attachInterrupt(0, interruptRoutine, LOW);
  // Pin 2 (INT 0) geht auf 0V (LOW) dann interruptRoutine aufrufen
}

void loop() {
  delay(1000);             // Dauerschleife
}

void interruptRoutine() {
  if((millis() - alteZeit) > entprellZeit) {
    // innerhalb der entprellZeit nichts machen
    digitalWrite(LED, !digitalRead(LED)); // LED umschalten
    alteZeit = millis(); // letzte Schaltzeit merken      
  }
}
Den code habe ich dann auf den ESP angepasst und bis jetzt Läuft es mit vollster zufriedenheit.

Nun hoffe ich das ich mit den millis() keinen Überlauf bekomme.
Sollte das der fall werden muss ich sehen wie ich den alten Impulsstand speichere und dann den Tag neu beginne. Aktiv wird er eh nur ca. 14-15 Std. am tag sein.
Mit dem Code habe ich zumindestens schon mal den erfolg, das er den impuls nur einmal nimmt und da kann der energiezähler auch 200ms für den Impuls liefern.

Ich möchte niemanden reinwaschen, ich möchte den dreck besser verteilenHuh
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
12.05.2019, 14:22
Beitrag #5
RE: Interrupt Problem (Gelöst)
Das überlebt den Überlauf problemlos.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
12.05.2019, 14:54 (Dieser Beitrag wurde zuletzt bearbeitet: 12.05.2019 14:56 von Fips.)
Beitrag #6
RE: Interrupt Problem
(12.05.2019 12:24)Gandalf schrieb:  Nun hoffe ich das ich mit den millis() keinen Überlauf bekomme.
Was soll das denn heißen?
Hoffst du das der Sketch sich nach 20 Tagen aufhängt?

millis() läuft (vorasugesetzt dein Sketch funzt) immer nach 49 Tage 17:02:47 über.

Wenn deine Abfrage richtig programmiertt ist, passiert auch nichts falsches.

Aktueller Screenshot von meinem Sonoff Dual. (1 x Überlauf)
   


Gruß Fips

(12.05.2019 14:22)Tommy56 schrieb:  Das überlebt den Überlauf problemlos.

Klar, wenn er denn einen bekommt!
Big Grin


Grußs Fips

Meine Esp8266 & ESP32 Projekte
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
12.05.2019, 14:59
Beitrag #7
RE: Interrupt Problem
Sonst stellt sich das Problem nicht.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Problem mit Login bei ESP8266 mit ESP-Easy Koenig 2 256 05.05.2019 20:11
Letzter Beitrag: Tommy56
  https Problem mit dem ESP Gandalf 3 377 25.04.2019 23:11
Letzter Beitrag: Tommy56
  ESP32 mittels Keypad-Interrupt aus Deepsleep aufwachen lassen jalu4601 1 438 19.04.2019 20:13
Letzter Beitrag: jalu4601
  Problem mit kaskadierender Ausgabe bei Println und in der Webpage arduino2108 12 2.067 01.03.2019 13:10
Letzter Beitrag: Tommy56
  Problem: Daten seriell von PC zu WeMos D1 Mini übertragen Jacksonwill 5 1.066 17.02.2019 11:56
Letzter Beitrag: Jacksonwill
  ESP-12F/12E Adapter v1.0 Problem camouflage81 16 3.053 23.11.2018 18:26
Letzter Beitrag: Tommy56
  Komisches Problem mit Keypad ParadoxDev 15 2.927 18.05.2018 15:14
Letzter Beitrag: ParadoxDev
  Alternative zu AT-Befehlen (s.u. 2048-Problem) GuaAck 2 1.095 06.02.2018 13:29
Letzter Beitrag: Tommy56
  Problem bei kompilieren eines Beispielsketch - Google Charts Stargazer 7 2.019 14.01.2018 19:21
Letzter Beitrag: Tommy56
  Interrupt bei neuer request AdrianArduino 7 1.657 14.01.2018 14:17
Letzter Beitrag: AdrianArduino

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste