Generic Hex File -> Intel Hex File

Kani

Neues Mitglied
07. Jan. 2009
339
0
0
Spenge
Sprachen
Hi, ich muss ein Programm in den EEPROM laden, welches ein Generic Hex File ist. Jedoch geht das mit AVR-Studio nicht. Habe den AVRISP mkII.
Kann ich das irgendwie umwandeln?

Mit freundlichen Grüßen,
Finn

EDIT:
Oder kann ich mit Ponyprog o.ä. welches das Generic Hex File unterstützen mit dem AVRISP mkII flashen?
 
.eseg ansprechen

Hallo,
man unterscheidet ja .cseg, "Codesegment", ab Adressse hex 0x0000, wo das Programm hineingehört, wo auch alle Features und Operationen ausgeführt werden können mit der kürzesten Zugriffszeit,

dann das .dseg, welches als "Datensegment" ab Adresse 0x0060 Konstanten aufnehmen kann, die im Programm per spezielle Befehlsstrukturen (sts, lds etc) geladen und zurückgeschrieben werden können, mit fast doppelter Zugriffzeit gegenüber dem .cseg,

dann noch das .eseg, das "Epromsegment", das nach besonderen Schreib- und Leseroutinen verlangt, und in das Variable und Konstanten geschrieben werden können während des Programmverlaufes, die nach Abschalten der Betriebsspannung erhalten bleiben.
Die Schreibzyklen auf das .eseg sind aber auf ca. 100000 Zyklen begrenzt, die Lesezyklen unbegrenzt.

Programmanteile für das Epromsegment kommen in einem zweiten Flashvorgang als sogenannte *.eep- Files zur Speicherung.
Dafür ist im Studio4 eine extra Rubrik eingerichtet. Hex-Files werden hier nicht akzeptiert.
Das hatte ich auch schon mal versucht, klappt aber nicht.

Das Programm sollte evtl vorher umgeschrieben werden in AVR-ASM.

Die gängigsten Routinen sehen dann beispielsweise so aus:

PHP:
eeprom_x:

push	temp		; temp auf dem Stack sichern
;in	temp,	sreg	; SREG sicher, muss praktisch in jeder         ;			; Interruptroutine gemacht werden
;push	temp
;in	temp,	UDR	; empfangenes Byte lesen
mov	temp,	min
rcall	eeprom_write	; Byte im EEPROM speichern
adiw	ZL:ZH,	1	; Zeiger erhöhen
cpi	ZL,	low(eepromend+1)	; Vergleiche den Z-Zeiger    ldi	temp,	high(eepromend+1)	; mit der maximalen EEPROM
;			; Adresse +1
cpc	ZH,	temp
brne	eeprom_1	; wenn ungleich, springen
ldi	ZL,	low(datenx)	; wenn gleich, Zeiger zurücksetzen    ldi	ZH,	high(daten)

eeprom_1:

pop	temp
;out	sreg,	temp
;pop	temp		; temp wiederherstellen
ret

eeprom_write:

sbic	EECR,	EEWE	; prüfe, ob der letzte Schreibvorgang ;			; beendet ist
rjmp	EEPROM_write	; wenn nein, nochmal prüfen
;out	EEARH,	ZH	; Adresse schreiben
out	EEARL,	ZL
out	EEDR,	temp	; Daten schreiben
push	temp2
in	temp2,	sreg	; SREG sichern
push	temp2
cli			; Interrupts sperren, die nächsten             ;			; zwei Befehle dürfen NICHT                    ; 			; unterbrochen werden
sbi	EECR,	EEMWE	; Schreiben vorbereiten
sbi	EECR,	EEWE	; Und los !
pop	temp2
out	sreg,	temp2	; SREG wiederherstellen
pop	temp2
sei
ret			; hier wird der EEPROM-Inhalt definiert
;
.eseg
.org 0xFF
datenx:

.db	0

.cseg

eeprom_senden:

;ldi	ZL,	low(text1x)	; ersten String senden
;ldi	ZH,	high(text1x)	; Z-Pointer laden
ldi	ZL,	low(datenx)
ldi	ZH,	high(datenx)
rcall	EEPROM_print
ret
    
EEPROM_print:

