Forum: Mikrocontroller und Digitale Elektronik ESP32 als ISP


von Marius S. (fhler)


Lesenswert?

Hallo,

ich bin mittlerweile bei meinem Projekt 
Beitrag "ESP32 Arduino IDE vs IDF" an dem Punkt angelangt wo 
ich nun einen AtTiny85 programmieren will. Nachdem ich mich die letzten 
beiden Tage etwas eingelesen habe, bin ich zum Schluss gekommen das ich 
wohl das ArduinoISP Beispiel größtenteils verwenden kann. Ich muss jetzt 
quasi den Ablauf programmieren die der PC für mich normalerweise 
übernimmt. Jedoch stellt sich bei mir die Frage: Die zu programmierenden 
Dateien (.hex für den Flash und .eep für den/das EEPROM) liegen im 
SPIFFS des ESP32.


-Kannn ich deren Inhalt einfach in eine Variable schreiben und dann 
Programmieren? (Vermute jedoch das funktioniert ehr nicht auch wegen den 
Escape-Sequenzen). Die Daten im Beispielprogramm werden jedenfalls mit 
Serial.read() eingelesen aber ich habe ja in dem Sinne keine serielle 
Verbindung zu den zu programmierenden Daten.

Gruß

Marius

von Michael U. (amiga)


Lesenswert?

Hallo,

Du hast mit dem SPIFFS ein normales Filesystem. Denn Du da die Datei 
reingeschrieben hast, bekommst Du sie auch so wieder.
file.read(buf, anz), bitmap.seek(position) usw, usw.

Wo sind in einem .hex denn Escapesquenzen?

Gruß aus Berlin
Michael

von Marius S. (fhler)


Lesenswert?

Hallo,
vielen Dank für deine Antwort.

Mit Escape-Sequenzen meinte ich \r\n  für einen Zeilenumbruch in der 
Hex-Datei. Beispielsweise.

von Marius S. (fhler)


Angehängte Dateien:

Lesenswert?

Hallo,

das Programm wird zwar programmiert, derzeit noch über die Arduino IDE 
(Hochladen mit Programmer). Jedoch scheint es offenbar Probleme mit dem 
Auslesen des Programmspeichers zu geben.

Nachdem das Programm programmiert wurde, passiert leider nichts mehr. 
Nach einer gewissen Zeit wird der Programmiermodus dann beendet und der 
AtTiny fängt mit dem Abarbeiten des Programms an.

Der Programmer läuft mit dem Beispielprogrammer aus der IDE.

Habt ihr Ideen woran es liegen könnnte? Der MISO-Pin beim AtTiny ist als 
Ausgang gesetzt.

EDIT: Kann es evtl sein das ich durch das einstellen der falschen 
Taktfrequenz in der IDE den AtTiny "zerschossen" habe? Zumindest geht er 
nach dem herstellen der Spannungsversorgung nicht mehr in den 
Programmiermodus. (Normalerweise geht der AtTiny85 nach dem PowerUp für 
6 Sekunden in den Programmiermodus)

Gruß Marius

: Bearbeitet durch User
von Michael U. (amiga)


Lesenswert?

Hallo,

irgendwie habe ich Deine PM wohl ignoriert, sorry.
Ich blicke im Moment nicht ganz durch, was Du da treibst.
Über das Thema ESP8266/ESP32 als ISP-Programmer für AVR zu nutzen, hatte 
auch mit einem Beaknnten darüber diskutiert und mich im Netz umgeschut, 
was es schon gab. Allerdings blieb es dabei, weil wir keine reale 
Anwendung dafür hatten.

"zerschießen" in dem Sinn geht sicherlich, spätestens, wenn man die 
Fuses mit angefasst hat. Sollte sich doch aber eigentlich an einem 
ISP-Programmer schell klären lassen.
Ich hole da im Zweifel den Dragon oder ein STK500 aus der Versenkung und 
starte das alte AVR-Studio, einfach, weil das hier sowieso verfügbar 
ist.

Gruß aus Berlin
Michael

