Forum: Mikrocontroller und Digitale Elektronik AVRDude - Leseproblem


von Heron (Gast)


Lesenswert?

Hallo zusammen,

ich habe ein Mega2560 Board.

Wenn ich Sketches/Apps in das Gerät lade, funktioniert alles 
einwandfrei. Auch kann mit AvrDude den EEPROM schreiben.
=> Schreiben funktioniert fehlerfrei.

Anfangs bin ich über den "sync error" beim verifizieren gestolpert und 
hatte auch das Phänomen, das er fehlerfrei geschrieben hat, aber beim 
Vergleichen die Sync Fehler auftraten.
=> Ich hatte das erstmal auf Prio B zur Seite gelegt.....

Dann wollte ich den EEPROM schreiben und auch wieder lesen. Schreiben 
kann ich mit "AVRDUDE ... -D:w:eeprom:...:r". (r benutze ich, weil ich 
"raw" am besten mit einem HEX Editor lesen und schreiben kann ;)).

Gebe ich mir den Inhalt des EEPROM per Sketch aus, sehe ich, das alles 
ordnungsgemäß geschrieben wurde.

Versuche ich nun per AVRDUDE das Ganze zu lesen, sieht die erzeugte 
Datei merkwürdig aus. - Wenn ich die runterschreiben will, kommt die 
auch 1:1 so im Proz an.

LESEN: avrdude -v -patmega2560 -cwiring -PCOM3 -b115200 -D 
"-Ueeprom:r:test01.eep:r"

SCHREIBEN: avrdude -v -patmega2560 -cwiring -PCOM3 -b115200 -D 
"-Ueeprom:w:test01.eep:r"

Wie gesagt, schreiben funktioniert zu 100%

Wenn ich lese, passiert folgendes:

Geschrieben:
Byte1 Byte2 Byte3 ..... Rest der 4k FF

Gelesen:
Byte1 Byte3 FF.....
bei 2k
Byte1 Byte3 FF bis Ende.

Der Fehler ist mit den verschiedensten Konstellationen reproduzierbar.
Ist da ein Fehler in der AVRDUDE.conf (habe verschiedene Versionen 
ausprobiert, auch Win/Linux)?

als Bootloader wird der Stk500 verwendet (ob v2 weis ich nicht genau).



Danke schonmal Allen.

PS: Falls ich was vergessen habe zu erwähnen, einfach nachfragen.

von Rainer U. (r-u)


Lesenswert?

Woran es in dem Fall liegt, weiß ich auch nicht. Aber mögliche 
Testansätze:

- Schreib mal in einem anderen Format

- es gibt eine Option bei AVRDude um langsamer zu schreiben, probier 
doch mal

- Hast Du wirklich die gesamten 4K durchgesehen? evtl. steht jedes 2. 
Byte auf einer anderen Seite (wär zwar ungewöhnlich, aber nicht 
unmöglich) ODer die Bytes werden allgemein anders abgelegt, als Du es 
erwartest

- gibt es eine Verify-Option (prüflesen nach Schreiben?)

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

"Wiring" ist im Wesentlichen ein STK500v2-Protokoll, nur um die
"Snoozetime" erweitert.

Ich bin mir eigentlich ziemlich sicher, dass das EEPROM-Handling in
AVRDUDE's STK500v2-Implementierung funktioniert, auch für ATMega2560.
Probieren kann ich's aber erst heute abend.

Das könnte allerdings gut und gern auch ein Bug im Bootloader sein,
der da benutzt wird.

: Bearbeitet durch Moderator
von Heron (Gast)


Lesenswert?

Hallo,

vielen Dank schonmal für die Antworten.

Ja, es ist eine stk500v2 FW drin.

Die fehlenden Daten sind nirgendwo in der eep Datei zu finden. Ich habe 
mir auch schon sowas gedacht, aber die Daten sind nicht vorhanden.

Ich hatte vorher Intel HEX (i) verwendet. Konnte da aber nicht direkt 
reinschauen und habe dann raw genommen. Der Effekt ist der gleiche.


Gruß

von Heron (Gast)


Lesenswert?

Sorry, hatte ich übersehen:

ja, -v habe ich immer mit an. Schlägt aber auch immer ab Byte 8 fehl..


Gruß, Heron

von Rainer U. (r-u)


Lesenswert?

Also wenn der Vergleich fehlschlägt und Du seltsame Werte ausliest - 
wieso bist Du dann der Meinung, dass das Schreiben funktioniert?