sbic	EECR,	EEWE	; prüf ob der vorherige Schreibzugriff         ;			; beendet ist
rjmp	EEPROM_print	; nein, nochmal prüfen
;out	EEARH,	ZH	; Adresse laden
out	EEARL,	ZL
sbi	EECR,	EERE	; Lesevorgang aktivieren
in	r0,	EEDR	; Daten in CPU Register kopieren
tst	r0		; auf 0 testen (=Stringende)
breq	eep_print_end	; falls 0, Funktion beenden
rcall	position2
;mov	temp,	r0
rcall	position3
mov	temp,	r0
rcall	hexumrechnung	; ansonsten Byte senden...
adiw	ZL:ZH,	1	; Adresse um 1 erhöhen...
rjmp	EEPROM_print	; und zum Anfang der Funktion

eep_print_end:

ret

;.eseg

;text1x:

;.db	"Tt", 0

;.cseg

wie immer, ohne Gewähr.
Die Idee war, Zeit- bzw. Messwerte auf LCD darzustellen und periodisch im Epromsegment abzulegen, na ja, man "müllt" sich aber dann ziemlich schnell das EEprom zu, so daß es bald nicht mehr beschreibbar ist. Daher mit äußerster Vorsicht zu genießen, nur mal ein paar Minuten laufen lassen, sozusagen als Test, ob das EEprom überhaupt ansprechbar ist.

Wenn ich Dich @Kani, richtig verstehe, möchtest Du ein "fixes" Programm im Epromsegment hinterlegen, das sozusagen wie ein ausführbarer Code läuft. Das ist aber, so verstehe ich das EEprom hier, nicht so angedacht. Ein Code muß immer in dem .cseg "Codesegment" ablaufen,
da hier und nur hier die Operationen in den Registern r16 bis r32 (oder so) ablaufen können,
das ergibt sich aus der "Havard Architektur" der Atmel AVRs, die ja alles in einem Taktzyklus erledigen, also, Laden von Werten, Ausführen von (arithmetischen) Operationen und zurückschreiben des Ergebnisses in dasselbe Register innerhalb eines Taktzyklus'. Dafür sind diese Register konstruiert, bei den anderen Speicherbereichen oberhalb von hex 0x0060 klappt das nicht. (Oder liege ich da total falsch?)


Die "Umladerei" beginnt schon bei Verwendung des .dseg:

PHP:
; hier Bytes reserviert, um 
;Temporärregister einzusparen

.dseg			; Zeitschleifen-Ladewerte 	
.org	0x0060		; kommen ins Datensegment
zeit_0:	.BYTE	4 	; vier Bytes dafuer reservieren
.org	0x0065		; Startfunktionsjobregister
start_0:	.BYTE	1	; Wert ins Datensegment
.cseg			; Rueckkehr ins Codesegment
.org	0x0000		; Anfangsadresse bei Null


; hier werden die Werte geladen:
schreiben_dseg:		; Zeitschleifen-Ladewerte ins DSEG
			; laden
push	temp
ldi	temp,	0xFF	; 4 Bytes wurden im Direktiventeil
sts	zeit_0,	temp	; oben im Label Zeit_0 reserviert
sts	zeit_0+1, temp	; durch BYTE-Anweisung
ldi	temp,	0x85
sts	zeit_0+2, temp	
ldi	temp,	0x9F
sts	zeit_0+3, temp
ldi	temp,	0x01
sts	start_0,	temp	; ein Byte fuer Startjob reserviert
pop	temp

;

; hier werden sie wieder zurückgeholt, um damit arbeiten zu können:
;
push	temp			; Sicherung der Temporaerregister
push	temp1			; auf Stack
lds	temp,	zeit_0		; Umladen von DSEG-Zeitkonstanten
lds	temp1,	zeit_0+3	; auf Temporaerregister
;.............



Gruß von Oskar
 

Anhänge

  • eeprom_1.asm
    19 KB · Aufrufe: 6
Gibt es kein Programm, dass aus einem Generic hex file ein anderes File macht, dass AVR-Studio versteht und flashen kann?

Ich hab mal was von hex2bin gehört?!
 
Der ist für Linux oder?
Ich hätte da nochmal was direkt von Atmel.
http://www.atmel.com/dyn/products/tools.asp?family_id=604
STRG+F => hex2bin.exe

