Forum: Mikrocontroller und Digitale Elektronik esp8266 Port toggelt ungewollt


von Sven (soonic3s)


Angehängte Dateien:

Lesenswert?

Hallo,
Ich habe einen esp8266 board (Lollin wemos D1 mini).
An den Ports sind zwei Taster angeschlossen und Transistoren welche leds 
und einen Laserpointer ansteuern.

Zwei Port Pins (D4 und D0) blinken jetzt aber ungewollt ca. alle 3 sec.

Ich konnte es auf die Zeile: "while(digitalRead(SHOOT_SWITCH));" 
eingrenzen. Sobald diese raus ist blinkt nichts. jemand eine Idee woran 
das liegen kann? Bin überfragt.

Der Schaltplan ist im Anhang.

Hier mein aktueller Code:
1
#define FLASH_LED_1 D5
2
#define FLASH_LED_2 D6
3
#define FLASH_LED_3 D7
4
#define FLASH_LED_4 D8
5
#define FLASH_LED_5 D4
6
#define LASER D0
7
#define SHOOT_SWITCH D1
8
9
10
void setup() {
11
  pinMode(FLASH_LED_1, OUTPUT);
12
  pinMode(FLASH_LED_2, OUTPUT);
13
  pinMode(FLASH_LED_3, OUTPUT);
14
  pinMode(FLASH_LED_4, OUTPUT);
15
  pinMode(FLASH_LED_5, OUTPUT);
16
  pinMode(LASER, OUTPUT);
17
  digitalWrite(FLASH_LED_1, LOW);
18
  digitalWrite(FLASH_LED_2, LOW);
19
  digitalWrite(FLASH_LED_3, LOW);
20
  digitalWrite(FLASH_LED_4, LOW);
21
  digitalWrite(FLASH_LED_5, LOW);
22
  digitalWrite(LASER, LOW);
23
  pinMode(SHOOT_SWITCH, INPUT);
24
  pinMode(SHOOT_SWITCH, INPUT_PULLUP);
25
}
26
27
void loop() {
28
  while(digitalRead(SHOOT_SWITCH)); // solange der Schalter gedrückt ist
29
30
  //digitalWrite(FLASH_LED_1, HIGH);  // turn the LED on (HIGH is the voltage level)
31
  //delay(100);
32
  while(!digitalRead(SHOOT_SWITCH)); // solange der Schalter nicht gedrückt ist
33
34
35
}

von Sherlock 🕵🏽‍♂️ (rubbel-die-katz)


Lesenswert?

Sven schrieb:
> Ich konnte es auf die Zeile: "while(digitalRead(SHOOT_SWITCH));"
> eingrenzen. Sobald diese raus ist blinkt nichts. jemand eine Idee woran
> das liegen kann?

Dieser Eingang legt im Ruhezustand auf HIGH (true) und wenn gedrückt auf 
LOW (false), deine Programmlogik erwartet das Gegenteil. Aber das 
alleine ist noch keine Lösung des Problems, denn solche Endlosschleifen 
sind beim ESP8266 nicht erlaubt. Du löst damit den Watchdog aus, der 
einen Reset auslöst.

Lies das: http://stefanfrings.de/esp8266/index.html#fallstricke

: Bearbeitet durch User
von Rainer W. (rawi)


Lesenswert?

Sherlock 🕵🏽‍♂️ schrieb:
> Das ist eine Endlosschleife, die sind beim ESP8266 nicht erlaubt.

Ein regelmäßiger Aufruf der Funktion yield() würde den Wachhund 
beruhigen.

von Sherlock 🕵🏽‍♂️ (rubbel-die-katz)


Lesenswert?

Rainer W. schrieb:
> Ein regelmäßiger Aufruf der Funktion yield() würde den Wachhund
> beruhigen.

Ach was, wirklich? Hätte ich jetzt nicht gedacht. Wollen wir noch mehr 
Hinweise duplizieren, die bereits auf der "Lies das" Seite stehen?

von Rainer W. (rawi)


Lesenswert?

Sherlock 🕵🏽‍♂️ schrieb:
> Ach was, wirklich? Hätte ich jetzt nicht gedacht. Wollen wir noch mehr
> Hinweise duplizieren, die bereits auf der "Lies das" Seite stehen?

Man kann es doch gleich auf den Punkt bringen, ohne die eigene Seite 
gleich wieder in den Vordergrund zu schieben.

Außerdem sind natürlich die wenigsten Taster so wichtig, dass sie mit 
der maximalen Abfragefrequenz des ESP8266 überwacht werden müssen. Eine 
regelmäßige, timergesteuerte Abfrage ist deutlich sinnvoller.

