Forum: Compiler & IDEs Fuses per Source Code setzen


von Andreas (ah3112)


Lesenswert?

Hallo,

ich habe ein Atmega2560 Pro Board. Dabei lassen sich die Fuses nicht 
über die USB-Schnittstelle bzw. den Bootloader setzen.

Daher hatte ich versucht, die per Source-Code zu setzen. Gefunden habe 
ich dazu mehrere Beispiele im Internet, u.a. das hier: 
https://www.nongnu.org/avr-libc/user-manual/group__avr__fuse.html

Nachdem das auf dem Board per Software nicht funktioniert hatte, war 
meine Vermutung, dass es am Board liegt und daher habe ich das für einen 
Atmega2560 auf dem STK600 probiert.

Hier der Source dazu:
1
#include <avr/io.h>
2
#include <util/delay.h>
3
4
__fuse_t __fuse __attribute__((section (".fuse"))) =
5
    {
6
        .low = LFUSE_DEFAULT,
7
        .high = (FUSE_BOOTSZ0 & FUSE_BOOTSZ1 & ~FUSE_EESAVE & FUSE_SPIEN & FUSE_JTAGEN),
8
        //.extended = EFUSE_DEFAULT,
9
    .extended = FUSE_BODLEVEL0,
10
    };
11
12
#define STATUS_LED_DDR  DDRB
13
#define STATUS_LED_PORT  PORTB
14
#define STATUS_LED    PB7
15
16
int main( void )
17
{
18
  STATUS_LED_DDR = ( 1 << STATUS_LED ) ;
19
20
    while( 1 ) {
21
      STATUS_LED_PORT ^= ( 1 << STATUS_LED );
22
        _delay_ms(1500);
23
    }
24
}

Das ich dort den Bodlevel0 eingetragen habe, hat nur den Grund, dass ich 
überhaupt eine Änderung an den Fuses gegenüber vorher sehen wollte. Ich 
habe auch bei einem weiteren Test High-Fuse & ~FUSE_JTAGEN eingetragen.

Ich habe mit avrdude zunächst die hex-Datei übertragen. Irgendwo im 
Internet habe ich gelesen, dass ich die elf-Datei übertragen muss. Der 
Aufruf war folgendermaßen:
1
avrdude.exe -p atmega2560 -P usb -c stk600  -U flash:w:AVR_Set_Fuses.elf:a

Aber auch das hat nicht funktioniert.

Auch beim Überspielen der elf-Datei mit Mikrochip-Studio hat das nicht 
funktioniert.

Daraufhin habe ich das zum Testen mit der arduino-IDE gemacht.
1
#include <avr/io.h>
2
FUSES = 
3
{
4
    LFUSE_DEFAULT, // .low
5
    (FUSE_BOOTSZ0 & FUSE_BOOTSZ1 & FUSE_EESAVE & FUSE_SPIEN & ~FUSE_JTAGEN), // .high
6
    //EFUSE_DEFAULT, // .extended
7
    FUSE_BODLEVEL0,
8
};
9
10
#define STATUS_LED_DDR  DDRB
11
#define STATUS_LED_PORT  PORTB
12
#define STATUS_LED  PB7
13
14
void setup() {
15
  // put your setup code here, to run once:
16
  STATUS_LED_DDR = ( 1 << STATUS_LED ) ;        // PB5 an PORTB als Ausgang setzen
17
}
18
19
void loop() {
20
  // put your main code here, to run repeatedly:
21
  STATUS_LED_PORT ^= ( 1 << STATUS_LED );
22
  _delay_ms(1500);
23
}

Aber auch das hat nicht funktioniert. In der Arduino-IDE habe ich das 
per Programmer auf das STK600 gespielt. Dort wird allerdings immer die 
Hex-Datei aufgerufen.

Kann mir jemand sagen, was ich falsch mache?

Vorab vielen Dank.
Andreas

von Jim M. (turboj)


Lesenswert?

Würde mich nicht überraschen wenn die Fuses nur via ISP/Debug Port 
veränderbar sind.

Lies mal das entsprechende Kapitel im Handbuch des µC nach.

Da bei AVR auch der primäre Oszillator in den Fuses drin ist, wird es 
mit dem Setzen in Software eher schwierig.

Die Fuse Daten landen via Liker im ELF und können so von ISP Tools wie 
avrdude direkt benutzt werden (d.h. von Tools die Fuses schreiben 
können).