: Bearbeitet durch User
von Marius S. (fhler)


Angehängte Dateien:

Lesenswert?

Hallo Michael,

im Anhang eine kurze Skizze. Ich will letztendlich Controller C 
programmieren (bzw. er soll sich am Ende selbst programmieren und die 
Programmdaten über den SPI-Bus bereitgestellt werden). Ich bekomme die 
Programmdaten schon bis zum Controller B übertragen.

Ich hänge gerade an der Stelle C das Programmierte zu verifizieren. Das 
macht er ja derzeit leider nicht, weil ????

Um die Fragezeichen geht es mir halt im Moment.

Gruß Marius

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


Lesenswert?

Marius S. schrieb:
> im Anhang eine kurze Skizze. Ich will letztendlich Controller C
> programmieren (bzw. er soll sich am Ende selbst programmieren und die
> Programmdaten über den SPI-Bus bereitgestellt werden). Ich bekomme die
> Programmdaten schon bis zum Controller B übertragen.

 Wozu ISP wenn C sich selbst programmieren soll ?
 Dafür brauchst du einen Bootloader im C.

 ISP ist nichts weiter als SPI + eine Leitung für Reset.
 Und in jedem DaBla stehen die entsprechenden Befehle fürs
 programmieren - lesen (und verstehen) musst du das aber selbst.

von fhler (Gast)


Lesenswert?

Marc V. schrieb:
> Wozu ISP wenn C sich selbst programmieren soll ?
>  Dafür brauchst du einen Bootloader im C.
>
>  ISP ist nichts weiter als SPI + eine Leitung für Reset.
>  Und in jedem DaBla stehen die entsprechenden Befehle fürs
>  programmieren - lesen (und verstehen) musst du das aber selbst.

Hallo Marc,

Weil B das eigentliche Programm verschlüsselt bereitstellt und C die 
Daten erst entschlüsseln muss und sich dann selbst programmieren soll. 
Nenn es von meinetwegen einen modifizierten Bootloader.

Beim Rest gebe ich dir vollkommen recht, im Datenblatt bin ich auch 
fündig geworden auch was den Ablauf der Programmierung angeht. Es geht 
mir jedoch im Moment darum warum der fertige ISPcode, den ich gefunden 
habe, bzw das ist das leicht modifizierte ISP Beispiel, nicht vernünftig 
läuft. Einmalig hat es funktioniert aber danach nur noch halb (keine 
Überprüfung des programmierten Programms).

Gruß Marius

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


Lesenswert?

fhler schrieb:
> mir jedoch im Moment darum warum der fertige ISPcode, den ich gefunden
> habe, bzw das ist das leicht modifizierte ISP Beispiel, nicht vernünftig
> läuft. Einmalig hat es funktioniert aber danach nur noch halb (keine
> Überprüfung des programmierten Programms).

 Hast du Bootloader Code im T85 ?
 Wenn ja, dann ist es wirklich ein Bootloader und verschlüsseln
 ist möglich.

 Wenn nicht, dann stimmt es zwar mit ISP, aber dann wird es nix mit
 verschlüsseln.

 Du musst es schon genau bezeichnen, ob Bootloader oder ISP, wo du
 diesen Beispiel gefunden hast (link), was genau du angeblich
 leicht modifiziert hast...

: Bearbeitet durch User
von Marius S. (fhler)


Lesenswert?

Marc V. schrieb:

>  Hast du Bootloader Code im T85 ?
>  Wenn ja, dann ist es wirklich ein Bootloader und verschlüsseln
>  ist möglich.

http://www.farnell.com/datasheets/1698186.pdf  s. Kapitel 19 (Seite 140) 
im Datenblatt. Und vorher die Entschlüsselung durchzuführen sollte nicht 
das Problem sein.

>  Du musst es schon genau bezeichnen, ob Bootloader oder ISP, wo du
>  diesen Beispiel gefunden hast (link), was genau du angeblich
>  leicht modifiziert hast...