Allerdings kommt da folgender Fehler, der im Anhang liegt.
Naja, ich glaube es ist eher eine Anweisung so weit ich das verstanden habe.
Das Fenster öffnet sich und schließt sich auch gleich wieder. Habe ein bisschen Rummprobiert und konnte so ein Bildschirmfoto machen.
Zu erwähnen wäre vllt. noch, dass ich Vista auf meinem Laptop habe.

Aufgefallen ist mir auch, dass rechts neben der Meldung ein Scrollbalken ist. Also steht da ja noch mehr.

Liebe Grüße.
Danke :)
 

Anhänge

  • fehlertext.png
    fehlertext.png
    80,2 KB · Aufrufe: 6
Not enough Arguments

Hallo Finn,

Ich hätte da nochmal was direkt von Atmel.
http://www.atmel.com/dyn/products/tools.asp?family_id=604
STRG+F => hex2bin.exe

Allerdings kommt da folgender Fehler, der im Anhang liegt.
Naja, ich glaube es ist eher eine Anweisung so weit ich das verstanden habe.
Das Fenster öffnet sich und schließt sich auch gleich wieder. Habe ein bisschen Rummprobiert und konnte so ein Bildschirmfoto machen
Lies dir mal den Text in dem Fenster durch ;)
Da steht "ERROR: Not enough arguments" ;)
Dem Befehl "hex2bin.exe" wurden also für die Ausführung zu wenige
Argumente mitgegeben.

Und dann steht da "Syntax: HEX2BIN [/option] hexfile [binfile]"
So sollst Du ihn verwenden.
Alles in [] kann man angeben, muß man aber nicht.
Was soll ein Befehl/Programm machen das was verarbeiten soll aber nicht
weiß was es verarbeiten soll ? :rolleyes: Die einzige Möglichkeit ist
also eine Fehlermeldung.
Hier hört leider das anklicken und rumschieben auf. Also Finger auf die
Tasten und tippen ;)
Sieh mal hier Real Men Don´t Click :cool: :cool:
Da ist man als Linuxer klar im Vorteil. Wenn man so eine Meldung liest,
weiß man genau was sache ist. Der Computer sagt einem was er braucht
um es auszuführen ;)

Also kopier dir das HEX2BIN.EXE oder BIN2HEX.EXE in dein
Windows-Verzeichnis ("c:\Windows") und dann mach ein MSDOS-Fenster
auf (Programme-Zubehör-Eingabeaufforderung). Danach mit cd in das
Verzeichnis wechseln in dem deine Dateien zur Verarbteiung liegen.
Als letztes dann das eingeben was das Programm dir da ausgespuckt hat ...

HEX2BIN.EXE Quelldatei.hex Zieldatei.bin

Und dann läuft das auch ;) (natürlich mit den richtigen Dateinamen!)
Wobei die Zieldatei dann vom Programm erzeugt wird (oder eine existierende
Datei überschrieben wenn man nicht aufpaßt!)

Gruß
Dino
 
hab da noch was...

Hallo,
hier noch was gegoogelt und gleich die alten MS-DOS-Tools auf der eigens nur 504 MB großen Partition auf der Heimstation ausprobiert.
Scheint aber irgendwie nicht so das Richtige zu sein.

Nur, schaut mal, interessant ist es auf jeden Fall.

http://www.keil.com/download/docs/7.asp

Gruß von Oskar01

P.S.: Ist wohl genau das, was @dino.... oben schon ausführlich beschrieben hatte.
Also, das gute alte MS-DOS oder das DOS-Fenster im Windows bemühen.
PC-Tools läuft nur auf der besagten "reduzierten" Partition bei mir unter MS-DOS-Fenster im Windows.
Ganz unten also die Syntax:
Das File lcd_.hex soll in das File lcd_.bin konvertiert werden.
Dazu gibt man dann am Prompt ein:

hex2bin lcd_.hex

Enter
Das wars.
Im Editor kommen hernach nur die ASCII-Codes, deswegen PC-Tools.
Kommt mir trotzdem komisch vor, das *.bin-File ist extrem kurz.
Hmmm.
 

Anhänge

  • hex2bin1.png
    hex2bin1.png
    5,5 KB · Aufrufe: 7
  • hex2bin2.png
    hex2bin2.png
    11,7 KB · Aufrufe: 8
  • hex2bin3.png
    hex2bin3.png
    9,2 KB · Aufrufe: 6
