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 am NODEMCU
05.09.2019, 18:09
Beitrag #1
Interrupt am NODEMCU
Hallo Leute,

ich möchte mittels Interrupt Impulse zählen. Es zählt auch, aber irgendwie sind das Hausnummern. Ich habe mal einen Mini-Sketch geschrieben und messe die Zeit für 100 Impulse. Der Sketch sieht so aus:

Code:
const int interruptPin = D2;
const int LED = D4; //On board blue LED

uint32_t nX = 0,
         nY = 0,
         nZ = 0;

void setup() {
  Serial.begin(74880);
  pinMode(LED, OUTPUT);
  pinMode(interruptPin, INPUT_PULLUP);

  attachInterrupt(digitalPinToInterrupt(interruptPin), handleInterrupt, FALLING);
}

void loop()
{
}

void handleInterrupt()
{
  nX++;
  Serial.print(nX);
  Serial.print(":  ");
  Serial.println(millis() - nZ);
  nZ = millis();
  if (nX >= 100)
  {
    nY = nX;
    nX = 0;
    Serial.println(millis() - nZ);
    nZ = millis();
  }

}
Von D2 nach GND liegt ein Fototransistor BP103, nach plus geht es über den Pull-Up-Widerstand, die Impulse kommen von einer LED an einem Funktionsgenerator, müsste eigentlich stimmen. Mit Oszi an D2 sieht alles gut aus.
Wenn ich 2 Hz nehme kommt folgendes am Monitor an:

Code:
2 Hz, CANGE

1:  251
2:  249
3:  0
4:  251
5:  249
6:  0
7:  251
8:  248
9:  0

2 Hz, FALLING

1:  248
2:  251
3:  249
4:  252
5:  248
6:  251
7:  249
8:  251
9:  249

2 Hz, RISING

1:  500
2:  0
3:  500
4:  0
5:  500
6:  0
7:  500
8:  0
9:  500
10:  0

Meiner Meinung nach müssten doch bei FALLING und RISING jeweils 500 mS zwischen den Impulsen liegen. Bei CHANGE habe ich 2 mal 250 mSec, aber ein Mal 0 mSec. Ich habe das Gefühl hier mischt noch irgendwas anderes mit.
Wo liegt mein Denkfehler????

Viele Grüße

Uwe
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
05.09.2019, 18:21
Beitrag #2
RE: Interrupt am NODEMCU
Vielen Dank,
für deine schnellen Rückmeldungen!

https://www.arduinoforum.de/arduino-Thre...d-Repeater

Da hilft man gern!

Sollte wahrscheinlich Geheim bleiben. Oder geht immer noch nicht.

Na dann, viel Spaß.

Meine Esp8266 & ESP32 Projekte
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
05.09.2019, 18:27
Beitrag #3
RE: Interrupt am NODEMCU
Alle Serial aus der ISR raus.
Alle Variablen, die Du dann innerhalb und Außerhalb der ISR nutzen willst müssen volatile sein.

ny scheint nur eine Kopie von nx zu sein und wird nirgends verwendet.

Im Loop die Variablen auslesen bei ausgeschalteten Interrupts:
Code:
volatile uint32_t  nx;
volatile uint32_t  nz;

// lesen
uint32_t tnx,tnz;
cli();  // Interrupts sperren
tnx = nx;
tnz = nz;
sei(); // Interrupts freigeben
// hier kannst Du dann was mit tnx und tnz machen.

// ISR
void ICACHE_RAM_ATTR handleInterrupt()
{
  nX++;
  nz = millis();
}
Das ICACHE_RAM_ATTR sorgt dafür, dass die ISR in einem speziellen Speicherbereich steht, der nicht ausgelagert wird.
Ich weiß nicht, ob man das noch braucht, früher war es nötig.

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
05.09.2019, 19:45 (Dieser Beitrag wurde zuletzt bearbeitet: 05.09.2019 20:05 von uk1408.)
Beitrag #4
RE: Interrupt am NODEMCU
(05.09.2019 18:21)Fips schrieb:  Vielen Dank,
für deine schnellen Rückmeldungen!

https://www.arduinoforum.de/arduino-Thre...d-Repeater

Da hilft man gern!

Sollte wahrscheinlich Geheim bleiben. Oder geht immer noch nicht.

Na dann, viel Spaß.

Ich weiß jetzt nicht was das damit zu tun hat und was du da als Rückmeldung erwartest - aber sei es drum....
Ach ja, dass ich bei fritz.box alles sehe war mir bekannt.

@ Thommy
das mit print in der ISR war nur damit ich mal sehe was da passiert. Die Auswertung soll in der Loop gemacht werden, dazu ist auch die Variable nY. Dieser Code sollte nur als Test ohne alles andere sein damit ich mal sehen was da passiert.
Den Rest probiere ich mal aus....

@ Thommy

wenn ich das
void ICACHE_RAM_ATTR handleInterrupt()

