Forum: Mikrocontroller und Digitale Elektronik AVR über AVR programmieren


von Michael L. (nemesisod)


Lesenswert?

Hallo zusammen,

ich habe eine kurze Frage zum decodieren von Intel-Hex Dateien.

:100030000C9447000C947E0B0C9447000C94AE0B70
:100040000C9447000C9447000C9447000C94470014

Hie mal zwei Zeilen.

Die ersetn beiden (ohne ':') geben an wieviele Datenbytes übertragen 
werden,
die nächsten vier sind die Adresse, dann kommt der Recordtyp (in der 
Regel 00, nur die letzte Zeile ist 01). Dann kommen die Datenbytes, und 
zum schluss die Prüfsumme.

Also, ich habe ein Netzwerk aus einigen AVRs, welche in einem Gehäuse 
verbaut sind. Daher möchte ich nun deinen AVR dazu benutzen um die 
anderen zu Programmieren. Diese MASTER AVR hat auf einer SD-Karte alle 
Sources der anderen AVRs. Nun soll ein neues Programm automatisch auf 
den passenden AVR programmiert werden.

So, mein problem nun ist,
Die Adresse hab ich: 0030 und 0040
Doch die Daten kommen mir einwenig lang vor:
0C9447000C94 7E0B0C 9447000C94 AE0B
und
0C9447000C94 47000C 9447000C94 4700
was (16 Bytes) entspricht.

Weiß einer damit was anzufangen?

Danke für eure Hilfe.
Michael

von holger (Gast)


Lesenswert?

>Daher möchte ich nun deinen AVR dazu benutzen

Das lässt du mal schön sein ;)

SCNR

von Johannes M. (johnny-m)


Lesenswert?

Michael Leske wrote:
> So, mein problem nun ist,
> Die Adresse hab ich: 0030 und 0040
> Doch die Daten kommen mir einwenig lang vor:
> 0C9447000C94 7E0B0C 9447000C94 AE0B
> und
> 0C9447000C94 47000C 9447000C94 4700
> was (16 Bytes) entspricht.
Ich verstehe nicht ganz, was Du uns mitteilen willst. Passt doch ganz 
genau. Jede Zeile enthält 16 Bytes, und dementsprechend geht es in der 
nächsten Zeile mit einer um 16 (10h) höheren Adresse weiter...

von holger (Gast)


Lesenswert?

>Doch die Daten kommen mir einwenig lang vor:
>0C9447000C94 7E0B0C 9447000C94 AE0B

ASCII to HEX

0C ist ein Byte 0x0C
94 ist ein Byte 0x94

usw.

von Jochen M. (taschenbuch)


Lesenswert?

Sorry,

aber ganz sooo einfach ist der Aufbau des Intel-Hexfiles nun auch 
nicht...

http://www.keil.com/support/docs/1584.htm

Das hätte der OP durch simple Eingabe von "intel hexfile" bei google
aber auch ganz einfach selbst finden können.
Du weisst was eine Suchmaschine ist, oder?

Jochen Müller

von holger (Gast)


Lesenswert?

>aber ganz sooo einfach ist der Aufbau des Intel-Hexfiles nun auch
>nicht...

Stimmt. Da kommen evtl. auch noch andere Records als 0x00.
So richtig lustig wird es wenn die Adressen im HEX File nicht
aufsteigend sortiert sind.

von Rudolph R. (rudolph)


Lesenswert?

Hex2Bin und gut?

>Diese MASTER AVR hat auf einer SD-Karte alle Sources der anderen AVRs.
>Nun soll ein neues Programm automatisch auf den passenden
>AVR programmiert werden.

Wie jetzt, kompilieren auch noch?

von timmi (Gast)


Lesenswert?

so richtig viel sinn macht die frage nicht

von Ulrich P. (uprinz)


Lesenswert?

Auch ich finde es immer wieder lustig, dass man bei gestellten Fragen 
erst einmal die Frage finden muss...

Also das Intel-HEX Format ist im Internet ausführlichst beschrieben und 
es gibt auch fertige Interpreter dafür, jedefalls habe ich solche in 
Pascal und C gefunden, als ich mich irgendwann 199x damit mal 
beschäftigen musste.
Kann also kein Problem sein.

Einen AVR zu programmieren ist, jedenfalls via SPI, kein Problem, weil 
zum Einen ATMEL dazu einiges veröffentlich hat, es aber auch einige 
freie Seriell/USB Programmer gibt, die das Protokoll über einen AVR 
abhandeln. Hier müsste man also nur die Software nehmen und seinen 
eigenen Bedürfnissen anpassen.

