Forum: Mikrocontroller und Digitale Elektronik AVR: Fuses lesbar, aber nicht schreibbar


von Mari (Gast)


Lesenswert?

Hallo!

Ich habe folgendes Problem mit einem ATMega2560: Nach dem Programmieren 
waren die Fuses kaputt. Also habe ich versucht, den Controller 
wiederzubeleben, indem ich ein 500kHz-Rechteck-Signal (habe ich auch mit 
anderen Frequenzen probiert) an XTAL1 angeschlossen habe. Im Prinzip 
funktioniert das auch- ich kann den Controller wieder programmieren, das 
Programm läuft (mit der entsprechenden Frequenz des Funktionsgenerators) 
und ich kann die Fuses lesen- nur die Fuses wieder neu beschreiben, das 
geht nicht mehr. Die Ausgabe von avrdude sieht dann so aus:



avrdude: AVR device initialized and ready to accept instructions

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

avrdude: Device signature = 0x1e9801
avrdude: reading input file "0xFF"
avrdude: writing efuse (1 bytes):

Writing |  ***failed;
################################################## | 100% 0.00s

avrdude: 1 bytes of efuse written
avrdude: verifying efuse memory against 0xFF:
avrdude: load data efuse data from input file 0xFF:
avrdude: input file 0xFF contains 1 bytes
avrdude: reading on-chip efuse data:

Reading | ################################################## | 100% 
0.00s

avrdude: verifying ...
avrdude: 1 bytes of efuse verified
avrdude: reading input file "0xD9"
avrdude: writing hfuse (1 bytes):

Writing |  ***failed;
################################################## | 100% 0.00s

avrdude: 1 bytes of hfuse written
avrdude: verifying hfuse memory against 0xD9:
avrdude: load data hfuse data from input file 0xD9:
avrdude: input file 0xD9 contains 1 bytes
avrdude: reading on-chip hfuse data:

Reading | ################################################## | 100% 
0.00s

avrdude: verifying ...
avrdude: verification error, first mismatch at byte 0x0000
         0xd9 != 0x99
avrdude: verification error; content mismatch

avrdude done.  Thank you.




Hat jemand eine Idee, warum das nicht geht?

von g457 (Gast)


Lesenswert?

> Die Ausgabe von avrdude sieht dann so aus

..und wie sieht der Aufruf dazu aus? Wie sieht die Hardware aus?

von Mari (Gast)


Lesenswert?

Der Programmierer ist ein mySmartUSB v2.11

Hier noch einmal die komplette Konsolenausgabe:



Launching /usr/bin/avrdude -pm2560 -cavr911 -P/dev/ttyUSB0 -u 
-Uflash:w:test2.hex:a -Ulfuse:w:0xe2:m -Uhfuse:w:0xd9:m -Uefuse:w:0xff:m
Output:

Connecting to programmer: .
Found programmer: Id = "AVR ISP"; type = S
    Software Version = 2.5; Hardware Version = 2.0
Programmer supports auto addr increment.
Programmer supports buffered memory access with buffersize=8 bytes.

Programmer supports the following devices:
  [...]

avrdude: AVR device initialized and ready to accept instructions

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

avrdude: Device signature = 0x1e9801
avrdude: NOTE: FLASH memory has been specified, an erase cycle will be 
performed
         To disable this feature, specify the -D option.
avrdude: erasing chip
avrdude: reading input file "test2.hex"
avrdude: input file test2.hex auto detected as Intel Hex
avrdude: writing flash (394 bytes):

Writing | ################################################## | 100% 
1.38s

avrdude: 394 bytes of flash written
avrdude: verifying flash memory against test2.hex:
avrdude: load data flash data from input file test2.hex:
avrdude: input file test2.hex auto detected as Intel Hex
avrdude: input file test2.hex contains 394 bytes
avrdude: reading on-chip flash data:

Reading | ################################################## | 100% 
0.40s

avrdude: verifying ...
avrdude: 394 bytes of flash verified
avrdude: reading input file "0xe2"
avrdude: writing lfuse (1 bytes):

Writing |  ***failed;
################################################## | 100% 0.00s

avrdude: 1 bytes of lfuse written
avrdude: verifying lfuse memory against 0xe2:
avrdude: load data lfuse data from input file 0xe2:
avrdude: input file 0xe2 contains 1 bytes
avrdude: reading on-chip lfuse data:

Reading | ################################################## | 100% 
0.00s

avrdude: verifying ...
avrdude: verification error, first mismatch at byte 0x0000
         0xe2 != 0xee
avrdude: verification error; content mismatch

avrdude done.  Thank you.

von g457 (Gast)


Lesenswert?

> 500kHz-Rechteck-Signal
[..]
> Launching /usr/bin/avrdude [..]

brems den avrdude, Größenordnung -B 100. Wenns dann nicht geht die 
Ausgabe von (zusätzlich) -vvvv mit zeigen.

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


Lesenswert?

Mari schrieb:
> nur die Fuses wieder neu beschreiben, das geht nicht mehr.

Hat der Controller lockbits gesetzt?  Dann musst du erstmal einen
chip erase machen, solange der gelockt ist, darf man die Fuses nicht
manipulieren.

von Mari (Gast)


Lesenswert?

Hallo!

Nein, die Lockbits habe ich überprüft- sind nicht gesetzt. Ein Chip 
erase war zwar möglch, hat aber leider nichts gebracht.
Die Drosselung der Geschwindigkeit über -B100 hatte auch keine 
Auswirkung.

Hier noch einmal eine Ausgabe mit -vvvv:
1
avrdude -pm2560 -cavr911 -P/dev/ttyUSB0 -u -vvvv -Ulfuse:w:0xe2:m -Uhfuse:w:0xd9:m -Uefuse:w:0xff:m
2
3
avrdude: Version 5.11.1, compiled on Oct 30 2011 at 10:37:28
4
         Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
5
         Copyright (c) 2007-2009 Joerg Wunsch
6
7
         System wide configuration file is "/etc/avrdude.conf"
8
         User configuration file is "/home/marius/.avrduderc"
9
         User configuration file does not exist or is not a regular file, skipping
10
11
         Using Port                    : /dev/ttyUSB0
12
         Using Programmer              : avr911
13
         AVR Part                      : ATMEGA2560
14
         Chip Erase delay              : 9000 us
15
         PAGEL                         : PD7
16
         BS2                           : PA0
17
         RESET disposition             : dedicated
18
         RETRY pulse                   : SCK
19
         serial program mode           : yes
20
         parallel program mode         : yes
21
         Timeout                       : 200
22
         StabDelay                     : 100
23
         CmdexeDelay                   : 25
24
         SyncLoops                     : 32
25
         ByteDelay                     : 0
26
         PollIndex                     : 3
27
         PollValue                     : 0x53
28
         Memory Detail                 :
29
30
                                  Block Poll               Page                       Polled
31
           Memory Type Mode Delay Size  Indx Paged  Size   Size #Pages MinW  MaxW   ReadBack
32
           ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
33
           eeprom        65    10     8    0 no       4096    8      0  9000  9000 0x00 0x00
34
                                  Block Poll               Page                       Polled
35
           Memory Type Mode Delay Size  Indx Paged  Size   Size #Pages MinW  MaxW   ReadBack
36
           ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
37
           flash         65    10   256    0 yes    262144  256   1024  4500  4500 0x00 0x00
38
                                  Block Poll               Page                       Polled
39
           Memory Type Mode Delay Size  Indx Paged  Size   Size #Pages MinW  MaxW   ReadBack
40
           ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
41
           lfuse          0     0     0    0 no          1    0      0  9000  9000 0x00 0x00
42
                                  Block Poll               Page                       Polled
43
           Memory Type Mode Delay Size  Indx Paged  Size   Size #Pages MinW  MaxW   ReadBack
44
           ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
45
           hfuse          0     0     0    0 no          1    0      0  9000  9000 0x00 0x00
46
                                  Block Poll               Page                       Polled
47
           Memory Type Mode Delay Size  Indx Paged  Size   Size #Pages MinW  MaxW   ReadBack
48
           ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
49
           efuse          0     0     0    0 no          1    0      0  9000  9000 0x00 0x00
50
                                  Block Poll               Page                       Polled
51
           Memory Type Mode Delay Size  Indx Paged  Size   Size #Pages MinW  MaxW   ReadBack
52
           ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
53
           lock           0     0     0    0 no          1    0      0  9000  9000 0x00 0x00