Danke an euch beiden.
Ich habe es geschafft. Nur wenn ich das *.bin file mit dem Editor öffne, ist da im Dokument nichts drin.

Ich glaube es ist besser, wenn ich euch mein Vorhaben näher beschreibe.

Soeinen Atmega wie auf der Platine möchte ich flashen.
Ladet euch am besten mal das Archive unten auf der Seite runter, interessant ist der Firmware Order und die Firmware.txt. Ich verstehe nicht ganz, welche Datein wo hin müssen. Man kann sich, zur Erleichterung des einstellens der Seriennummer dieses Tool runterladen.
Auszug aus den FAQ.
Ich habe mir jetzt auch ein Interface gebaut und jetzt möchte ich den Microcontroller programmieren. Aber ich verstehe die Anleitung nicht wie man die Seriennummer ändern muss.

Am Besten verwendest du den Codegenerator von LJ Markus, siehe unten bei den Links.
[...]
Hier "http://www.medientechnikgoettingen.de/CodeGen.zip" bekommt ihr den CodeGenerator für das USB DMX IF. Es erstellt euch das Hexfile für den ATm8515.
Zur Bedienung:
Ganz einfach, Seriennummer die ihr haben wollt eingeben und auf Start drücken. Dann wird das HexFile erstellt. Im Intel HEX Format besteht zusätzlich die Möglichkeit, wer mit PonyProg arbeitet, das dann ein Button erscheind wo automatisch der AVR Programmiert wird. Auch die Fuses werden richtig programmiert.

Ich hoffe ihr könnt mir weiter helfen. So langsam fange ich an das Forum zu lieben. (Also wenn man es nicht zu wörtlich nimmt)
DANKE!:) :)
 
Standard-Ausgabe ;-)

Hallo Oskar,

Das File lcd_.hex soll in das File lcd_.bin konvertiert werden.
Dazu gibt man dann am Prompt ein:

hex2bin lcd_.hex

Enter
Das wars.
Im Editor kommen hernach nur die ASCII-Codes, deswegen PC-Tools.
Kommt mir trotzdem komisch vor, das *.bin-File ist extrem kurz.
Wenn das Zeichen 0x03 (ETX) im Ausgangsdatenstrom vorkommt heißt das
EndOfText. Und damit ist deine Datei zu Ende. Ob das nun ne Binär- oder
Textdatei werden soll. Darum habe ich die Ausgabedatei direkt beim
Befehl angegeben. Sonst würde sie ja auf der Standard-Ausgabe rauskommen
und eventuell noch interpretiert werden ;)
Ich habe da mit 0x03 und FTP schon meine Erfahrungen gemacht.
(Huch, warum ist die runtergeladene Exe denn so kurz ?)

Gruß
Dino
 
Hex-Editor oder Text-Editor ?

Hi Finn,
Nur wenn ich das *.bin file mit dem Editor öffne, ist da im Dokument nichts drin.
Eine BIN-Datei ist Binär (also mit allen Zeichen von 0x00 ... 0xFF).
Da sind dann auch Zeichen dabei die von einem "normalen" Text-Editor
als Steuerzeichen oder Text-Ende-Zeichen interpretiert werden. Nimm
dir nen HEX-Editor um so eine Datei anzusehen oder zu ändern.

Mach mal mit nem Notepad oder weiß ich für nen Editor eine .EXE oder.COM
auf. Dann weißt Du was ich meine :D (Aber nicht damit abspeichern !!)

Gruß
Dino
 
... guter Tipp...

Hallo @dino...,
Dein Tipp war gut,
jetzt kommt auch die "Erfolgsmeldung"

Also Korrektur Syntax:

Am Dosprompt eingeben:

hex2bin lcd_.hex lcd_.bin

und die Meldung im Screenshot, die fehlte vorher.

Gruß von Oskar01

P.S.: Und noch ein anderer "Dateimanager" in Aktion, der DX.
 

Anhänge

  • hex2bin4.png
    hex2bin4.png
    3,9 KB · Aufrufe: 8
  • hex2bin5.png
    hex2bin5.png
    6,5 KB · Aufrufe: 8
  • hex2bin6.png
    hex2bin6.png
    15,4 KB · Aufrufe: 9
