Forum: Mikrocontroller und Digitale Elektronik ESP8266<->AVR UART-Probleme


von Sascha B. (bruegae)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,
ich habe auf einer Platine ein ESP8266-01 WLAN Modul per UART mit einem 
Atmega32 verbunden. Zusätzlich habe ich auf die Platine noch ein Display 
gelötet, das ich zum Debuggen nutze.

Um mich mit dem ESP und seinen AT-Commands vertraut zu machen, habe ich 
einen USB-Adapter für den PC genutzt.

Grundsätzlich scheint die Kommunikation zwischen ESP und Atmega32 zu 
funktionieren. Wenn ich die Platine einschalte, erscheint auf dem 
Display der gleiche Text, wie als wenn ich am PC ein „AT+RST“ (reset) an 
den ESP sende (1.jpg, nicht-darstellbare Zeichen wie z.B. \r oder \n 
werden als Kästchen dargestellt).
Wenn ich dann ein „ATE0“ (Echo der AT Commands deaktivieren) an den ESP 
sende, erscheint auf meinem Display nur Datenmüll (2.jpg). Nach meinen 
Tests am PC dem USB-Adapter dürfte hier nur ein „\r\nOK\r\n“ bzw. 
„KästchenKästchenOKKJästchenKästchen“ erscheinen.

„Eigentlich“ funktioniert die UART Kommunikation, aber dann auch wieder 
nicht… Hat jemand eine (noch so wilde) Idee wo mein Problem liegen 
könnte?

: Bearbeitet durch User
von Wilhelm M. (wimalopaan)


Lesenswert?

Können wir Stromversorgungsprobleme des ESP ausschließen?

von Joachim B. (jar)


Lesenswert?

fehlende Abblockkondensaoren?
fehlende 3,3V zu 5V Anpassung?

printen von !isprint(char)?

von Wilhelm M. (wimalopaan)


Lesenswert?

Was kommt bei einem "AT+CIFSR\r\n"?

Läuft evtl. der Buffer (falls vorhanden) des UART über? Nach einem Reset 
sendet der ESP (je nach firmware) ne ganze Menge?

Welche Firmware läuft auf dem ESP?

von Marc V. (Firma: Vescomp) (logarithmus)


Angehängte Dateien:

Lesenswert?

Sascha B. schrieb:
> Wenn ich dann ein „ATE0“ (Echo der AT Commands deaktivieren) an den ESP
> sende, erscheint auf meinem Display nur Datenmüll (2.jpg). Nach meinen
> Tests am PC dem USB-Adapter dürfte hier nur ein „\r\nOK\r\n“ bzw.
> „KästchenKästchenOKKJästchenKästchen“ erscheinen.

 Ja.
 Probiere es mit:
 HardUart => ESP8266
 SoftUart => USB-Adapter => PC

 Alles, was MEGA zum ESP sendet, wird auch zum PC gesendet.
 Alles, was MEGA vom ESP empfängt, wird auch zum PC gesendet.

: Bearbeitet durch User
von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Sascha B. schrieb:
> „Eigentlich“ funktioniert die UART Kommunikation, aber dann auch wieder
> nicht… Hat jemand eine (noch so wilde) Idee wo mein Problem liegen
> könnte?

 Gerade eben gesehen:
 Bei dir ist rst cause eigentlich der Reset Pin und nicht die
 AT+RST.

 Dein Problem könnte mit unzureichender Stromversorgung zusammenhängen.
 99.98% bis 99.99%  ;-)

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

Das ESP Modul bootet bei einem Hard-Reset (bzw. Power-On) mit einer 
anderen Baudrate, als danach verwendet wird. Hast du das berücksichtigt?

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Stefan U. schrieb:
> Das ESP Modul bootet bei einem Hard-Reset (bzw. Power-On) mit einer
> anderen Baudrate, als danach verwendet wird. Hast du das berücksichtigt?

 Weiss er doch, sieht man an seinen Bildern.
 Sein ESP bricht ganz einfach zusammen weil die Stromversorgung nicht
 ausreicht, deswegen wird als Resetursache Resetpin angegeben.