54
                                  Block Poll               Page                       Polled
55
           Memory Type Mode Delay Size  Indx Paged  Size   Size #Pages MinW  MaxW   ReadBack
56
           ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
57
           calibration    0     0     0    0 no          1    0      0     0     0 0x00 0x00
58
                                  Block Poll               Page                       Polled
59
           Memory Type Mode Delay Size  Indx Paged  Size   Size #Pages MinW  MaxW   ReadBack
60
           ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
61
           signature      0     0     0    0 no          3    0      0     0     0 0x00 0x00
62
63
         Programmer Type : butterfly
64
         Description     : Atmel AppNote AVR911 AVROSP
65
66
Connecting to programmer: .avrdude: Send: . [1b] 
67
avrdude: Send: S [53] 
68
avrdude: Recv: A [41] 
69
70
avrdude: Recv: V [56] R [52]   [20] I [49] S [53] P [50] 
71
avrdude: Send: V [56] 
72
avrdude: Recv: 2 [32] 5 [35] 
73
avrdude: Send: v [76] 
74
avrdude: Recv: 2 [32] 
75
avrdude: Recv: 0 [30] 
76
avrdude: Send: p [70] 
77
avrdude: Recv: S [53] 
78
Found programmer: Id = "AVR ISP"; type = S
79
    Software Version = 2.5; Hardware Version = 2.0
80
avrdude: Send: a [61] 
81
avrdude: Recv: Y [59] 
82
Programmer supports auto addr increment.
83
avrdude: Send: b [62] 
84
avrdude: Recv: Y [59] 
85
avrdude: Recv: . [00] 
86
avrdude: Recv: . [08] 
87
Programmer supports buffered memory access with buffersize=8 bytes.
88
avrdude: Send: t [74] 
89
90
Programmer supports the following devices:
91
avrdude: Recv: . [01] 
92
    Device code: 0x01
93
avrdude: Recv: . [02] 
94
    Device code: 0x02
95
[...Liste gelöscht...]
96
97
avrdude: Send: T [54] . [01] 
98
avrdude: Recv: . [0d] 
99
avrdude: devcode selected: 0x01
100
avrdude: Send: P [50] 
101
avrdude: Recv: . [0d] 
102
avrdude: AVR device initialized and ready to accept instructions
103
104
Reading |                                                    | 0% 0.00savrdude: Send: s [73] 
105
avrdude: Recv: . [01] . [98] . [1e] 
106
Reading | ################################################## | 100% 0.05s
107
108
avrdude: Device signature = 0x1e9801
109
avrdude: Send: A [41] . [0f] . [fc] 
110
avrdude: Recv: . [0d] 
111
avrdude: Send: g [67] . [00] . [01] E [45] 
112
avrdude: Recv: . [ff] 
113
avrdude: Send: A [41] . [0f] . [fd] 
114
avrdude: Recv: . [0d] 
115
avrdude: Send: g [67] . [00] . [01] E [45] 
116
avrdude: Recv: . [ff] 
117
avrdude: Send: A [41] . [0f] . [fe] 
118
avrdude: Recv: . [0d] 
119
avrdude: Send: g [67] . [00] . [01] E [45] 
120
avrdude: Recv: . [ff] 
121
avrdude: Send: A [41] . [0f] . [ff] 
122
avrdude: Recv: . [0d] 
123
avrdude: Send: g [67] . [00] . [01] E [45] 
124
avrdude: Recv: . [ff] 
125
avrdude: reading input file "0xe2"
126
avrdude: writing lfuse (1 bytes):
127
128
Writing |                                                    | 0% 0.00s ***failed;  
129
Writing | ################################################## | 100% 0.00s
130
131
avrdude: 1 bytes of lfuse written
132
avrdude: verifying lfuse memory against 0xe2:
133
avrdude: load data lfuse data from input file 0xe2:
134
avrdude: input file 0xe2 contains 1 bytes
135
avrdude: reading on-chip lfuse data:
136
137
Reading |                                                    | 0% 0.00savrdude: Send: F [46] 
138
avrdude: Recv: . [ee] 
139
Reading | ################################################## | 100% 0.00s
140
141
avrdude: verifying ...
142
avrdude: verification error, first mismatch at byte 0x0000
143
         0xe2 != 0xee
