Fuses auslesen mit avrdude

Hallo,

ich versuche gerade von einem DFROBOT dfrduino mega (m2560) und einem dfrduino 2009 duemilanove per avrdude die fuses auszulesen. Leider mit bescheidenem Erfolg.
Beim Mega bekomme ich zumindest eine Antwort:

./avrdude -c stk500v2 -P /dev/cu.usbserial-A500CO5U -p m2560 -n -v -C ../etc/avrdude.conf

avrdude: Version 5.11, compiled on Sep  2 2011 at 18:52:52
         Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
         Copyright (c) 2007-2009 Joerg Wunsch

         System wide configuration file is "../etc/avrdude.conf"
         User configuration file is "/Users/mario/.avrduderc"
         User configuration file does not exist or is not a regular file, skipping

         Using Port                    : /dev/cu.usbserial-A500CO5U
         Using Programmer              : stk500v2
         AVR Part                      : ATMEGA2560
         Chip Erase delay              : 9000 us
         PAGEL                         : PD7
         BS2                           : PA0
         RESET disposition             : dedicated
         RETRY pulse                   : SCK
         serial program mode           : yes
         parallel program mode         : yes
         Timeout                       : 200
         StabDelay                     : 100
         CmdexeDelay                   : 25
         SyncLoops                     : 32
         ByteDelay                     : 0
         PollIndex                     : 3
         PollValue                     : 0x53
         Memory Detail                 :

                                  Block Poll               Page                       Polled
           Memory Type Mode Delay Size  Indx Paged  Size   Size #Pages MinW  MaxW   ReadBack
           ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
           eeprom        65    10     8    0 no       4096    8      0  9000  9000 0x00 0x00
           flash         65    10   256    0 yes    262144  256   1024  4500  4500 0x00 0x00
           lfuse          0     0     0    0 no          1    0      0  9000  9000 0x00 0x00
           hfuse          0     0     0    0 no          1    0      0  9000  9000 0x00 0x00
           efuse          0     0     0    0 no          1    0      0  9000  9000 0x00 0x00
           lock           0     0     0    0 no          1    0      0  9000  9000 0x00 0x00
           calibration    0     0     0    0 no          1    0      0     0     0 0x00 0x00
           signature      0     0     0    0 no          3    0      0     0     0 0x00 0x00

         Programmer Type : STK500V2
         Description     : Atmel STK500 Version 2.x firmware
         Programmer Model: AVRISP
         Hardware Version: 15
         Firmware Version Master : 2.10
         Vtarget         : 0.0 V
         SCK period      : 165.0 us

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.05s

avrdude: Device signature = 0x1e9801
avrdude: safemode: lfuse reads as 0
avrdude: safemode: hfuse reads as 0
avrdude: safemode: efuse reads as 0

avrdude: safemode: lfuse reads as 0
avrdude: safemode: hfuse reads as 0
avrdude: safemode: efuse reads as 0
avrdude: safemode: Fuses OK

avrdude done.  Thank you.

Aber alle fuses scheinen auf 0x0 gesetzt zu sein, was mich etwas wundert.
Beim duemilanove bekomme ich noch nichtmal einen connect:

./avrdude -c stk500 -P /dev/cu.usbserial-A500COCS -p m328p -n -v -C ../etc/avrdude.conf

avrdude: Version 5.11, compiled on Sep  2 2011 at 18:52:52
         Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
         Copyright (c) 2007-2009 Joerg Wunsch

         System wide configuration file is "../etc/avrdude.conf"
         User configuration file is "/Users/mario/.avrduderc"
         User configuration file does not exist or is not a regular file, skipping

         Using Port                    : /dev/cu.usbserial-A500COCS
         Using Programmer              : stk500
avrdude: stk500v2_ReceiveMessage(): timeout

Beide Arduinos lassen sich auf dem gleichen Rechner (Mac OS 10.6) sowohl mit der IDE 1.0 als auch mit der 023 ansprechen.
Jemand eine Idee was ich falsch mache?
Mario.