von Empfehlung (Gast)


Lesenswert?

Gerade ist ein schönes deutschsprachiges ESP8266-Praxisbuch auf den 
Markt gekommen. Einfach mal googeln :)

von Sascha B. (bruegae)


Lesenswert?

Zuerst einmal vielen Dank für die zahlreichen Antowrten!

Wilhelm M. schrieb:
> Können wir Stromversorgungsprobleme des ESP ausschließen?

Sollte sich ausschließen lassen. Ich habe einen 2200µF Elko (ziemlich 
dicker Brummer) so dicht wie möglich an VCC gelötet. Davor ging garnix.

Wilhelm M. schrieb:
> Was kommt bei einem "AT+CIFSR\r\n"?

Bin ja noch zu keinem WLAN verbunden...

Wilhelm M. schrieb:
> Läuft evtl. der Buffer (falls vorhanden) des UART über? Nach einem Reset
> sendet der ESP (je nach firmware) ne ganze Menge?

Ich habe eine Ausgabe auf dem LCD, falls das passiert. Ich hab den 
buffer soweit (und noch etwas höher) hochgedreht, bin das Problem weg 
war.

Wilhelm M. schrieb:
> Welche Firmware läuft auf dem ESP?

Bisher die originale. Das Modul am PC sagt:
AT+GMR<\r><\r><\n>AT version:1.1.0.0(May 11 2016 18:09:56)<\r><\n>
SDK version:1.5.4(baaeaebb)<\r><\n>
Ai-Thinker Technology Co. Ltd.<\r><\n>
Jun 13 2016 11:29:20

Marc V. schrieb:
> Bei dir ist rst cause eigentlich der Reset Pin und nicht die
>  AT+RST.

Ich verstehe leider nicht so ganz, was damit gemeint ist.

Stefan U. schrieb:
> Das ESP Modul bootet bei einem Hard-Reset (bzw. Power-On) mit
> einer
> anderen Baudrate, als danach verwendet wird. Hast du das berücksichtigt?

Habe ich tatsächlich nicht gewusst und nicht berücksichtigt. Das Modul 
am USB-Adapter ist mit Baud 115200 dauerglücklich. Damit funktioniert 
auch die initialie Kommunikation mit dem Atmega. Ich werde mal probieren 
die Baudrate nach dem Init umzustellen... omg.

von Stefan F. (Gast)


Lesenswert?

Meine Module senden nach dem Einschalten ihre ersten Boot-Meldungen (wie 
in deinem Screenshot) mit irgendeiner krummen Baudrate. Danach schalten 
sie auf 115200 Baud um. Mein AVR sendet dann fleißig Befehle mit 115200 
Baud.

> Wenn ich die Platine einschalte, erscheint auf dem
> Display der gleiche Text, wie als wenn ich am PC ein „AT+RST“ (reset)
> an den ESP sende

Das würde bedeuten, dass deine Module die Baudrate nicht zwischendurch 
wechseln. Das kenne ich so noch nicht.

> Wenn ich dann ein „ATE0“ an den ESP
> sende, erscheint auf meinem Display nur Datenmüll

Klingt verdächtig nach Absturz, was wiederum meistens durch mangelhafte 
Stromversorgung ausgelöst wird.

2200µF ist vielleicht zu groß. Elkos haben eine große Induktivität. Ich 
verwendet immer 100µF oder 220µF, die ich direkt an VCC+GND an das Modul 
löte. Zusätzlich muss aber auch der Spannungsregler und das Netzteil 
mindestens 400mA für den ESP übrig haben. USB Kabel eignen sich wegen 
ihres hohen Innenwiderstandes häufig nicht.

von Stefan F. (Gast)


Lesenswert?

Welche Kondensatoren hast du dem 3,3V Spannungsregler (LM1117) 
spendiert?

Und mach mal ein Foto von den Leiterbahnen. Ich fürchte, dass eventuell 
eine ungünstige Masse-Führung vorliegt.

von Sascha B. (bruegae)


Lesenswert?