Ich kann nicht genau sagen, ob die PC-Software das iHEX File bereits 
binär kodiert, oder aber der AVR im Programmer. Wenn das letzterer 
macht, oder die Chip-interne Programming Engine, dann hat man eigentlich 
für eine fertige Lösung nur zwei Dinge zu tun:
1) Anpassen der Programmer-Software um nacheinander mehrere AVR zu 
programmieren, also eigentlich nur anlegen der MOSI an die MISO oder PDI 
des richtigen Zielprozessors.
2) Aufpeppen der Programmer Software um ein Dateisystem mit SD-Card.

Aber... Warum macht man das nicht über einen simplen Bootloader, der das 
Protokoll versteht, das einem am meisten liegt und das man selber auch 
gut versteht?
Der Vorteil wäre, dass man alle AVRs parallel programmieren könnte, weil 
ich ja einem AVR Daten zum programmieren schicken kann, wärend der 
andere gerade mit dem flashen von bereits erhaltenen Daten beschäftigt 
ist.

Manche Leute machen es sich aber auch kompliziert...

Gruß, Ulrich

von Bingo (Gast)


Lesenswert?

Ich brauche avr-objcopy zum einer intel-hex und einer bin file zum 
machen.
Im binfile is die selber data als im hex , nur im binary format.

Siehe hier
http://hubbard.engr.scu.edu/embedded/avr/avrgcc_install/avrgcc_install.html

http://ccrma.stanford.edu/planetccrma/man/man1/avr-objcopy.1.html

mfg
Bingo / Dänemark

von Michael L. (nemesisod)


Lesenswert?

Mein Problem besteht darin, das die Adressierung in der Hex nicht mit 
der Adressierung im AVR übereinstimmt.

z.B. die ersten 6 zeilen:

:100000000C942A000C9447000C9447000C94470071
:100010000C9447000C9447000C9447000C94470044
:100020000C9447000C9447000C9447000C94470034
:100030000C9447000C947E0B0C9447000C94AE0B70
:100040000C9447000C9447000C9447000C94470014
:100050000C94470011241FBECFE5D8E0DEBFCDBF12
                 ^Hier ist im ATMega 32 die Adresse 0x002A,
davor stehen die Sprungadressen für die Interrupts.
In der Hex-file ist es aber die Adresse 0x0054

Wie kann ich nun aus der Hex-Datei die richtige Adresse
im AVR ermitteln?

Oder ist das einfach die Adresse 0x0054 / 2 = 0x002A ???

Ich hoffe die Frage ist nun klar geworden.

Gruß
Michael

von Matthias L. (Gast)


Lesenswert?

>der ist das einfach die Adresse 0x0054 / 2 = 0x002A ???

Der Flash im Atmel ist WORD-Orientiert.

>Adresse 0x002A
im Atmel ist im hexfile: 0x0054 (byte)

von Karl H. (kbuchegg)


Lesenswert?

Michael Leske wrote:
> Mein Problem besteht darin, das die Adressierung in der Hex nicht mit
> der Adressierung im AVR übereinstimmt.
>
> z.B. die ersten 6 zeilen:
>
> :100000000C942A000C9447000C9447000C94470071
> :100010000C9447000C9447000C9447000C94470044
> :100020000C9447000C9447000C9447000C94470034
> :100030000C9447000C947E0B0C9447000C94AE0B70
> :100040000C9447000C9447000C9447000C94470014
> :100050000C94470011241FBECFE5D8E0DEBFCDBF12
>                  ^Hier ist im ATMega 32 die Adresse 0x002A,
> davor stehen die Sprungadressen für die Interrupts.
> In der Hex-file ist es aber die Adresse 0x0054

Du weisst hoffentlich, dass bei den AVR das Flash wortweise
addresiert wird. Wenn du also die Adresse einer Instruktion
aus dem Assemblerprogramm kennst, dann ist das die
Adresse eines Wortes. Die Byteadresse ist dann einfach das
doppelte. (1 Wort = 2 Byte)

von Johannes M. (johnny-m)


Lesenswert?

Ich muss Ulrich P. zustimmen: Es ist wirklich verblüffend, wie jemand 
eine Frage so stellen kann, dass es einen ganzen Tag dauert, bis endlich 
herauskommt, wo tatsächlich das Problem liegt...

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.