144
avrdude: verification error; content mismatch
145
avrdude: Send: L [4c] 
146
avrdude: Recv: . [0d] 
147
avrdude: Send: E [45] 
148
avrdude: Recv: . [0d] 
149
150
avrdude done.  Thank you.

: Bearbeitet durch Moderator
von Cyblord -. (cyblord)


Lesenswert?

Das kann auch passieren wenn nicht verwendete Bits, zum setzen mit 0 
angegeben werden, aber natürlich dann beim zurücklesen zu 1 werden.

Also einfach checken und dann diese Bits beim Aufruf von avrdude bereits 
als 1 angegeben.

> 0xd9 != 0x99

Das sieht doch genau danach aus. Die falschen Bits sind wahrscheinlich 
alle ungenutzt.

: Bearbeitet durch User
von Mari (Gast)


Lesenswert?

Hm, verstehe ich nicht ganz... Bei
>0xe2 != 0xee
ist der Unterschied zwischen e2 und ee die Taktquelle (intern/extern). 
Das kann doch eigentlich kein ungenutztes Bit sein?

von Cyblord -. (cyblord)


Lesenswert?

Ja stimmt, ich dachte es wäre die efuse.

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


Lesenswert?

Mari schrieb:
> avrdude: writing lfuse (1 bytes):
>
> Writing |                                                    | 0% 0.00s
> ***failed;
> Writing | ################################################## | 100%
> 0.00s
>
> avrdude: 1 bytes of lfuse written
> avrdude: verifying lfuse memory against 0xe2:
> avrdude: load data lfuse data from input file 0xe2:
> avrdude: input file 0xe2 contains 1 bytes
> avrdude: reading on-chip lfuse data:
>
> Reading |                                                    | 0%
> 0.00savrdude: Send: F [46]
> avrdude: Recv: . [ee]

Irgendwie fehlt da ein Kommando, welches tatsächlich versuchen würde,
die Fuse zu schreiben.

Moment mal: avr911 == "butterfly".  Das ist ein bootloader, der kann
keine Fuses verändern!

Wenn du keinen Bootloader benutzt, sondern einen Standalone-Programmer,
dann wäre der passende Typ "avr910".  Beide Protokolle sind zwar sehr
ähnlich (weshalb der Programmer erstmal reagiert), aber eben nicht
identisch.

: Bearbeitet durch Moderator
von Mari (Gast)


Lesenswert?

Hm, mein Programmer unterstützt avr910 und avr911. Bisher hatte ich 
immer avr910 benutzt, musste jetzt aber auf 911 umsteigen, weil 910 den 
Mega2560 nicht unterstützt...

Was mich jetzt wundert: Die Fuses müssen mindestens 1x gesetzt worden 
sein. Als der Controller nämlich noch neu war (standardmäßig mit 
internem Takt), da hat alles noch funktioniert. Die Probleme haben erst 
angefangen, als ich auf externen Takt umgestellt habe. Und wenn ich die 
Fuses jetzt auslese sehe ich auch, dass externer Takt eingestellt ist...

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


Lesenswert?

Mari schrieb:
> weil 910 den Mega2560 nicht unterstützt

Naja, dem Protokoll ist der Controller ziemlich wurscht.  Kann aber
sein, dass im AVRDUDE niemand die entsprechenden Teile für Adressen
jenseits 128 KiB nachgetragen hat.

Als Würgaround kannst du doch einfach einen anderen Controller angeben
(mit -F die Signaturüberprüfung abschalten) und dann die Fuses ändern.

von Mari (Gast)


Lesenswert?

Vielen Dank für den Tip! Jetzt geht wieder alles :-)

In der avrdude.conf gibt es unter m2560 folgende Zeile:
1
#    avr910_devcode   = 0x43;

Ich habe den Kommentar entfernt und jetzt kann ich im avr910-Moodus 
wieder alles Programmieren.

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


Lesenswert?

Mari schrieb:
> Ich habe den Kommentar entfernt und jetzt kann ich im avr910-Moodus
> wieder alles Programmieren.

Wobei das ganze Konzept der "device codes" halt sehr fragwürdig ist.
Du hattest doch in der Ausgabe von -vvvv eine Liste der vom Gerät
unterstützten Controller und deren devcodes.  Sieh zu, dass die
zueinander passen.

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.