Stefan U. schrieb:
> Klingt verdächtig nach Absturz, was wiederum meistens durch mangelhafte
> Stromversorgung ausgelöst wird.
>
> 2200µF ist vielleicht zu groß. Elkos haben eine große Induktivität. Ich
> verwendet immer 100µF oder 220µF, die ich direkt an VCC+GND an das Modul
> löte. Zusätzlich muss aber auch der Spannungsregler und das Netzteil
> mindestens 400mA für den ESP übrig haben. USB Kabel eignen sich wegen
> ihres hohen Innenwiderstandes häufig nicht.

Als Spannungsregler verwende ich einen LM 1117 T3,3. Der kann laut
Datenblatt 0,8A liefern. Das Display braucht um die 100mA, Controller
und Sensoren auf dem Board deutlich weniger. Sollten also noch
mindestens 500mA für den ESP übrig sein. Das Netzteil hinter dem LM kann
deutlich mehr als 0,8A.

Ich bastle da seit ein paar Tagen dran rum und hatte zuerst nur den 
2200µF aus der Verwandschaft besorgt (was anderes war nicht verfügbar). 
Heute Nachmittag kam aber meine Bestellung mit 100µF und 220µF. Werde 
das direkt mal umlöten.


Stefan U. schrieb:
> Welche Kondensatoren hast du dem 3,3V Spannungsregler (LM1117)
> spendiert?

Davor einen 10µF Elko + 100nF Keramik, dahinter noch einen 100nF Keramik


Stefan U. schrieb:
> Und mach mal ein Foto von den Leiterbahnen. Ich fürchte, dass eventuell
> eine ungünstige Masse-Führung vorliegt.

Habe etwas gemalt:
https://picload.org/image/ragacici/layout.jpg

von Sascha B. (bruegae)


Lesenswert?

Sascha B. schrieb:
> Heute Nachmittag kam aber meine Bestellung mit 100µF und 220µF. Werde
> das direkt mal umlöten.

Ok, 2200µF ist gegen 100µF Elko getauscht. Gleiches Verhalten wie zuvor.

Stefan U. schrieb:
> Ich fürchte, dass eventuell
> eine ungünstige Masse-Führung vorliegt.

Gibt es ein Best Practice, wie man VCC/GND Strippen am Besten ziehen 
sollte um Problemen vorzubeugen? (Ich bin Informatiker, daher kenne ich 
mich mit den Elektronikdingen nicht so gut aus, möchte es aber natürlich 
ordentlich machen und dazulernen)

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

Die Leitungen sind kurz gehalten. Allerdings ist es besser, sie 
Sternförmig zu verbinden - vor allem die GND Leitung. Alle GND Leitungen 
sollen sich im Idealfall am GND Pin des Spannungsreglers treffen.

Ich denke, dass deine Problemursache allerdings woanders liegt. Dein 
Aufbau sieht nicht schlimm aus.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Sascha B. schrieb:
> Marc V. schrieb:
>> Bei dir ist rst cause eigentlich der Reset Pin und nicht die
>>  AT+RST.
>
> Ich verstehe leider nicht so ganz, was damit gemeint ist.

 Schwer an irgendwelche Details ranzukommen, aber soviel habe ich
 rausgefunden:

 Nach Hardreset oder Powerup gibt es gar keine Messages, nur Müll.


 Nach AT+RST kommt erst die Meldung und danach Müll, aber rst cause
 soll 1 sein.
 rst cause 2 steht für Hardreset, da du das nicht gemacht hast, gibt
 es nur 2 Möglichkeiten:

 1) Deine Stromversorgung ist schlecht, ESP resettet sich.
 2) Deine MEGA zieht ESP-RST irgendwie auf Low.

 Zum testen:
 Stromversorgung für ESP (und nur für ESP) unterbrechen.
 Nach ein paar Sekunden wieder verbinden, Müll abwarten.
 AT+RST
 Wenn jetzt rst cause 1 kommt, ist alles OK.
 Wenn wieder rst cause 2 kommt, hat deine MEGA irgendwie den ESP zum
 Reset gebracht (LCD-Leitung ?).

