Forum: Mikrocontroller und Digitale Elektronik Eeprom Probleme beim Arduino-Uno Board


von Josef K. (zumlin)


Angehängte Dateien:

Lesenswert?

Hi,

ich versuche jetzt schon einige Zeit auf meinem Arudino-Uno Board 
(atmega328P) ein kleines Programm zum Beschreiben des Eeproms zum Laufen 
zu bekommen, aber leider ohne Erfolg.

Eigentlich lege ich nur ein Array im Eeprom an und flashe das dann mit:
1
uint8_t eeData[]  EEMEM = {[2] = 0x04, [3] = 0x00};
wird zu folgendem im eep-File
1
:0400000000000400F8
2
3
:00000001FF

Flashe ich das nun, so lese ich mittels avrdude das auch wieder aus 
(siehe Bild eeprom_01). Wundern tut mich dabei, dass der Rest des 
Speichers nicht einheitlich etwa mit "FF" beschrieben ist, so wie ich 
das von meinem atmega644 kenne, sondern teils mit "08" und teils mit 
irgendwelchem Kauderwelsch, ohne dass ich jemals was im Eeprom gemacht 
habe.
Daraufhin wollte ich das Eeprom ablöschen, jedoch ohne Erfolg. Da war 
mir klar, dass EESAVE evtl. nicht passen könnte. Leider kann ich aber 
weder über die GUI in Eclipse noch über die Konsole mit avrdude die 
Fuses auslesen. In der Konsole bekomme ich sowohl für lfuse als auch 
hfuse nur
1
:0100000000FF
2
:00000001FF

War mir dann auch egal, ich lösche einfach das Eerpom "per Hand" in 
meinem Code ab.
Nun funktioniert das aber auch nicht. Jeder Schreibbefehl führt nur 
dazu, dass wieder Kauderwelsch beliebiger Größe am falschen Ort im 
Eeprom erzeugt wird. Beispielsweise bewirkt folgender Befehl, was im 
Bild eeprom_02 steht:
1
eeprom_write_byte((uint8_t*)0x06, (uint8_t)0xAF);

Schön längsam bin ich ratlos. Warum nur funktioniert das alles nicht???


Ich bin schon am überlegen, ob da was mit meiner avr-libc nicht passt. 
Ich habe da vor Uhrzeiten mal was gemacht, um mir die Speicherbelegung 
in Prozent anzeigen zu lassen. Scheint aber alles auf dem neusten Stand 
zu sein, oder?
avr-libc   1:1.6.7-1ubuntu2
gcc-avr    1:4.3.4-1

von Krapao (Gast)


Lesenswert?

Sieht für mich nach einem Bedienfehler beim Flashen aus. Leider gibt es 
keine Angaben wie du Flashen tust, also wie die Kommandozeile (von 
AVRDUDE?) aussieht. Daher das Ratespiel und die Möglichkeit mich zu 
blamieren.

Kann es sein, dass du nicht die Datei mit dem EEPROM-Inhalt flashen tust 
sondern eine Programmdatei? Ich frage nur so blöd, weil du nur einen 
Screenshot hast. Mit einer Hex-Datei im anhang hätte ich die Hexdatei im 
AVR-Studio disassembliert und bei falscher Vermutung geschwiegen :)

von Josef K. (zumlin)


Angehängte Dateien:

Lesenswert?

Krapao schrieb:
> Sieht für mich nach einem Bedienfehler beim Flashen aus. Leider gibt es
> keine Angaben wie du Flashen tust, also wie die Kommandozeile (von
> AVRDUDE?) aussieht. Daher das Ratespiel und die Möglichkeit mich zu
> blamieren.
>
> Kann es sein, dass du nicht die Datei mit dem EEPROM-Inhalt flashen tust
> sondern eine Programmdatei? Ich frage nur so blöd, weil du nur einen
> Screenshot hast. Mit einer Hex-Datei im anhang hätte ich die Hexdatei im
> AVR-Studio disassembliert und bei falscher Vermutung geschwiegen :)

Also ins Eeprom flashe ich die eep Datei. Deren Inhalt habe ich auch 
schon erwähnt.
Flashen tue ich - und auch Eclipse - mit folgendem Befehl:
1
Launching /usr/bin/avrdude -pm328p -cstk500v1 -P/dev/ttyACM0 -b115200 -F -Ueeprom:w:Client_C.eep:a 
2
Output:
3
4
avrdude: AVR device initialized and ready to accept instructions
5
6
Reading | ################################################## | 100% 0.03s
7
8
avrdude: Device signature = 0x000000
9
avrdude: Yikes!  Invalid device signature.
10
avrdude: Expected signature for ATMEGA328P is 1E 95 0F
11
avrdude: reading input file "Client_C.eep"
12
avrdude: input file Client_C.eep auto detected as Intel Hex
13
avrdude: writing eeprom (4 bytes):
14
15
Writing | ################################################## | 100% 0.03s
16
17
avrdude: 4 bytes of eeprom written
18
avrdude: verifying eeprom memory against Client_C.eep:
19
avrdude: load data eeprom data from input file Client_C.eep:
20
avrdude: input file Client_C.eep auto detected as Intel Hex
21
avrdude: input file Client_C.eep contains 4 bytes
22
avrdude: reading on-chip eeprom data:
23
24
Reading | ################################################## | 100% 0.03s
25
26
avrdude: verifying ...
27
avrdude: 4 bytes of eeprom verified
28
29
avrdude done.  Thank you.
30
31
avrdude finished