Kann sein das diese Daten gar nicht erst im Hex landen - da würde ich 
mal nach der Zeile im Makefile schauen die das Hex erzeugt.

von Oliver S. (oliverso)


Lesenswert?

Andreas schrieb:
> Daher hatte ich versucht, die per Source-Code zu setzen. Gefunden habe
> ich dazu mehrere Beispiele im Internet, u.a. das hier:
> https://www.nongnu.org/avr-libc/user-manual/group__avr__fuse.html

Dann lies nochmal genau nach, was da steht.
Fuses setzen über Software geht nicht. Das geht nur über einen 
ISP/Jtag/…Programmer, nicht jedoch über einen bootloader.
Wenn dein Board die dafür erforderlichen Pins nicht rausführt, dann 
gehts halt gar nicht. Das ist allerdings ziemlich unwahrscheinlich.

https://forum.arduino.cc/t/fuses-uber-arduino-board-andern/176933/4

> In der Arduino-IDE habe ich das
> per Programmer auf das STK600 gespielt. Dort wird allerdings immer die
> Hex-Datei aufgerufen.

AVRDude von Hand mit dem elf-file aufrufen würde helfen, aber eben nicht 
über den bootloader.

Oliver

: Bearbeitet durch User
von Hmmm (hmmm)


Lesenswert?

Andreas schrieb:
> Gefunden habe ich dazu mehrere Beispiele im Internet, u.a. das hier:
> https://www.nongnu.org/avr-libc/user-manual/group__avr__fuse.html

Da steht doch explizit drin, dass das nur eine ELF-Section mit den Fuses 
erzeugt, die dann von geeigneten Programmer-Tools gelesen wird.

Bringt Dir also gar nichts, wenn Dein Bootloader Dich nicht an die Fuses 
lässt.

Andreas schrieb:
> avrdude.exe -p atmega2560 -P usb -c stk600  -U
> flash:w:AVR_Set_Fuses.elf:a

Damit werden ohnehin keine Fuses geschrieben.

Andreas schrieb:
> Irgendwo im Internet habe ich gelesen

Tolle Quelle. Wie wär's stattdessen mit der offiziellen 
AVRDUDE-Dokumentation?

von Andreas (ah3112)


Lesenswert?

Jim M. schrieb:
> Kann sein das diese Daten gar nicht erst im Hex landen - da würde ich
> mal nach der Zeile im Makefile schauen die das Hex erzeugt.
Mit dem Hex-File kann ich nachvollziehen. Aber ich habe das auch mit dem 
elf-File versucht.
Jim M. schrieb:
> Lies mal das entsprechende Kapitel im Handbuch des µC nach.
Das ich die Fuses nicht direkt in der Software ändern kann, dass hatte 
ich verstanden. Aber laut der von mir verlinkten Seite, sollte das auf 
die Art gehen. Danke Dir trotzdem für Deine Anmerkung.

Oliver S. schrieb:
> Dann lies nochmal genau nach, was da steht.
> Fuses setzen über Software geht nicht. Das geht nur über einen
> ISP/Jtag/…Programmer, nicht jedoch über einen bootloader.
Vielleicht solltest Du mal genau lesen, was ich im Eingangsbeitrag 
geschrieben habe. Dann hättest Du festgestellt, dass ich das beim STK600 
gemacht habe. Ohne Bootloader.

Oliver S. schrieb:
> AVRDude von Hand mit dem elf-file aufrufen würde helfen, aber eben nicht
> über den bootloader.
Auch hier hilft lesen meines Eingangsbeitrages. Darin steht, dass ich 
das elf-File auf das STK600 übertragen habe. Sogar ohne avrdude und nur 
mit Mikrochip. Wenn von Dir nichts hilfreiches kommt, dann lass es doch 
einfach. Ich habe auch den Eindruck, dass Du die von mir verlinkte Seite 
gar nicht gelesen hast.

Hmmm schrieb:
> Bringt Dir also gar nichts, wenn Dein Bootloader Dich nicht an die Fuses
> lässt.
Nochmal, ich habe es auch über Mikrochip-Studio direkt auf einen 
Atmega2560 auf dem STK600 versucht. Dabei habe ich auch das elf-File 
übertragen. Auch dies ging nicht.