von Marc V. (Firma: Vescomp) (logarithmus)


Angehängte Dateien:

Lesenswert?

AT+RST nach Einschalten (Normal).

von Marc V. (Firma: Vescomp) (logarithmus)


Angehängte Dateien:

Lesenswert?

AT+RST nach Hard Reset.

von Klaus (Gast)


Lesenswert?

Stefan U. schrieb:
> Ich denke, dass deine Problemursache allerdings woanders liegt. Dein
> Aufbau sieht nicht schlimm aus.

Ein Problem, das ich mit den ESP hatte, sind die relativ hochohmigen 
Eingänge. Die halten einen eingenommenen Pegel zum Teil minutenlang. So 
kann der ESP trotz eines fehlenden Pullups an einem der Bootpins eine 
ganze Weile gut funktionieren und geht dann plötzlich in den 
Flash-Modus. Dies betrifft GPIO0, GPIO2 und GPIO15 (hier Pulldown).

MfG Klaus

von Sascha B. (bruegae)


Lesenswert?

Marc V. schrieb:
> Nach AT+RST kommt erst die Meldung und danach Müll, aber rst cause
>  soll 1 sein.
>  rst cause 2 steht für Hardreset, da du das nicht gemacht hast, gibt
>  es nur 2 Möglichkeiten:
>
>  1) Deine Stromversorgung ist schlecht, ESP resettet sich.
>  2) Deine MEGA zieht ESP-RST irgendwie auf Low.

Beim Herumprobieren in diese Richtung habe ich tatsächlich einige neue 
Erkenntnisse gewonnen:
- Die PC-Screenshots im ersten Post dieses Threads zeigen als 
Reset-Cause den RST-Pin. Sehr merkwürdig. Der ESP hängt ja an einem 
USB-Adapter, den ich so in eBay gekauft habe. Ich habe keinen Einfluss 
auf den RST-Pin, ich gebe nur das AT+RST Command ab.

- Beim Einschalten meiner selbstgelöteten Platine gibt der ESP NICHT! 
das gleiche aus wie in den PC-Screenshots zu sehen. Tatsächlich handelt 
es sich um etwa 300 Bytes Datenmüll gefolgt von "Ai-Thinker Technology 
Co. Ltd. ready". Endet genau wie die Antwort auf ein AT+RST, scheint 
aber tatsächlich eine Nachricht zu sein, die mir sagen will, dass der 
Bootup beendet ist und das Gerät nun ready ist. Ist mir bisher nur nicht 
aufgefallen, da der Text auf meiner selbstprogrammierten LCD-Console so 
schnell durchgerauscht ist...

- Egal welchen Command ich nach dem Bootup absetzte, es kommt immer nur 
Datenmüll zurück. Eventuell habe ich ich dort in meinem Code was 
verbockt. Hier mal mein Code (ich verwendete die UART-Lib von Fleury):

#define ESP8266_CHAR_CARRIAGE_RETURN 0x94
#define ESP8266_CHAR_LINE_FEED 0x7A

void sendCommand(char *commandString) {
  uart_puts_p(commandString); //Übergabe an die UART Lib
  uart_putc(ESP8266_CHAR_CARRIAGE_RETURN);
  uart_putc(ESP8266_CHAR_LINE_FEED);
}


void blablub(void) {
    ...
    sendCommand("ATE0"); //echo off
    ...
}

Warum verwende ich nicht '\r' und '\n'? Ich habe mir die beiden 
"Kästchen" nach dem "ready" der Bootup Message in binär ausgeben lassen. 
Eben diese beiden Werte kamen dabei heraus. Wie sendet die die 
AT+Commands?

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Sascha B. schrieb:
> #define ESP8266_CHAR_CARRIAGE_RETURN 0x94
> #define ESP8266_CHAR_LINE_FEED 0x7A

> Warum verwende ich nicht '\r' und '\n'? Ich habe mir die beiden
> "Kästchen" nach dem "ready" der Bootup Message in binär ausgeben lassen.
> Eben diese beiden Werte kamen dabei heraus. Wie sendet die die
> AT+Commands?


 Verstehe ich nicht, kannst du das bisschen näher erklären ?