https://github.com/pcbreflux/espressif/blob/master/esp32/arduino/sketchbook/ESP32_ArduinoISP/ESP32_ArduinoISP.ino

Das ist 1:1 das Beispiel aus der ArduinoIDE lediglich ein Pin geändert 
und ein Befehl auskommentiert.

von Michael U. (amiga)


Lesenswert?

Hallo,

Marius S. schrieb:
> Und vorher die Entschlüsselung durchzuführen sollte nicht
> das Problem sein.

natürlich kann der AVR seinen Flash aus dem Flash selbst programmieren 
und dazwischen auch mit den Bytes Handstände machen.

Dazu müssen die Daten aber erstmal in den Flash.
Mit ISP-Programming kannst Du Flashpages beschreiben (Seite 152 im 
datenblatt. Wenn das beendet wird, startet der AVR am reset-Vektor.

Dein vorhaben will aber einen Bootloader, der das holen der Page, die 
Modifikation und das Schreiben der Page an die richtige Stelle 
organisiert. Das geht über irgendeine Schnittstelle, meist UART, aber 
nicht über ISP.

Gruß aus Berlin
Michael

von Marius S. (fhler)


Lesenswert?

Michael U. schrieb:
> Hallo,
>
> Marius S. schrieb:
>> Und vorher die Entschlüsselung durchzuführen sollte nicht
>> das Problem sein.
>
> natürlich kann der AVR seinen Flash aus dem Flash selbst programmieren
> und dazwischen auch mit den Bytes Handstände machen.
>
> Dazu müssen die Daten aber erstmal in den Flash.
> Mit ISP-Programming kannst Du Flashpages beschreiben (Seite 152 im
> datenblatt. Wenn das beendet wird, startet der AVR am reset-Vektor.
>
> Dein vorhaben will aber einen Bootloader, der das holen der Page, die
> Modifikation und das Schreiben der Page an die richtige Stelle
> organisiert. Das geht über irgendeine Schnittstelle, meist UART, aber
> nicht über ISP.
>

Ich sehe jetzt nicht das Problem  wenn man das in 2 Schritten macht. 
1)Programm zur Selbstprogrammierung programmieren -> Neustart
2)die "richtigen" Programmdaten übertragen, entschlüsseln und dann in 
den Flash schreiben

ABER all dies hilft mir ja nicht bei meinem Problem das er die Daten 
derzeit nicht überprüfen will.

von Michael U. (amiga)


Lesenswert?

Hallo,

morgen komme ich vermutlich nicht dazu, aber ich nehme das mal zum 
Anlaß, das mal auf einen ESP32 zu werfen und einen Tiny85 ranzuhängen.
Eigentlich wollte ich mir da ja sowieso was zurechtmachen, aber als 
reinen kabellosen ISP-Programmer für meine Tiny85 Funk Sensoren, obwohl 
ich da seit Jahren nichts mehr geändert habe, die spielen ja...

Gruß aus Berlin
Michael

von Marius S. (fhler)


Angehängte Dateien:

Lesenswert?

Hallo,
nachdem der SPI-Bus nun funktioniert, geht es darum die Daten in den 
Programmspeicher zu schreiben. Ich habe auch schon ein Programmm was die 
Hex-Datei analysiert. D.h. Die Anzahl der Datenbytes, die Startadressen 
und die eigentlichen Daten extrahiert. Die Ausgabe der Adresse mit dem 
dazugehörigen Datum auf dem seriellen Monitor sieht auch gut aus. 
Nachdem ich das Protokoll zur seriellen Programmierung abgearbeitet 
habe, führt der Tiny85 nicht das gewünschte Programm/Funktion aus.

Das Foto im Anhang ist der Aufbau des Programmspeichers wie ich ihn 
verstanden habe. Das rote ist für mich das LowDataByte und das grüne das 
HighDataByte. Laut Datenblatt sollte ich das rote LowDataByte zuerst 
schreiben und dann das grüne HighDataByte.

Hier der entsprechnde Programmausschnitt in dem ich keinen Fehler 
aufgrund des Aufbaus des Programmspeichers, so wie ich Ihn verstanden 
habe, entdecken kann.