Beitrag #7800519 wurde vom Autor gelöscht.
von Sherlock 🕵🏽‍♂️ (rubbel-die-katz)


Lesenswert?

Rainer W. schrieb:
> Eine regelmäßige, timergesteuerte Abfrage ist deutlich sinnvoller.

In diesem Programm halte ich den Vorschlag für unnötig komplex.

: Bearbeitet durch User
von Helmut -. (dc3yc)


Lesenswert?

Wie werden die Taster entprellt? Die Input-Ports des ESP sind nicht 
5V-fähig, deswegen müssen die Pullups auf 3.3V gelegt werden. Welche 
FETs werden verwendet? Sind das LogicLevel-Typen für 3.3V? Fragen über 
Fragen...

von Sven (soonic3s)


Lesenswert?

vielen Dank für die schnellen Antworten. Das war das Problem.

Das Programm ist so noch nicht fertig, ich wollte zuerst meine Hardware 
testen. Da es aber wirklich relativ simple ist werde ich es vermutlich 
trotzdem über eine while schleife lösen.

Das Problem mit den Tastern an 5V ist mir auch aufgefallen nachdem ich 
es gelötet hatte. Werde ich vielleicht noch anpassen, aber aktuell 
fließt einfach ein kleiner Strom über dem PullUp und die interne 
Klemmdiode, nicht ideal aber tut erstmal. Die FETs sind logik level und 
die 3,3V reichen zum durchsteuern.

Achja, Entprellung wird dann noch in der software erledigt.

: Bearbeitet durch User
von Sherlock 🕵🏽‍♂️ (rubbel-die-katz)


Lesenswert?

Sven schrieb:
> aktuell fließt einfach ein kleiner Strom über dem PullUp
> und die interne Klemmdiode, nicht ideal aber tut erstmal

Wenn die Spannung am IC dabei größer also 3,6 Volt ist, riskierst du ihn 
zu zerstören.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Sven schrieb:
> aber aktuell fließt einfach ein kleiner Strom über dem PullUp und die
> interne Klemmdiode
Wohin fließt dieser Strom von immerhin 2x 1,5mA? Richtig: nach 3V3. Wo 
wird dieser Strom dann "verbraucht"? Der 5V/3V3 Spannungsregler kann nur 
Strom liefern, aber nicht aufnehmen. Wenn dieser Diodenstrom keinen 
Verbraucher in Richtung GND findet (weil zb der uC im Sleep nur 100uA 
braucht), dann werden einfach die 3,3V auf bis zu 4,7V angehoben. Und 
das ist deutlich über der Spec des ESP.

: Bearbeitet durch Moderator
von Arduino F. (Firma: Gast) (arduinof)


Lesenswert?

Sven schrieb:
> aber aktuell
> fließt einfach ein kleiner Strom über dem PullUp und die interne
> Klemmdiode,

Irrtum!
Eine solche "interne Klemmdiode" gibt es beim ESP8266 nicht.

von Sherlock 🕵🏽‍♂️ (rubbel-die-katz)


Lesenswert?

Arduino F. schrieb:
> Irrtum!
> Eine solche "interne Klemmdiode" gibt es beim ESP8266 nicht.

Ja, meine ESP Chips haben definitiv keine Klemmdiode direkt zwischen I/O 
Pin und VDD. Die meisten anderen CMOS Chips haben eine.

Früher stand das angeblich mal im Datenblatt:

"All digital I/O Pins are protected from over-voltage with a snap-back 
circuit connected between the pad and GND. The snap-back voltage is 
typically 6V, and the holding voltage is 5.8 Volt. This provides 
protection from over-voltages and ESD."

https://hackaday.com/2022/05/12/is-esp8266-5-v-tolerant-this-curve-tracer-says-yes/

Daraus wird alle paar Monate erneut eine 5V Toleranz abgeleitet, doch 
das halte ich für falsch weil direkt darüber klipp und klar steht, dass 
an allen I/O Pins maximal 3,6 Volt zulässig sind. An diesen maximalen 
3,6V hat Espressif nie etwas geändert.

Die Messung die der Typ gemacht hat ist übrigens unglaubwürdig. Er hat 
bei allen Spannungen von 0 bis 6 Volt ungefähr 0,25 mA gemessen. Das 
kann unmöglich sein. Nie im Leben nimmt ein heiler I/O Pin so viel Strom 
auf. Das IC müsste eine negative Ausgangsspannung liefern, um bei knapp 
über 0V und 1kΩ schon auf 0,25 mA zu kommen.

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.