von Sascha B. (bruegae)


Angehängte Dateien:

Lesenswert?

Marc V. schrieb:
> Verstehe ich nicht, kannst du das bisschen näher erklären ?

Ok, also: Wenn man sich meine 1_*.jpg Bilder aus dem ersten Post 
ansieht, ist ja eine gewisse Ähnlichkeit zu erkennen. Nämlich der letzte 
Abschnitt der Consolenausgabe am PC ist ähnlich der Schrift auf dem LCD. 
Entsprechend müssten die beiden letzten dargestellten Kästchen auf dem 
LCD ja einem CARRIAGE RETURN bzw. LINE FEED Zeichen entsprechen (siehe 
rn.jpg).

Also habe ich das letzte sowie vorletzte Zeichen der Bootup Message 
nicht als Zeichen ausgeben lassen, sondern den 8-Bit Wert eben als 
Binärwert anzeigen lassen. Dabei kam (reproduzierbar) heraus:
- für das vorletzte Zeichen, das vermeintliche '\r': 0b10010100 bzw. 
0x94
- für das letzte Zeichen, das vermeintliche '\n': 0b01111010 bzw. 0x7A

Daher sende ich diese beiden Werte nach dem eigentlichen Befehl.
Ist mein Gedankengang falsch? Wie genau sendest du Daten bzw. "\r\n" an 
den ESP?


Alternativer Code zum Senden von Befehlen:

void sendCommand(char *commandString) {
  uart_puts_p(commandString);
  uart_putc('\r');
  uart_putc('\n');
}

Der ESP sendet mir in diesem Fall als Antwort auf ein einfaches "ATE0": 
"[zig Dutzend Bytes Datenmüll] ERROR" (siehe error.jgp).

: Bearbeitet durch User
von Marc V. (Firma: Vescomp) (logarithmus)


Angehängte Dateien:

Lesenswert?

Sascha B. schrieb:
> Also habe ich das letzte sowie vorletzte Zeichen der Bootup Message
> nicht als Zeichen ausgeben lassen, sondern den 8-Bit Wert eben als
> Binärwert anzeigen lassen. Dabei kam (reproduzierbar) heraus:
> - für das vorletzte Zeichen, das vermeintliche '\r': 0b10010100 bzw.
> 0x94
> - für das letzte Zeichen, das vermeintliche '\n': 0b01111010 bzw. 0x7A
 Kenne ich so nicht, kam bei mir nie heraus - Siehe "Muell.png".

> Daher sende ich diese beiden Werte nach dem eigentlichen Befehl.
> Ist mein Gedankengang falsch? Wie genau sendest du Daten bzw. "\r\n" an
> den ESP?

 Kann das leider nur an ESP testen, die noch hier rumfliegen, ist aber
 kein allzugrosses Problem diese an eine Mega dranzuhängen.
 Obwohl, es ist kein Unterschied, ich sende alle Befehle in
 Grossbuchstaben und CR/LF am Ende - MEGA macht es genauso.
 Genauso sendet es ESP auch zurück.

 P.S.
 AT+RST 0x94-0x7A ergibt keine Reaktion.
 Nach nachträglich gesendeten CR/LF kommt vom ESP "ERROR" zurück.

 P.P.S.
 Vielleicht doch mit Softuart anstatt mit LCD probieren ?

: Bearbeitet durch User
von Sascha B. (bruegae)


Lesenswert?

Oh man, ich habs! Das Problem lag an meiner eigenen Blindheit :(

Fleury's UART Library bietet 2 Funktionen an um Strings zu versenden:
void uart0_puts(const char *s ) und
void uart0_puts_p(const char *progmem_s )

Wie in meinem Quellcode in einem früheren Post zu sehen, habe ich die 
ganze Zeit jene Methode verwendet, die einen String aus dem Program 
Memory versenden kann. Das ist natürlich Murks.


Vielen Dank an alle für die Hilfe!! :)

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.