: Bearbeitet durch User
von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Rainer U. schrieb:
> wieso bist Du dann der Meinung, dass das Schreiben funktioniert?

Schrieb er doch: die Firmware liest die korrekten Werte aus.

Daher ja auch meine Vermutung, dass der benutzte Bootloader kaputt ist.

von Heron (Gast)


Lesenswert?

Sorry, bin erst jetzt dazu gekommen, dem Problem nachzugehen.

Ich habe den original Bootloader ("stk500v2" aus ..Arduino..Tools..) 
getestet.

Das Ergebnis bleibt das Gleiche.

Hier einmal mein Vorgehen:

1. Übersetzen des Bootloader aus Version 1.8.2 mit "make mega2560" 
(WinAVR 20100110).
2. Überspielen via ISP
3. Schreiben des EEPROM mit "avrdude -v -patmega2560 -cwiring -PCOM3 
-b115200 -D "-Ueeprom:w:test.eep:r""
4. Auslesen des EEPROM via ISP: "avrdude -v -patmega2560 -cavrispmkii -D 
"-Ueeprom:r:testreadisp.eep:r"
=> der gelesene EEPROM ist identisch mit dem aus Punkt 3 geschriebenen 
EEPROM.
5. Auslesen des EEPROM "avrdude -v -v -patmega2560 -cwiring -PCOM3 
-b115200 -D "-Ueeprom:r:eetest.eep:r""
=> der gelesene EEPROM entspricht dem "alten" Fehler.

Anbei noch ein paar Ausgaben:

* Avrdude Ausgabe von Punkt 5:
1
avrdude: Version 6.3, compiled on Jan 17 2017 at 12:00:53
2
         Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
3
         Copyright (c) 2007-2014 Joerg Wunsch
4
5
         System wide configuration file is "C:\WinAVR20100110\bin\avrdude.conf"
6
7
         Using Port                    : COM3
8
         Using Programmer              : wiring
9
         Overriding Baud Rate          : 115200
10
         AVR Part                      : ATmega2560
11
         Chip Erase delay              : 9000 us
12
         PAGEL                         : PD7
13
         BS2                           : PA0
14
         RESET disposition             : dedicated
15
         RETRY pulse                   : SCK
16
         serial program mode           : yes
17
         parallel program mode         : yes
18
         Timeout                       : 200
19
         StabDelay                     : 100
20
         CmdexeDelay                   : 25
21
         SyncLoops                     : 32
22
         ByteDelay                     : 0
23
         PollIndex                     : 3
24
         PollValue                     : 0x53
25
         Memory Detail                 :
26
27
                                  Block Poll               Page                       Polled
28
           Memory Type Mode Delay Size  Indx Paged  Size   Size #Pages MinW  MaxW   ReadBack
29
           ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
30
           eeprom        65    10     8    0 no       4096    8      0  9000  9000 0x00 0x00
31
           flash         65    10   256    0 yes    262144  256   1024  4500  4500 0x00 0x00
32
           lfuse          0     0     0    0 no          1    0      0  9000  9000 0x00 0x00
33
           hfuse          0     0     0    0 no          1    0      0  9000  9000 0x00 0x00
34
           efuse          0     0     0    0 no          1    0      0  9000  9000 0x00 0x00
35
           lock           0     0     0    0 no          1    0      0  9000  9000 0x00 0x00
36
           calibration    0     0     0    0 no          1    0      0     0     0 0x00 0x00
37
           signature      0     0     0    0 no          3    0      0     0     0 0x00 0x00
38
39
         Programmer Type : Wiring
40
         Description     : Wiring
41
         Programmer Model: AVRISP
42
         Hardware Version: 15
43
         Firmware Version Master : 2.10
44
         Vtarget         : 0.0 V
45
         SCK period      : 0.1 us
46
47
avrdude: AVR device initialized and ready to accept instructions
48
49
Reading | ################################################## | 100% 0.05s
50
51
avrdude: Device signature = 0x1e9801 (probably m2560)
52
avrdude: safemode: hfuse reads as D8
53
avrdude: safemode: efuse reads as FD
54
avrdude: reading eeprom memory:
55
56
Reading | ################################################## | 100% 10.47s
57
58
avrdude: writing output file "eetest.eep"
59
60
avrdude: safemode: hfuse reads as D8
61
avrdude: safemode: efuse reads as FD
62
avrdude: safemode: Fuses OK (E:FD, H:D8, L:FF)
63
64
avrdude done.  Thank you.