: Bearbeitet durch User
von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Andreas schrieb:
> Ich habe mit avrdude zunächst die hex-Datei übertragen. Irgendwo im
> Internet habe ich gelesen, dass ich die elf-Datei übertragen muss.

Nicht "muss", aber ELF macht vieles einfacher.

> Der Aufruf war folgendermaßen:
1
> avrdude.exe -p atmega2560 -P usb -c stk600  -U 
2
> flash:w:AVR_Set_Fuses.elf:a

Da wird der Flash geschrieben. Es fehlt ddas Schreiben der Fuse Section.

Soweit ich weiß kann man die Fuses zwar im Programm angeben, aber 
dadirch landen dien nicht per Magie auf dem Device. Schreiben muss man 
die Fuses schon, und die liegen eben im normalen Progammspeicher, wie er 
mit flash:w übertragen wird.

Müsste sowas sein wie:
1
-Uhfuse:w:AVR_Set_Fuses.elf -Ulfuse:w:AVR_Set_Fuses.elf -Uefuse:w:AVR_Set_Fuses.elf

Und da sieht man auch warum das einfacher ist als mit IHEX: Man brauch 
nur eine Datei, nämlich AVR_Set_Fuses.elf anstatt nen ganzen Zoo von 
.hex.

von Michael B. (laberkopp)


Lesenswert?

Andreas schrieb:
> Kann mir jemand sagen, was ich falsch mache

Du hast keinen ATmega2560 board sondern einen ARDUINO 2560(pro).

Bei dem lassen sich fuses nicht setzen aka verändern.

Denn er ist schon programmiert mit einem Programm namens bootloader und 
fuses passend zum Quartz auf dem board.

Deine 'Programme' aka Sketche werden nur noch seriell hochgeladen.

Wenn du den ATmega2560 runterlötest und in einen richtigen Programmer 
steckst, kannst du alles machen.

u.a. hex oder elf reinprogrammieren.

: Bearbeitet durch User
von Georg M. (g_m)


Lesenswert?

Michael B. schrieb:
> Wenn du den ATmega2560 runterlötest und in einen richtigen Programmer
> steckst

ISP: in-system programming
(also called in-circuit serial programming: ICSP)

von Hmmm (hmmm)


Lesenswert?

Andreas schrieb:
> Nochmal, ich habe es auch über Mikrochip-Studio direkt auf einen
> Atmega2560 auf dem STK600 versucht. Dabei habe ich auch das elf-File
> übertragen. Auch dies ging nicht.

Den Grund dafür habe ich Dir genannt:

Hmmm schrieb:
> Damit werden ohnehin keine Fuses geschrieben.

Und Johann hat dann noch mehr dazu geschrieben. Man muss AVRDUDE schon 
sagen, was es alles tun soll, in Deinem Fall war das nur das Schreiben 
des Flashs.

von Andreas (ah3112)


Lesenswert?

Johann L. schrieb:
> Da wird der Flash geschrieben. Es fehlt ddas Schreiben der Fuse Section.
> Soweit ich weiß kann man die Fuses zwar im Programm angeben, aber
> dadirch landen dien nicht per Magie auf dem Device. Schreiben muss man
> die Fuses schon, und die liegen eben im normalen Progammspeicher, wie er
> mit flash:w übertragen wird.
Ah, ok. Danke. Dann hatte ich das Ganze falsch interpretiert. Ich hatte 
das so verstanden, wenn das im Sourcecode steht, dann wird beim flashen 
automatisch auch die Fuses gesetzt.

Ich werde das morgen, so wie Du geschrieben hast, mit dem elf-File und 
dem setzen der Fuses auf dem STK600 mal testen. Nur rein aus Interesse, 
löst zwar nicht mein Problem. Das es über den Bootloader nicht geht, ist 
mir schon klar.

Michael B. schrieb:
> Wenn du den ATmega2560 runterlötest und in einen richtigen Programmer
> steckst, kannst du alles machen.
Das war auf dem STK600 ein separater 2560. Der wurde dort über ISP 
programmiert. Aber wie ich zu Johann geschrieben hatte, habe ich das 
Ganze falsch verstanden. Bin davon ausgegangen, steht im elf-File, dann 
werden die mitgesetzt. Aber habe es jetzt verstanden. Dann muss ich die 
auf dem Board auch über ISP setzen.

: Bearbeitet durch User
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.