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
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
Hallo, vielen Dank für deine Antwort. Mit Escape-Sequenzen meinte ich \r\n für einen Zeilenumbruch in der Hex-Datei. Beispielsweise.
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
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
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
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.
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
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
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.
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
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.