Ich würde darauf tippen, daß die Lockbits so gesetzt sind, daß Du den Controller nicht auslesen können sollst. Wenn Du den Controller trotzdem auslesen willst, geht das. Aber vermutlich übersteigt das Deine Möglichkeiten. Die Vorgehensweise wäre: Gehäuseoberseite entfernen und Chip freilegen (aber nichts kaputt machen). Dann die Fuses lokalisieren (Mikroskop!). Dann nur die Fuses löschen.

Das Prinzip kannst Du hier nachlesen:
http://www.bunniestudios.com/blog/?page_id=40

Und bei Flylogic kannst Du nachlesen wie das bei einem Atmega 88 aussieht. Bei den Größeren wird's wohl ähnlich sein, aber der Aufwand ist wohl eher zu hoch für Dich.
http://www.flylogic.net/blog/?p=23

Du könntest auch noch probieren, die fusebytes gezielt zu lesen durch Erweiterung des avrdude-Kommandos:

avrdude ........ -Ulock:r:t1:h -Uefuse:r:t2:h -Uhfuse:r:t3:h -Ulfuse:r:t4:h

So wird das lock- sowie das jeweils gelesene fuse-Byte in die Dateien t1, t2, t3, t4 geschrieben.

"avrdude: stk500v2_ReceiveMessage(): timeout":
Das liegt meistens daran, daß die USB-Schnittstelle noch von einem anderen Programm geöffnet ist.

Wenn Udos Vermutung zutrifft, sollte doch trotzdem zumindest noch das Lockbyte zu lesen sein ?

Gruß, mmi.

Hmm, auch die Fuses direkt lesen bringt nix:

./avrdude -c stk500 -P /dev/cu.usbserial-A500CO5U -p m2560 -Ulock:r:-:h -Uefuse:r:-:h -Uhfuse:r:-:h -Ulfuse:r:-:h -C ../etc/avrdude.conf

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.05s

avrdude: Device signature = 0x1e9801
avrdude: reading lock memory:

Reading | ################################################## | 100% 0.02s

avrdude: writing output file "<stdout>"
0x0
avrdude: reading efuse memory:

Reading | ################################################## | 100% 0.01s

avrdude: writing output file "<stdout>"
0x0
avrdude: reading hfuse memory:

Reading | ################################################## | 100% 0.02s

avrdude: writing output file "<stdout>"
0x0
avrdude: reading lfuse memory:

Reading | ################################################## | 100% 0.01s

avrdude: writing output file "<stdout>"
0x0

avrdude: safemode: Fuses OK

avrdude done.  Thank you.

Einen andreren Programmer beim Lesen des Duemilanove würde ich auch ausschliessen, ich sehe auch während avrdude versucht auf den Controller zuzugreifen die TX-Led leuchten. Ich habe auch schon verschiedene Baudraten erzwungen, leider ohne Erfolg.

Nimm einen Controller bei dem Du die Fuses lesen kannst und setz doch mal die Locks und schau nach ob die Fuses dann noch lesbar sind. Kann ja nichts passieren, Du kannst ja hinterher den Controller wieder löschen.

Das scheitert zur Zeit an einem weiteren Controller :slight_smile:
Zumindest habe ich dem Duamilanove jetzt Daten abringen können. Ein Dauer "grep" auf die akuell laufenden Prozesse, während die IDE ein Sketch überträgt hat die passenden Parameter zu Tage gefördert. Übertragen wird mit 57600baud. Das hatte ich zwar auch probiert, vermutlich aber mit dem falsche Programmer als Parameter.
Auch beim Duemilanove werden die Fuses alle mit 0x0 ausgegeben, was nun aber nicht zusätzlich verwundert, ist es doch der gleiche Hersteller.

OK, erledigt.
Mit dem USBtinyISP kann ich bei beiden Arduinos die Fuses auslesen. Seltsam, das es über den Bootloader nicht geht, der sich ja wie ein stk500 verhalten soll.
Und ich musste noch nicht mal an den Chips herum kratzen :slight_smile:

Das ist nicht seltsam; der Bootloader ist nicht dazu programmiert die Fuse auszulesen oder zu setztn.
Grüße Uwe