EEPROM (Anfang) der geschriebenen Version (aus 3):
1
00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 
2
16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
3
32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
4
48 49 50 51 52 53 54 55 56 57 58 59 ff ff ff ff


EEPROM (Anfang) der gelesenen Version (aus 5):
1
00 01 02 03 04 05 06 07 16 17 18 19 20 21 22 23 
2
32 33 34 35 36 37 38 39 48 49 50 51 52 53 54 55 
3
64 65 66 67 68 69 ff ff ff ff ff ff ff ff ff ff

Ab Offset 2048 wiederholt sich exakt der gleiche Output.

Wie gesagt, der Bootloader sollte nun passen, da ich direkt den benutzt 
habe, der mit der ArduinoIDE mitinstalliert wurde.

Avrdude und Co sind auch die Versionen, die mit der ArduinoIDE 
mitgeliefert wurden (also nicht die, aus WINAVR).


Danke schonmal im Voraus,
Gruß, Heron.

von Rainer U. (r-u)


Lesenswert?

Das ist ja mal ein interessantes Phänomen..

Also wie oben gesagt, ich würde versuchen langsamer zu agieren 
(AVRDude-Option -b oder -B, je nachdem siehe Beschreibung) und auch mal 
einen anderen Chip verwenden..

von Heron (Gast)


Lesenswert?

OK, ich glaube ich habe das Problem gefunden.

Es scheint ein Bug im Bootloader zu sein !!

Ich habe ein kleines Programm geschrieben, um den STK500v2 direkt 
auszulesen.
Dabei habe ich anfangs aber in den Bootloader geschaut und gesehen, das 
der Sende Buffer eine Größe von 285 Byte hat. Daher habe ich meinen 
Eingangsbuffer auf 256 gelegt.
Damit werden die (ersten) 256 Byte auch korrekt eingelesen. Aber das 
Phänomen, das sich der Inhalt ab Adresse 2048 wiederholte, war noch 
vorhanden.

Also.....bissel nachgedacht.... Wenn AvrDude nun statt den 256, wie bei 
mir, 8 Byte in den Eingangsbuffer liest...
Ich habe meinen Eingangsbuffer also auch auf die 8 Byte gelegt, und 
voila: Absolut der gleiche Fehler.

Der Fehler liegt ergo im Bootloader. Auf der Suche bin ich dann auf 
Folgendes gestossen:

Im CMD_LOAD_ADDRESS steht:
1
  address = (((msgBuffer[3])<<8)|(msgBuffer[4]))<<1;   //convert word to byte address

Das ist es..... Die Adresse wird *2 genommen.....

Daher werden von "0*8 = 0 *2 = 0" die ersten Byte korrekt ausgelesen; 
bei
"1 * 8 = 8 *2 = 16" wird also von Adresse 16 weitergelesen......
Also immer die ungeraden 8*Byte übersprungen.

Eine Änderung ist an dieser Stelle aber nicht gut ;)
Die Adresse wird auch beim Schreiben von EEPROM und FLASH benutzt. Das 
funktioniert aber prima.

Mein Vorschlag wäre hier, das direkt nach dem
1
case CMD_READ_FLASH_ISP:
2
case CMD_READ_EEPROM_ISP:
3
{

die Änderung (halt nur beim Lesen) rückgängig gemacht wird:
1
  address_t myAddress = address >> 1;

um dann mit "myAddress" den Lesevorgang auszuführen.

Was sagt Ihr dazu? Oder gibt es eine geschicktere Variante?


Gruß,
Heron

von Heron (Gast)


Lesenswert?

meine Lösung:


wenn man sich den stk500v2 Bootloader genauer ansieht, dann erkennt man, 
das für das Schreiben des EEPROM der Bug als "issue 543" bereits behoben 
wurde, auch wenn dort "not testet" steht, es funktioniert.

Leider wurde der Bug beim Einlesen des EEPROM nicht behoben.

letztendlich sieht meine Lösung wie folgt aus:
1
....
2
case CMD_READ_FLASH_ISP:
3
case CMD_READ_EEPROM_ISP:
4
....
5
       else                   // Read EEPROM ***************************
6
        {
7
          uint16_t ii = address >> 1;
8
9
          while (size)
10
          {
11
            *p++ = eeprom_read_byte((uint8_t*)ii);
12
            address += 2;          // Select next EEPROM byte
13
            ii++;
14
            size--;
15
          }
16
        }
17
...

Es ist letztlich ähnlicher Code, wie beim Schreiben des EEPROM. Auf 
meinen Controllern funktioniert das Ganze nun prima.


Gruß,
Heron

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.