HexArray=Das HexFile nur jede einzelne Zeile als String in einem 
Arrayelement gespeichert.
1
if(digitalRead(34)==HIGH)
2
  {
3
    Serial.println("PIN 34 ist HIGH // Programmiervorgang gestartet");
4
    
5
  digitalWrite(RESET, LOW); //Reset 
6
  delay(25);  //mind 20ms warten bevor das Programming Enable Kommando gesendet wird
7
  SPI.beginTransaction(SPISettings(1000, MSBFIRST, SPI_MODE0)); //SPI-BUS einrichten: max 1 kHz, MSB zuerst, MODUS 0
8
  programming_enable(); //Programming Enable Kommando senden
9
  delay(10);
10
  chip_erase(); //Programmspeicher und EEPROM löschen
11
  delay(10);
12
  for (int arrayzeile = 0; arrayzeile < anzahl_zeilen; arrayzeile++) {
13
14
    if (HexArray[arrayzeile].charAt(8) == 49) //ASCI 49 = "1"
15
    {
16
      Serial.println("ende des Hex-Files");
17
    }
18
    else
19
    {
20
      int anzahldatenbytes = faktorbestimmung(HexArray[arrayzeile].charAt(1)) * 16 + faktorbestimmung(HexArray[arrayzeile].charAt(2)) * 1 ;                   //OK
21
22
      Adr_MSB = faktorbestimmung(HexArray[arrayzeile].charAt(3)) * 16 + faktorbestimmung(HexArray[arrayzeile].charAt(4)) * 1;
23
      Adr_LSB = faktorbestimmung(HexArray[arrayzeile].charAt(5)) * 16 + faktorbestimmung(HexArray[arrayzeile].charAt(6)) * 1;
24
      int Bytes[anzahldatenbytes];
25
      //OK
26
      int DatenBytes[16];
27
      for (int Adr_LSB_Zaehler = 0; Adr_LSB_Zaehler < anzahldatenbytes; Adr_LSB_Zaehler++) {
28
29
        DatenBytes[Adr_LSB_Zaehler] = faktorbestimmung(HexArray[arrayzeile].charAt(9 + (Adr_LSB_Zaehler * 2))) * 16 + faktorbestimmung(HexArray[arrayzeile].charAt(10 + (Adr_LSB_Zaehler * 2))) * 1;
30
       
31
      }
32
      int multi_1 = 0;
33
      int multi_2 = 0;
34
      for (int zaehler = 0; zaehler < anzahldatenbytes; zaehler++)
35
      {
36
        Serial.print(" Adr_MSB: ");
37
        Serial.print(Adr_MSB);
38
        Serial.print(" Adr_LSB: ");
39
        Serial.print(Adr_LSB);
40
41
        spi_transaction(0x40, Adr_MSB, Adr_LSB , DatenBytes[1 + multi_1 * 2]); //LowByte
42
        spi_transaction(0x4C, Adr_MSB, Adr_LSB, 0x00);  //Datum schreiben
43
        delay(5);
44
        spi_transaction(0x48, Adr_MSB, Adr_LSB, DatenBytes[0 + multi_2 * 2]); //HigbyteByte
45
        spi_transaction(0x4C, Adr_MSB, Adr_LSB, 0x00); //Datum schreiben
46
        delay(5);
47
        Adr_LSB = Adr_LSB + 1; //Adresse des LSB um 1 erhöhen
48
        if (zaehler % 2 == 0) {
49
          Serial.print(" Daten ");
50
          Serial.println(DatenBytes[zaehler]);
51
          multi_1++;
52
        }
53
        else if (zaehler % 2 == 1) {
54
          multi_2++;
55
          Serial.print(" Daten ");
56
          Serial.println(DatenBytes[zaehler]);
57
        }
58
      }
59
    delay(5);
60
    }
61
   
62
  }
63
  SPI.endTransaction();
64
  digitalWrite(RESET, HIGH);
65
  }

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.