Die Datei mit dem Eeprom Inhalt habe ich mal als Anhang beigepackt, wäre 
aber echt erstaunt, wenn man daraus schlauer wird. Was würdest du 
erwarten? Assemblerbefehle, die man gegen die Befehle in der Hex-Datei 
fürs Flash vergleicht? Soll ich die auch posten?
Hab mal die out.eeprom gegen die Client_C.hex in Diffuse vergleichen 
lassen, aber leider ohne Erfolg.

von Krapao (Gast)


Lesenswert?

> avrdude: Device signature = 0x000000
> avrdude: Yikes!  Invalid device signature.
> avrdude: Expected signature for ATMEGA328P is 1E 95 0F

Liest sich nicht gut. AVRDUDE warnt dich, dass Du versuchst einen µC 
zu flashen, der nicht richtig erkannt wird.

Mit -F

> Launching /usr/bin/avrdude -pm328p -cstk500v1 -P/dev/ttyACM0 -b115200 -F
> -Ueeprom:w:Client_C.eep:a

zwingst du AVRDUDE trotz Fehlermeldung weiter zu machen. Dass dabei 
allerlei Unglücke passieren können, ist für mich klar.

Versuche als erstes die Kommunikation zum µC in Ordnung zu bringen! 
Vorher ist jedes Flashen und jedes Schreiben von AVR Fuses Lotto.

Wenn du den Arduino Bootloader benutzt, ist es klar, dass du mit AVRDUDE 
keine AVR Fuses lesen/schreiben kannst. Es gibt aber einen Weg die 
Fuses aus dem Anwendungsprogramm heraus zu lesen: 
http://www.mikrocontroller.net/articles/AVR_Fuses#Tipps_.2B_Tricks

Dein ausgelesenes EEPROM enthält einen Teil Schrott und einen Teil 
Programmcode.

Um dem weiter auf den Grund zu gehen, müsste man

1/ den Inhalt von Client_C.eep kennen, um zu sehen ob diese Datei den 
Programmcode in EEPROM schafft

2/ dein Programm kennen, um zu sehen, ob das Schrott und ggf. durch 
einen Bufferoverflow Programmcode ins EEPROM schafft.

> War mir dann auch egal, ich lösche einfach das Eerpom "per Hand" in
> meinem Code ab.
> Nun funktioniert das aber auch nicht. Jeder Schreibbefehl führt nur
> dazu, dass wieder Kauderwelsch beliebiger Größe am falschen Ort im
> Eeprom erzeugt wird. Beispielsweise bewirkt folgender Befehl, was im
> Bild eeprom_02 steht:
>
> eeprom_write_byte((uint8_t*)0x06, (uint8_t)0xAF);

Den Quellpufferpointer auf eine wilde Adresse 0x06 zu setzen, sieht für 
mich schon superfischig aus. Abgesehen von der Länge

von Krapao (Gast)


Lesenswert?

> Den Quellpufferpointer auf eine wilde Adresse 0x06 zu setzen, sieht für
> mich schon superfischig aus. Abgesehen von der Länge

Stop, da habe ich mich geirrt und write_byte mit write_block 
verwechselt.

von Josef K. (zumlin)


Lesenswert?

> 1/ den Inhalt von Client_C.eep kennen, um zu sehen ob diese Datei den
> Programmcode in EEPROM schafft
Wie schon erwähnt, darin steht nur folgendes:
1
:0400000000000400F8
2
:00000001FF
Und dass schafft's auch ins ins Eeprom.

> Versuche als erstes die Kommunikation zum µC in Ordnung zu bringen!
> Vorher ist jedes Flashen und jedes Schreiben von AVR Fuses Lotto.
Die Kommunikation schien mir immer in Ordung. Ich arbeite jetzt mit dem 
Arduino Uno schon seit einem halben Jahr ohne Probleme. Ich nutze -F nur 
deshalb, weil ich nicht die "slightly modified version of avrdude" 
nutzen wollte und einfach mal ausschließe, dass ich einen falschen 
Controllertyp auswähle. http://arduino.cc/en/Guide/Troubleshooting#toc23
Aber anscheinend verträgt sich der Bootloader auch an anderen Ecken 
nicht so, wie ich das dachte, mit dem originalen avrdude, als an dem 
Signature-Check.

Ich probiere das Ganze mal über ICSP und schau, wie es sich da 
verhält...

von Josef K. (zumlin)


Lesenswert?

Josef Kkk schrieb:
> Ich probiere das Ganze mal über ICSP und schau, wie es sich da
> verhält...

...und siehe da, es funktioniert alles wie gewollt.

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.