Moin ich bin es nochmal. Jetzt wo es ernst wurde, habe ich das nochmal probiert.
Erst bin ich hängengeblieben, weil kein File erstellt wurde. (->Benutzerkontensteuerung aus gemacht)
Dann wollte ich flashen und habe bemerkt, AVRStudio nur Intel Hex Files nimmt. Keine Generic Hex und auch keine Binären Files.
Alsooo, gibt es ein Programm, dass den AVR ISPmkII USB-Programmer und Generic Hex File unterstützt?
 
Sach mal, Kani,

habs vielleicht überlesen, könnte aber auch noch von Interesse sein, steht vielleicht auch in einem anderen Thread, habst vielleicht auch verdrängt,.....

aber mit was programmierst Du? Wer erzeugt Dir Deinen Code? Hast Du dort nicht die Möglichkeit das Ausgabeformat zu beeinflussen und umzustellen?

Blöde Frage, ich weiss aber irgendwie kommt mir das "Gewursterl" mit den Formaten gerade Spanisch vor!

Grüße,
Ma
 
code.hex

Hi alle,

Da möchste ich die code.hex flashen.
ich hab mir die datei mal angesehen.
Die sieht so aus ...
Code:
000000:c7e3
000001:c1df
000002:9518
000003:9518
000004:9518
000005:9518
000006:c10b
000007:c1c0
000008:9518
000009:c01b
00000a:c0b3
00000b:c0c9
00000c:9518
00000d:9518
00000e:9518
00000f:9518
000010:9518
000011:24aa
000012:94aa
....
...
..
.

Ich kenne HEX-Files eigentlich in einem anderen Format. Die sehen dann
irgendwie nach HEX-Listings aus, wo vor jeder zeile die Anfangsadresse steht
und das ganze mit Quersummen geprüft wird.

Hier scheint pro Zeile die Programmzelle zu stehen (nicht die Adresse) und
dann einfach der 16-Bit-Wert dahinter.

Gruß
Dino
 
Das soll wohl ein Generic Hex File sein.
Kennt jemand eine Lösung?
 
Intel Hex Format sieht so aus:

Hallo zusammen,
hier ein Intel-Hex-File-Schnipsel und ein Disassemble-Ergebnis im Studio4
Kommentar dazu:


Code-Schnipsel aus dem zugehörigen geflashten Hex-File:
Intel-Hex-Format:
Adressen: Opcodes/Daten: Prüfziffer
:10008000 62C0 0FED 0DBF 0FEF 07BB 02E0 01BB 0DEF 2C
:10009000 02BB 09E1 09B9 08E1 0AB9 0CE9 0BBD

Die Leerzeichen zwischen den "Vierergruppen" fehlen im Original natürlich,
wurden hier der Übersichtlichkeit eingefügt.

Man sieht, beim zu flashenden Hex-File sind die Bytes "geswappt" dargestellt.

Im zugehörigen Disassemble-Screenshot der Studio4-Software sieht's so aus:

040: C062 RJMP
041: ED0F LDI R16 0xDF
042: BF0D OUT 0x3D R16
043: EF0F SER R16 (=LDI 0xFF)
044: BB07 OUT 0x17 R16
045: E002 LDI R16 0x02
046: BB01 OUT 0x11 R16
047: EF0D LDI R16 0xFD
und so fort.

Man sieht auf Anhieb, Opcodes und Register"werte" werden zusammengerechnet, wobei die Bytes sowohl Teile des Opcodes, als auch
des jeweiligen Registerwertes im High- bzw. Low-Nibble enthalten.

Da ist dann bei verschiedenen Opcodes noch differenzierter.

Und es wird noch ein Zahn zugelegt, denn
wie sich die Prüfziffer errechnet, harrt noch der Erforschung, bei mir
jedenfalls.

Der Code des Code-Files ähnelt aber sehr stark dem Assemblercode eines 8051 und ist auf
die "normalen" Atmel AVRs wohl so überhaupt nicht anwendbar.

Man müsste jetzt "revers engineeren".
Also, den Opcode herausfinden, dann von vorne beginnen und ein Assemblerprogramm
im Editor erstellen, dann assemblieren/compilieren lassen, schlußendlich ein Intel-Hex-File flashen.

Gruß von Oskar01
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)