Forum: Mikrocontroller und Digitale Elektronik AVR über ESP8266 Webserver Flashen


You were forwarded to this site from EmbDev.net. Back to EmbDev.net
von Jürgen (Gast)


Lesenswert?

Hallo,

ich möchte auf meinem AVR eine Webseite erstellen auf der man eine Hex 
Datei einfügt bzw. hochlädt die dann auf auf den AVR geschrieben wird.

Mein Problem ist das der ROM größer als RAM ist und ich die geladene 
Datei nicht zwischenspeichern kann sondern direkt in den Flash laden 
muss.

Meine Frage ist nun ob es eine Möglichkeit gibt über HTML oder JS z.B. 
das nach jeder Zeile oder Zeichenanzahl ein delay eingefügt werden kann.
Ohne eine Verzögerung kommt der AVR mit dem Flashen nicht hinterher.

Vielleicht gibt es auch andere Lösungen an die ich nicht denke..

Ich arbeite mit dem AVR128DA auf C und dem ESP8266 als 
Netzwerkverbindung (HTTP Server der über dem AVR die Seiten bekommt).

Danke.

LG
Jürgen

von Stefan F. (Gast)


Lesenswert?

Die Übertragung zwischen Web Browser und Server (deinem AVR+ESP8266) 
basiert vermutlich auf einem TCP Socket. Dieses Protokoll stellt 
automatisch sicher, dass Daten nicht schneller übertragen werden, als es 
der Empfänger zulässt.

Vermutlich besteht dein Problem darin, dass zwischen der AT Firmware des 
ESP8266 und dem AVR kein Handshake stattfindet. Dieses Problem kannst du 
mit einer eigenen Firmware auf dem ESP8266 lösen.

Eventuell reicht dir auch Quick&Dirty, die serielle Baudrate niedriger 
zu konfigurieren. Schau dir dazu mal die Doku vom AT+UART Befehl an.

Falls ich mit meinen Annahmen falsch liege, reiche bitte alle nötigen 
Infos nach.

von Jürgen (Gast)


Lesenswert?

Stefan F. schrieb:
> Die Übertragung zwischen Web Browser und Server (deinem AVR+ESP8266)
> basiert vermutlich auf einem TCP Socket.

Richtig. Gibts da alternativen? Mir ist nur bekannt das http/https über 
tcp läuft.

Stefan F. schrieb:
> Vermutlich besteht dein Problem darin, dass zwischen der AT Firmware des
> ESP8266 und dem AVR kein Handshake stattfindet. Dieses Problem kannst du
> mit einer eigenen Firmware auf dem ESP8266 lösen.

Das würde ich eigentlich gerne vermeiden, den esp auch noch anzupassen, 
sofern das mein Modell überhaupt zulässt, ich hab eine china version mit 
+,-,en,rst,txd,rxd die Programmierpins sind nicht herausgeführt.

Stefan F. schrieb:
> Eventuell reicht dir auch Quick&Dirty, die serielle Baudrate niedriger
> zu konfigurieren. Schau dir dazu mal die Doku vom AT+UART Befehl an.

Das hört sich gut an, bin aber schlecht im rechen. Mein Controller 
brauch für ein Wort 70us zum schreiben. Funktioniert das dann mit 
9600Baud z.B.? Ohne den zugehörigen Auswertekram mal zu betrachten..
Controller Frequenz könnte ich 24Mhz nutzen.

von Stefan F. (Gast)


Lesenswert?

Jürgen schrieb:
> Gibts da alternativen? Mir ist nur bekannt das http/https über
> tcp läuft.

Meines Wissens nach nicht. Ich würde sehr gerne aus einem Javascript 
heraus Messwerte und Fernbedienungs-Kommandos per UDP übertragen, aber 
habe dazu keine Lösung gefunden.

Jürgen schrieb:
> Mein Controller brauch für ein Wort 70us zum schreiben.
Das sind 28571 Bytes pro Sekunde. Ist der wirklich so schnell?

> Funktioniert das dann mit 9600Baud z.B.?
Das sind 960 Bytes pro Sekunde.

von Jürgen (Gast)


Angehängte Dateien:

Lesenswert?

Stefan F. schrieb:
> Ist der wirklich so schnell?

http://ww1.microchip.com/downloads/en/DeviceDoc/40002183A.pdf
Seite 566.
Steht so zumindest da drin außer ich interpretiere es falsch. 
Problematisch könnte der Pageerase mit 10ms sein. Die Pages löschen 
könnte man aber auch davor mit Sicherheit löschen.

Stefan F. schrieb:
> Meines Wissens nach nicht. Ich würde sehr gerne aus einem Javascript
> heraus Messwerte und Fernbedienungs-Kommandos per UDP übertragen, aber
> habe dazu keine Lösung gefunden.

Da kann ich dir leider nicht helfen da mich UDP nie Interessiert hat..

Stefan F. schrieb:
> Das sind 960 Bytes pro Sekunde.

Danke, pauschal würde ich sagen das es funktionieren könnte wenn ich die 
Werte so ansehe. Ich mach mich mal einfach ran. Dann werde ich es schon 
sehen. Danke auf jeden fall.

von Εrnst B. (ernst)


Lesenswert?

Jürgen schrieb:
> Meine Frage ist nun ob es eine Möglichkeit gibt über HTML oder JS z.B.
> das nach jeder Zeile oder Zeichenanzahl ein delay eingefügt werden kann.

Du kannst den ganzen Flash-Vorgang vom JS aus steuern.

d.H. Der HEX-File-"Upload" bleibt erstmal im Browser
1
<input type="file" id="hex-selector" accept=".hex">

