Forum: Mikrocontroller und Digitale Elektronik AVR Dragon kann fuses nicht schreiben


von TM F. (p_richner)


Lesenswert?

Hallo zusammen

Ich habe einen AVR Dragon, mit dem ich die Fuses eines Attiny48 
schreiben möchte. Per Kommandozeile kann ich die Fuses auslesen, wenn 
ich jedoch sie schreiben möchte kommen diese Meldungen:
1
>avrdude -p attiny48 -P usb -c dragon_isp -U hfuse:w:testfile.fuse -B
2
 10 -v -v
3
4
avrdude: Device signature = 0x1e9209
5
avrdude: safemode: lfuse reads as 6E
6
avrdude: safemode: hfuse reads as DF
7
avrdude: safemode: efuse reads as 1
8
avrdude: reading input file "testfile.fuse"
9
avrdude: input file testfile.fuse auto detected as Intel Hex
10
avrdude: ERROR: address 0x0003 out of range at line 1 of testfile.fuse
11
avrdude: write to file 'testfile.fuse' failed
12
13
avrdude: safemode: lfuse reads as 6E
14
avrdude: safemode: hfuse reads as DF
15
avrdude: safemode: efuse reads as 1
16
avrdude: safemode: Fuses OK
17
avrdude: stk500v2_jtagmkII_close()
18
avrdude: jtagmkII_close()
19
avrdude: jtagmkII_close(): Sending sign-off command: 0x80 (1 bytes msg)
20
21
avrdude done.  Thank you.

Das Fuses-File habe ich mit CodeBlocks generiert.
Programmieren konnte ich schon mit einem anderen AVR-Tool. Möchte jetzt 
wegen dem Debuggen jedoch auf den Dragon ändern.

Suche eine Lösung wie ich die Fuses programmieren kann und dann das 
ganze Programm draufladen.

MfG

von hase (Gast)


Lesenswert?

TM F. schrieb:
>
1
> avrdude: input file testfile.fuse auto detected as Intel Hex
2
> avrdude: ERROR: address 0x0003 out of range at line 1 of testfile.fuse
3
> avrdude: write to file 'testfile.fuse' failed
4
>

Hat also nichts mit der 'testfile.fuse' zu tun. Deshalb fehlt sie auch 
im Anhang. Außerdem weißt du welche Fuses du wie setzten möchtest. Gut, 
daß ich den Dragon nicht kenne.

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


Lesenswert?

TM F. schrieb:
> address 0x0003 out of range

Die hfuse hat genau ein Byte, du versuchst aber offenbar, jenseits
dieses einen Bytes etwas zu schreiben.

von TM F. (p_richner)


Lesenswert?

Jörg W. schrieb:
> Die hfuse hat genau ein Byte, du versuchst aber offenbar, jenseits
> dieses einen Bytes etwas zu schreiben.

Wie kann ich dann dem Dragon mitteilen, dass er nur die hfuses aus dem 
File lesen und schreiben soll?

von Max (Gast)


Lesenswert?

Indem du das entsprechend in die fuses-datei schreibst. Da steht drin an 
welche Stelle geschrieben werden soll.  Und diese Adresse ist wohl 
falsch

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


Lesenswert?

Für die einzelnen Fusebytes ist es übrigens meist sinnvoller, sie
direkt auf der Kommandozeile anzugeben:
1
avrdude -p attiny48 -P usb -c dragon_isp -U hfuse:w:0xdf:m

von Axel S. (a-za-z0-9)


Lesenswert?

TM F. schrieb:
>avrdude -p attiny48 -P usb -c dragon_isp -U hfuse:w:testfile.fuse ...
> ...
> avrdude: reading input file "testfile.fuse"
> avrdude: input file testfile.fuse auto detected as Intel Hex
> avrdude: ERROR: address 0x0003 out of range at line 1 of testfile.fuse

Jede Fuse ist genau 1 Byte. Das Hexfile darf also auch nur genau 1 Byte 
enthalten. Deins enthält anscheinend 3.

Es ist allgemein unüblich, Werte für die Fuses in ein Hexfile zu 
schreiben. Eher gibt man sie direkt an:

1
avrdude ... -U hfuse:w:0xAB:m -U efuse:w:0xFF:m

siehe dazu das AVRdude Manual zur Bedeutung des :m Modifiers.

Eine andere nette Variante besteht darin, die Fuses in den Quellcode zu 
schreiben und sie zum Programmieren mit dem AVRFuseExtractor 
(https://github.com/ithron/AVRFuseExtractor) zu extrahieren:

1
~ .../AVR/Belichter $ls *.c *.h main.*
2
hal.h   main.c       main.eep   main.hex  main.map
3
main.c  main.disasm  main.elf*  main.lst  main.o
4
5
~ .../AVR/Belichter $tail -18 hal.h | head -6
6
FUSES =
7
{
8
    .low      = (FUSE_CKSEL1 & FUSE_SUT1),
9
    .high     = (FUSE_SPIEN & FUSE_BODLEVEL1 & FUSE_BODLEVEL0),
10
    .extended = EFUSE_DEFAULT
11
};
12
13
~ .../AVR/Belichter $extractfuses.sh avrdude main.elf 
14
-U lfuse:w:0xdd:m -U hfuse:w:0xd9:m -U efuse:w:0xff:m

Ach ja. Mit dem AVR Dragon hat das natürlich nichts zu tun.

von TM F. (p_richner)


Lesenswert?

Danke für die Antworten.
Jetzt sieht es besser aus:)

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


Lesenswert?

Axel S. schrieb:
> AVRFuseExtractor

Braucht man nicht (mehr).  Man kann ja direkt aus dem ELF-File
programmieren:
1
… -U hfuse:w:foo.elf -U lfuse:w:foo.elf -U flash:w:foo.elf

Allerdings ist es fraglich, ob man sie nun wirklich unbedingt bei
jedem Programmiervorgang schreiben muss.  Sind schließlich auch nur
Flash-Zellen, die beim Löschen und Wiederbeschreiben altern.

von Axel S. (a-za-z0-9)


Lesenswert?

Jörg W. schrieb:
> Axel S. schrieb:
>> AVRFuseExtractor
>
> Braucht man nicht (mehr).  Man kann ja direkt aus dem ELF-File
> programmieren:
>
1
… -U hfuse:w:foo.elf -U lfuse:w:foo.elf -U flash:w:foo.elf

Ach cool. Ab welcher avrdude Version geht das?

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


Lesenswert?

Axel S. schrieb:
> Ab welcher avrdude Version geht das?

**blätter, blätter, NEWS, /ELF**

6.0

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.