Forum: Mikrocontroller und Digitale Elektronik AVR ATMEga128 Eeprom Prüfsumme ermitteln.Hilfe!


von Schorschi (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,
in einem AVR ATMega128 wird durch die Firmware auf das Eprom 
zugegriffen. Im Eprom sind ein paar Parameter hinterlegt die der 
Anpassung des Ablaufes dienen. Wenn ich das Eprom auslesen erhalte ich 
eine *.eep Datei die auch mit einem einfacher Editor dargestellt werden 
kann.

hier ein Stück aus dem Epromsspeicher als Auszug ohne Daten

:10006000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0
:10007000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90
:10008000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80
:10009000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF70
:1000A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF60
:1000B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50
:1000C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF40

Ich kenne den Aufbau und sehe auch im letzten Segment die 
Prüfsumme/Checksumme wie man es auch immer nehnen mag. Um die 
Einstellung komfortabler zugestalten arbeite ich an einem externen 
Programm welches die Datei einließt und auch schon verändern kann. Nach 
dem Speichern soll dann das Zurückschreiben in den AVR mit der 
Bootloadersoftware erfolgen.
Da dieser Versuch mit einem Fehler quitiert wird liegt es wohl an der 
nicht aktualisierten Prüfsumme.

Soviel zu den Randbedingungen:

Auf der Suche nach Erklöärungen und wie man es zum Verständnis erstmal 
handisch berechnen kann bin ich auf dieses Beispiel zum Intel Hex Format 
gestoßen.

http://de.wikipedia.org/wiki/Intel_HEX

Von der Internetseite
:020000021000EC
:10010000214601360121470136007EFE09D2190140

Die Prüfsumme für den ersten Beispiel-Datensatz berechnet sich wie 
folgt:
Das zusammen rechnen der einzelnen Hexfelder des Beispieles habe ich 
auch verstanden komme aber am Ende ins schleudern und nicht weiter. Ich 
stocke bei

3C0 -> C0 -> C0 + 1 = 40   ?????????

beim Zusammenrechnen des ganzen erhalte ich dezimal 960 was 3C0 
entspricht. Der untere Wert wird verwendet C0 auch klar. Aber wie wird 
jetzt aus C0 + 1 = 40 ???????

Kann mir das einer kurz für einen Dummy erklären...
Danke

Gruß
Schorschi

von StorkBOT (Gast)


Lesenswert?

Ich glaube so:

0xc0 := 0b11000000
2er Komplement: invertieren, dann + 1
-> 0b00111111
-> 0b01000000

0b01000000 := 0x40

MfG
StorkBOT

von Stork B. (storkbot)


Lesenswert?

Sry für den Doppelpost, aber:

"Each record ends with a CHKSUM field that contains the ASCII 
hexadecimal representation of the two's
complement of the 8-bit bytes that result from converting each pair of 
ASCII hexadecimal digits to one
byte of binary, from and including the RECLEN field to and including the 
last byte of the INFO/DATA
field. Therefore, the sum of all the ASCII pairs in a record after 
converting to binary, from the RECLEN
field to and including the CHKSUM field, is zero."

Intel
Hexadecimal Object File
Format Specification
Revision A, 1/6/88

von Schorschi (Gast)


Lesenswert?

Hallo,
danke für die Aufklärung, das werde ich direkt mal an ein paar 
Beispielen testen.

Gruß
Schorschi

von Schorschi (Gast)


Lesenswert?

Hallo,
für das Beispiel sceint es zupassen, leider nicht zu dem AVR Eepromfile

:10010000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"FF"
= 4097 = 1001h = 01h = b00000001 = 11111110 +1 = 11111111 = FF = ja geht


:10011000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"EF"
=4107 = 100Bh = 0Bh = b00000011 = 11111100 +1 = 11111101 = FD = falsch


:10012000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF
=4117 = 1015h = 15h = 00010101 = 11101010 +1 = 11101011 = EB = falsch


Ja scheint doch nicht so einfach wie ich dachte. Dann ist da doch eine 
andere Prüfsummenermittlung drüber gestülpt.


Gibt es noch eine andere Möglichkeit, oder habe ich einen Fehler 
gemacht.

Gruß
Schorschi

von holger (Gast)


Lesenswert?

>:10011000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"EF"
>=4107 = 100Bh = 0Bh = b00000011 = 11111100 +1 = 11111101 = FD = falsch

Quark;)
Das geht viel einfacher als du denkst. Nimm eine 8 Bit Variable
zum addieren der Werte. Alles was überläuft ist egal!

Um das ein bisschen abzukürzen: erster Zwischenwert

0x10 + 0x01 + 0x10 + 0x00 = 0x21

Jedes 0xFF was addiert wird bedeutet schlicht -1

FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF

Das sind 16 Stück.
Du addierst in deinem Algo nacher die 0xFF aber einfach.

0x21 - 16 = 17 = 0x11

Not 0x11 = 0xEE
0xEE + 1 = 0xEF passt.

von Rene S. (Firma: BfEHS) (rschube)


Lesenswert?

Hallo,

ich habe auch mal daran rumgetüftel, bis mir an meinem Editor 
aufgefallen ist, der kann das viel besser!

Notepad++ nur den Inhalt schreiben und speichern als 16bit Intel Hex... 
fertig.

Ansonsten haben StorkBOT und Wikipedia natürlich recht.

Grüße aus Berlin

von Georg B. (schorschi)


Lesenswert?

Hallo,
so jetzt hab ichs geschnalt.

hex 10 2  80 00 FF  FF  FF  FF  FF  FF FF  FF  FF  FF  FF  FF FF FF FF 
FF
dez 16 2 128 0 255 255 255 255 255 255 255 255 255 255 255 255 255 255 
255  255

:10028000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E

    dez    Hex    Hex    dez    <->   plus 1   Hex
    4226  1082    82     130    125    126  =  7E

Jetzt gehts jedesmal, danke für die Initialzündung

Gruß
Schorschi

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.