daran einen "change"-Eventlistener, FileReader Objekt erstellen, Hex 
einlesen und parsen.
(FileReader ist praktisch in jedem Browser verfügbar: 
https://caniuse.com/filereader)

Danach kann das JS browserseitig über das Hex laufen, passende Blöcke 
bilden, und in mundgerechten Häppchen an deine ESP-AVR-Kombo senden.

von Jürgen (Gast)


Lesenswert?

Vielen dank, dass hört sich sehr interessant an. Werde mich mal 
einarbeiten.

von Jürgen (Gast)


Lesenswert?

Εrnst B. schrieb:
> danach kann das JS browserseitig über das Hex laufen, passende Blöcke
> bilden, und in mundgerechten Häppchen an deine ESP-AVR-Kombo senden.

Ich möchte mich nochmal für deine Anregung bedanken.
Habe es nach diesem Prinzip gelöst. Die ersten erfolgreichen Flashs 
waren bereits möglich.

Falls es jemanden hilft oder interessiert poste ich folgend den html+js 
code
 ausschnitt zum aufteilen der .hex Datei
1
 <input type="file" accept=".hex" onchange="rF(this)"/>
2
    <script>
3
        function rF(input) {
4
            document.getElementById("t1").innerHTML = "Wait..";
5
            let file = input.files[0];
6
            let reader = new FileReader();
7
            let file_size = file.size;
8
            reader.readAsText(file);
9
            let fg;
10
            reader.onload = function() {
11
                if (reader.result[0] == ':') {
12
                    console.log("true");
13
                    if (file.size > 128 * 1024)
14
                        alert(file.name + " Filesize!");
15
                    else {
16
                        let cnt = 0;
17
                        var ss = reader.result.split(/\r\n|\r|\n/);
18
                        var intr = setInterval(function() {
19
                            var fg = "FXZ!";
20
                            for (let i = 0; i < 4; i++) {
21
                                fg = fg + ss[cnt++];
22
                                if (cnt > ss.length - 2)
23
                                    break;
24
                            }
25
                            navigator.sendBeacon('nload', fg + "?");
26
                            if (cnt > ss.length - 2) {
27
                                clearInterval(intr);
28
                                document.getElementById("t1").innerHTML = "ready";
29
                            }
30
                        }, 1200)
31
                    }
32
                } else
33
                    alert("No HEX File!");
34
            }
35
        }
36
    </script>

-1200 ist die Wartezeit zwischen den Blöcken.
-4 ist die Zeilenanzahl die ein block beträgt.
-FXZ! und ? sind die Charakter zum finden des Blocks im AVR.
-Ich musste den code leider etwas verkürzen um die 2048 Sendezeichen des 
-ESPs nicht zu überschreiten..


Eine frage hätte ich dann noch, wie kann ich ausrechnen was meine 
höchste Baudrate bei 24Mhz ist mit einer 0,2% error?

BG

von Steve van de Grens (roehrmond)


Angehängte Dateien:

Lesenswert?

Jürgen schrieb:
> Eine frage hätte ich dann noch, wie kann ich ausrechnen was meine
> höchste Baudrate bei 24Mhz ist mit einer 0,2% error?

Das steht im Datenblatt. Ich gehe mal von asynchronen Modus aus:

(64 · 24 Mhz) / (8 · 64) = 3000000 Baud

Mit 0% Abweichung, wenn dein Quarz 0% Abweichung hat.

von Sebastian R. (sebastian_r569)


Lesenswert?

Wäre es nicht sinnvoll, die Webseite auf dem ESP zu haben, der dann nach 
Upload der .hex (die problemlos in seinen Flash passen sollte) an den 
AVR-Bootloader per I2C/SPI/UART gibt, um ihn zu flashen?

Ich weiß nicht, irgendwie fühlt es sich komisch an, die ganze Arbeit auf 
einem 8bit-Controller mit begrenztem Flash und RAM zu machen, während 
sich nebendran ein 32bit-Controller mit ordentlich Flash langweilt.

Man könnte den AVR dann als IO-Expander nehmen, wenn man besondere 
Hardware-Funktionen braucht. Alles andere, inkl. Webseite und FW-Update 
dann aufm ESP, oder?

von Jürgen (Gast)


Lesenswert?

Steve van de Grens schrieb:
> (64 · 24 Mhz) / (8 · 64) = 3000000 Baud

Danke, habe die Formel auch gefunden aber mit den falschen Werten 
gerechnet..

Sebastian R. schrieb:
> Wäre es nicht sinnvoll, die Webseite auf dem ESP zu haben, der dann nach
> Upload der .hex (die problemlos in seinen Flash passen sollte) an den
> AVR-Bootloader per I2C/SPI/UART gibt, um ihn zu flashen?

Dem stimme ich ganz zu. Mein ursprünglicher Gedanke wäre auch fast so 
gewesen. Allerdings hätte ich dann über die Webseite den ESP geflasht 
und auf den AVR verzichtet, außer bei zusätzlichen Pin bedarf.
Der Grundgedanke dahinter ist, dass ich alles über WIFI flashen möchte. 
Im jetzigen Fall, dient der ESP einfach als auswechselbares Element, 
welches Datenkommunikation ermöglicht.

Das Problem ist das ich keinen Plan habe wie man einen ESP OTA flasht. 
Im Internet findet man zwar Anleitungen mit einem Arduino aber auf ein 
externes Bauteil möchte ich dann verzichten. Zumindest habe ich beim 
ESP-WROOM32 gesucht, ob es im jetzigen Fall mit einem ESP-M3 anders ist 
weiß ich nicht. Danach habe ich dann nicht mehr gesucht, da es 
aufwendiger schien, als meine jetzige Lösung.

von Sebastian R. (sebastian_r569)


Lesenswert?

Jürgen schrieb:
> Das Problem ist das ich keinen Plan habe wie man einen ESP OTA flasht.
> Im Internet findet man zwar Anleitungen mit einem Arduino aber auf ein
> externes Bauteil möchte ich dann verzichten. Zumindest habe ich beim
> ESP-WROOM32 gesucht, ob es im jetzigen Fall mit einem ESP-M3 anders ist
> weiß ich nicht. Danach habe ich dann nicht mehr gesucht, da es
> aufwendiger schien, als meine jetzige Lösung.

FOTA braucht keinen Arduino als Hardware. Nur viele programmieren den 
ESP in der Arduino Umgebung.

Da sähe ein einfaches "Upload Firmware" als Webseite so aus:
https://github.com/espressif/arduino-esp32/blob/master/libraries/WebServer/examples/WebUpdate/WebUpdate.ino

Man kann da dann einfach sein bin hochladen und es wird geflasht.

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.