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
Sad Nodemcu wie benutzen? Harry Hirsch 46 26.168 20.06.2019 20:21
Letzter Beitrag: Tommy56
  NODEMCU und ADC an A0 uk1408 3 844 18.06.2019 23:13
Letzter Beitrag: georg01
  Interrupt Problem Gandalf 6 1.068 12.05.2019 14:59
Letzter Beitrag: Tommy56
  ESP32 mittels Keypad-Interrupt aus Deepsleep aufwachen lassen jalu4601 1 819 19.04.2019 20:13
Letzter Beitrag: jalu4601
  NodeMCU bleibt hängen. Wie bekommen ich das mit eine Watchdog hin Franzel007 5 1.545 06.02.2019 18:53
Letzter Beitrag: Franzel007
Question 2x16 LCD an 8266/NodeMCU? ansorgj 4 1.610 25.01.2019 00:24
Letzter Beitrag: Fips
  NodeMCU und HC-SR501 Sensor komisches verhalten Ardu2018 19 7.476 11.01.2019 09:49
Letzter Beitrag: HansDampf
  NODEMCU sendet keine Email mehr 4miranda 9 2.588 15.12.2018 12:21
Letzter Beitrag: Tommy56
  NodeMCU Push Nachricht JanReum 3 2.518 03.11.2018 08:52
Letzter Beitrag: Fips
  NodeMCU und Nano über I2C verbinden Werte sind falsch Franzel007 4 1.611 11.10.2018 12:16
Letzter Beitrag: Franzel007

Gehe zu:


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