reinnehme gibt es beim kompilieren einen Fehler
'handleInterrupt' was not declared in this scope

HuhHuh

Viele Grüße

Uwe
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
07.09.2019, 19:19
Beitrag #5
RE: Interrupt am NODEMCU
So, jetzt habe ich mal noch ein wenig getestet, bin aber nicht weiter gekommen.
Ich habe eine Blink-Schaltung (Blink-Sketch auf einem NANO steuert eine LED an) die z.B. mit 1 Hz (1000 mS/1 mS) läuft. Das klappt.
Diese LED beleuchtet den Fototransistor der an der NODEMCU den Interrupt auslöst. Den Sketch habe ich nochmals geändert und die ISR gekürzt:
Code:
const int interruptPin = D2;
volatile uint32_t nX = 0, nY = 0;

void setup()
{
  Serial.begin(74880);
  Serial.println("Start...");
  pinMode(interruptPin, INPUT_PULLUP);

  attachInterrupt(digitalPinToInterrupt(interruptPin), handleInterrupt, RISING );
}

void loop() {    
  cli();
  if (nY != nX)   {
    Serial.println(nX);
    nY = nX;
  }
  sei();
}

void handleInterrupt() {
  nX = nX +1;
}
Jetzt sehe ich dass bei jedem Impuls (Blitzen) der LED nX um 2 erhöht wird. Wenn ich die Frequenz in Blink ändere (0,2 Hz bis 10 Hz) bleibt dieser Effekt.
An was könnte das liegen?

Thommy: was hat das mit dem volatile auf sich? Ich dachte alles was "ganz oben" global definiert wird ist überall verfügbar?

Viele Grüße

Uwe
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
07.09.2019, 19:42
Beitrag #6
RE: Interrupt am NODEMCU
Warum der um 2 erhöht, weiß ich nicht. Die LED prellt ja eigentlich nicht. Fremdlichteinfluss?

volatile sagt dem Compiler, dass er die Variable nicht optimieren soll, sondern sie einfach so lassen soll, wie sie ist.

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
07.09.2019, 21:35
Beitrag #7
RE: Interrupt am NODEMCU
(07.09.2019 19:42)Tommy56 schrieb:  Warum der um 2 erhöht, weiß ich nicht. Die LED prellt ja eigentlich nicht. Fremdlichteinfluss?
Gruß Tommy

Dachte ich anfangs auch, aber jetzt ist es ja nicht mehr so hell und ich habe LED und Fototransistor zusammen lichtdicht verpackt....

Hier habe ich jetzt was gefunden und damit klappt es. Aber warum? So ganz verstehe ich das nicht, aber ist auch schon spät....

Code:
const byte interruptPin = D2;
volatile byte interruptCounter = 0;
int numberOfInterrupts = 0;

void setup() {
  Serial.begin(74880);
  pinMode(interruptPin, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(interruptPin), handleInterrupt, FALLING);
  Serial.println("Start");
}

void handleInterrupt() {
  interruptCounter++;
}

void loop() {
  if (interruptCounter > 0) {
    interruptCounter--;
    numberOfInterrupts++;

    Serial.print("An interrupt has occurred. Total: ");
    Serial.println(numberOfInterrupts);
  }
}

Viele Grüße

Uwe
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
07.09.2019, 21:46
Beitrag #8
RE: Interrupt am NODEMCU
Naja, das ist auch eher voodoo, als reale Programmierung.
Es beseitigt die Ursache nicht, sondern "rechnet" sie nur raus.

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
  Erster Versuch mit "ESP8266 NodeMCU V3" Mathias 6 132 03.07.2020 18:14
Letzter Beitrag: Mathias
  NodeMCU steuert UNO/NANO über I2C Tommy56 18 16.709 19.06.2020 09:34
Letzter Beitrag: Tommy56
  ESP32: flankengetriggerter Interrupt - Spezifikation der "Flanke" georg1010 0 214 13.06.2020 22:47
Letzter Beitrag: georg1010
  D1 Mini Windmessung - Interrupt/Zeitfaktor rev.antun 15 729 13.06.2020 13:00
Letzter Beitrag: nbk83
  ESP32 NodeMCU: Versorgung mit USB und EXT 5V georg1010 7 716 03.05.2020 21:00
Letzter Beitrag: hotsystems
  NodeMCU V3 + rhGeiger ak68 19 2.207 17.04.2020 07:35
Letzter Beitrag: Fips
  NodeMCU -KNX ak68 4 995 12.04.2020 10:22
Letzter Beitrag: ak68
  nodemcu - ota abernauer 12 1.217 11.04.2020 13:21
Letzter Beitrag: abernauer
  ESP8266 NodeMCU mir LCD AnFi 8 1.079 06.04.2020 13:14
Letzter Beitrag: Tommy56
  NODEMCU - SQL-Datenbank abernauer 126 6.765 30.03.2020 22:40
Letzter Beitrag: Tommy56

Gehe zu:


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