Datum:
Angehängte Dateien:Hier ist Peter Danneggers Bootloader, umgemodelt von Atmel-Assembler auf die GNU-Tools. Beschreibung des Bootloader-Originals in [[http://www.mikrocontroller.net/articles/AVR_Bootlo...]] Kurzanleitung: Auspacken, ins ausgepackte Verzeichnis gehen, README (englisch) lesen. Es muss das Atmel-.def-File hinzugefügt werden und der Makefile auf den MCU-Typ angepasst werden. Bisher getestet mit ATmega168. Ein Makefile-Ziel, das bei Problemen binär mit dem Original vergleicht, ist vorgesehen -- auch dazu: README lesen. Vielen Dank an Peter für den feinen Bootloader und die Erlaubnis, seinen Code weiterzuverbreiten. Bitte schreibt eure Erfahrungen mit anderen MCU-Typen hier ins Forum.
Datum:
Angehängte Dateien:Da ist ein Makefile ohne Erzeugung der Debugging-Symbole durchgerutscht. Dasselbe also nochmal (erzeugter Code identisch, lässt sich aber mit gdb und AVR Studio symbolisch debuggen). Build 18.
Datum:
Versuche es gerade unter Linux mit dem avr-gcc. Eine atmel_def.mak existiert nicht. Woher kommt die?
Datum:
Bitte die Datei README lesen. Falls das Englische Probleme macht: nochmal fragen, dann erläutere ich's auf deutsch.
Datum:
Gut, ich konnte den Bootloader nun generieren. Aber wieso braucht es die AVRStudio Headerdateien. Die avrlibc bringt doch avr/iom*.h mit. Warum kann man die nicht nehmen?
Datum:
eku schrieb: > Gut, ich konnte den Bootloader nun generieren. Aber wieso braucht es die > AVRStudio Headerdateien. Hä. AVRStudio ist eine IDE. Die bringt keine Headerdateien mit. > Die avrlibc bringt doch avr/iom*.h mit. Warum > kann man die nicht nehmen? Die will man aber nicht nehmen. Man möchte beim Aufruf des Compilers den Prozessortyp angeben und die io.h sucht aufgrund dieser Angabe die richtige iom*.h heraus. Eine Source ... für verschiedene Prozessoren verwendbar indem man beim Aufruf des Compilers den Prozessortyp angibt.
Datum:
eku schrieb: > Gut, ich konnte den Bootloader nun generieren. Aber wieso braucht es die > AVRStudio Headerdateien. Die avrlibc bringt doch avr/iom*.h mit. Warum > kann man die nicht nehmen? Das Original verwendet Symbole, die in den C-Headerdateien nicht zu finden sind, beispielsweise die Flashgröße.
Datum:
Karl heinz Buchegger schrieb: > eku schrieb: >> Gut, ich konnte den Bootloader nun generieren. Aber wieso braucht es die >> AVRStudio Headerdateien. > > Hä. > AVRStudio ist eine IDE. Die bringt keine Headerdateien mit. Er meint vermutlich die AVR Definitionsdateien. >> Die avrlibc bringt doch avr/iom*.h mit. Warum >> kann man die nicht nehmen? > > Die will man aber nicht nehmen. > Man möchte beim Aufruf des Compilers den Prozessortyp angeben und die > io.h sucht aufgrund dieser Angabe die richtige iom*.h heraus. > Eine Source ... für verschiedene Prozessoren verwendbar indem man beim > Aufruf des Compilers den Prozessortyp angibt. Darum ging es gar nicht :-)
Datum:
Hallo, ich versuche den Bootloader für einen AT90CAN128 zu Kompilieren. Ich habe im Makefile folgende Änderungen vorgenommmen:
MCU = at90can128 ATMEL_INC = can128def.inc F_CPU = 16000000 CFLAGS += -I . -I ./added -I ./converted -I /opt/avr/include |
Wenn ich nun versuche den Bootloader zu kompilieren erhalte ich folgende Fehler und Warnungen:
$ make
./_conv.awk can128def.inc | gawk '/SIGNATURE_|SRAM_|FLASHEND|BOOT/' > atmel_def.h
gawk '{ printf "%s = %s\n", $2, $3 }' atmel_def.h > atmel_def.mak
avr-gcc -c -mmcu=at90can128 -DF_CPU=16000000 -I . -I ./added -I ./converted -I /opt/avr/include \
-ffreestanding -gstabs+ -Wa,-adhlns=bootload.lst,-L,-gstabs+ -DRAM_START=0x0100 -DSRAM_SIZE=4096 added/bootload.S -o bootload.o
./converted/progmega.inc: Assembler messages:
./converted/progmega.inc:38: Warning: constant out of 8-bit range: 65535
./converted/progmega.inc:61: Warning: constant out of 8-bit range: 508
./converted/password.inc:6: Error: invalid sections for operation on `L0' and `Password'
./converted/message.inc:8: Error: invalid sections for operation on `L0' and `Messages'
./converted/progmega.inc:38: Error: operand out of range: 65535
./converted/progmega.inc:61: Error: operand out of range: 508
make: *** [bootload.o] Fehler 1
|
Hat da einer von euch eine Idee wie ich das lösen kann? Schonmal Danke
Datum:
Der Bootloader funktioniert nur bis zu Flashgrößen von 64k. Für den Bereich darüber wären andere Pointerarten nötig.
Datum:
z.B. für den atmega2560 wurde das weiter mit 16bit pointern gelöst. Intern hat der PC zwar 17bit. Das oberste Bit wird aber von Hand gesetzt. Also hat man zwei Bereiche, an der Trennlinie liegt ein Codestück welches das MSB setzt und damit das hochhüpfen in den oberen Bereich erlaubt. Hintergrund ist der, dass der gcc entweder 16bit oder 32bit pointer verwendet. 24bit ist nicht. 17bit schon gar nicht. Man hat sich dann entschieden, es bei 16bit zu lassen weil man sonst immer 4byte für einen pointer bräuchte statt 2byte. Ohne es mir angesehen zu haben: So etwas könnte man hier mit Sicherheit auch einführen.
Datum:
Machen ließe sich das sicher. Zumal ja nicht mal die Notwendigkeit besteht, innerhalb des Codes wie beschrieben zu springen, das Problem dürfte deutlich einfacher liegen. Fragt sich nur noch, wer das macht ;). Ich komme in diesem Jahr jedenfalls nicht mehr dazu. Es bleibt die Möglichkeit, das Original von Peda einzusetzen.
Datum:
Ich versuche mit fastboot_build18.tar.gz den bootloader fuer einen ATtiny85 zu compilieren und bekomme vom compiler ~/Devel/AVR/BootLoader/fastboot$ make Makefile:96: atmel_def.mak: No such file or directory ./_conv.awk tn85def.inc | gawk '/SIGNATURE_|SRAM_|FLASHEND|BOOT/' > atmel_def.h gawk '{ printf "%s = %s\n", $2, $3 }' atmel_def.h > atmel_def.mak avr-gcc -c -mmcu=attiny85 -DF_CPU=8000000 -I . -I ./added -I ./converted -I/usr/local/avr/include -ffreestanding -gstabs+ -Wa,-adhlns=bootload.lst,-L,-gstabs+ -DRAM_START=0x0060 -DSRAM_SIZE=512 added/bootload.S -o bootload.o ./converted/command.inc: Assembler messages: ./converted/command.inc:63: Error: illegal opcode jmp for mcu attiny85 ./added/fastload.inc:77: Error: illegal relocation size: 1 ./added/fastload.inc:78: Error: illegal relocation size: 1 ./added/fastload.inc:79: Error: illegal relocation size: 1 make: *** [bootload.o] Error 1 die relevanten Zeilen im file ./converted/command.inc sind #if FlashEnd > 0x0FFF jmp Application #else rjmp Application ; run application #endif wenn der compiler das selbe Datenblatt verwendet wie ich dann kann ich den compiler verstehen, da steht nichts ueber einen jmp Befehl. Kann mir jemand von den asm Gurus einen Tip geben. Ju
Datum:
Kannst Du die erzeugte atmel_def.h noch wiedergeben? Interessant ist das Symbol FLASHEND.
Datum:
ändere es in #if FlashEnd > 0x7FFF um.
Datum:
Äm, nö. Das würde zwar für diesen Fall funktionieren, in anderen -- jetzt funktionierenden -- Fällen aber abschmieren. rjmp kann nun mal keine 0x7fff springen, da brauchen wir nicht mal klären, ob es sich um eine Byte- oder Wortadresse handelt. Ich denke, der korrekte Wert wäre 1fff, ich möchte aber die Antwort abwarten.
Datum:
#if __AVR_HAVE_JMP_CALL__ jmp Application #else rjmp Application #endif |
_AVR_HAVE_JMP_CALL_ ist für GCC >= 4.3 dokumentiert. Wenn es auch mit älteren Compilern gehen soll, müsstest du die entsprechenden Architekturen explizit testen:
#if __AVR_ARCH__ == 2 || __AVR_ARCH__ == 25 || __AVR_ARCH__ == 4 rjmp Application #else jmp Application #endif |
Datum:
Prima. Das ist die beste Möglichkeit. Ich werde das (voraussichtlich die 2. Version) in den Source übernehmen. Da ich unterwegs bin, wird es noch 1..2 Tage dauern, bis ich den hier veröffentliche.
Datum:
bin erst jetzt dazugekommen Weiss nicht ob es noch relevant ist, aber hier meine atmel_def.h #define SIGNATURE_000 0x1e #define SIGNATURE_001 0x93 #define SIGNATURE_002 0x0b ; ***** BOOT_LOAD ******************** #define FLASHEND 0x1FFF // Note: Word address #define SRAM_START 0x0060 #define SRAM_SIZE 512 ; ***** BOOTLOADER DECLARATIONS ****************************************** Als asm-Unwissender hab ich die Zeilen mal wie von Jörg Wunsch vorgeschlagen geaendert. nun bleiben noch die Fehlermeldungen ./added/fastload.inc:77: Error: illegal relocation size: 1 ./added/fastload.inc:78: Error: illegal relocation size: 1 ./added/fastload.inc:79: Error: illegal relocation size: 1 der entsprechende code aus der Datei .byte UserFlash>>16 .byte (UserFlash>>8) & 0xff .byte UserFlash & 0xff Ju Edit: meine gcc's sind gcc --version gcc (GCC) 4.2.4 (Ubuntu 4.2.4-1ubuntu4) avr-gcc --version avr-gcc (GCC) 4.2.2
Datum:
Also noch ein weiteres Problem. Ich werde mich ab morgen darum kümmern. Dann steht mir der Rechner, auf dem der Bootloader-Source sich befindet, zur Verfügung.
Datum:
Angehängte Dateien:Guten Abend ich wollte mich rstmal fuer diesen netten Bootloader bedanken, er verrichtet hier brav seine Dienste und erleichtert vieles. Nun wollte ich fastboot_build18.tar.gz auch mal auf einen Atmega8 spielen und stoße da leider auf ein paar Probleme. Wie fuer Mega32 aendere ich einfach das Makefile auf atmega8 und die m8def.inc Nur leider scheint hier das awk/gawk etwas mist zu bauen. im atmel_def.h bzw atmel_def.mak ist FLASHEND auf 0x1FFF gesetzt - wenn ich damit compile gibts einen jmp fehler... wenn ich FLASHEND auf 0x0FFF setzte (wie in der m8def.inc stehend) compiled er ohne Fehler. Die anderen Werte sehen richtig aus. Koennt ihr den awk fehler reproduzieren? Das ganze packe ich dann per avrdude auf den Mega8, wo ich vorher die fuses gesetzt habe. (Da mein USB-ISP Adapter noch nicht fertig ist noch per Bit-Banging) avrdude -p m8 -c ponyser -P /dev/ttyUSB0 -v -U flash:w:bootload.hex ... avrdude: Device signature = 0x1e9307 avrdude: safemode: lfuse reads as EF avrdude: safemode: hfuse reads as DC 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 "bootload.hex" avrdude: input file bootload.hex auto detected as Intel Hex avrdude: writing flash (8192 bytes): Writing | ## | 4% 32.24s Die fuses sollten richtig gesetzt sein, das ganze laeuft auf einem Pollin Eval Board. Das ganze geht gut, Bootloader startet auch, nimmt per lboot auch meine .hex Datei entgegen, nur leider wird das Hauptprogramm nie gestartet. Ohne ein Reset kann ich per lboot wieder was neues Flashen, er scheint also immer nur den Bootloader zu starten, aber nie ins Hauptprogramm zu springen. Ich bin in Assembler nicht wirklich fit, deshalb hab ich mal den ganzen Ordner angehaengt, vllt seht ihr ja wo es hapert. Sofware nutze ich folgende: awk --version :GNU Awk 3.1.6 ,genauso wie gawk avr-gcc --version : avr-gcc (GCC) 4.3.4 Das ganze auf einem Debian squeeze (zzt testing) Vielen Dank schon einmal Hendrik
Datum:
Der gawk macht's schon richtig. Während FLASHEND für den Atmel-Assembler eine Wortadresse ist, muss sie für avr-gcc in eine Byteadresse übersetzt werden. Das macht das gawk-Skript. 8 kBytes sind dann 0x1fff. Zum Problem mit dem jmp/rjmp siehe ein paar Beiträge höher. Ich bin leider noch nicht dazu gekommen, mich darum zu kümmern. Wenn Du FLASHEND einfach mitten in den Flash-Bereich setzst, kommt der Sprung zum Programmbeginn dorthin, aber dort gehört er nicht hin.
Datum:
Okay, hatte ich nicht so ganz verstanden mit Wort und Byte. Hab mal den _AVR_ARCH_ Teil eingebaut. Dann beschreibt "avrdude: ERROR: address 0x3e10 out of range at line 1 of bootload.hex" das rjmp Problem von oben?
Datum:
Ich habe das Problem noch nicht nachvollzogen, aber ich denke, dass die Lösung mit AVR_ARCH auch darauf zutrifft.
Datum:
Angehängte Dateien:Hier die neue Version, die alle Fehler mit rjmps beheben sollte. Für Neuanwender: bitte README lesen. Es gibt einen Abschnitt "QUICK START", der alles nötige erklären sollte.
Datum:
@ mizch
erst mal vielen Dank fuer Deine Version und fuer Dein bemuehen.
Hab leider immer noch Probleme beim compilieren
hier die Ausgabe vom Compiler
flaco:~/Devel/AVR/BootLoader/fastboot$ make
Makefile:102: atmel_def.mak: No such file or directory
./_conv.awk tn85def.inc | gawk '/SIGNATURE_|SRAM_|FLASHEND|BOOT/' >
atmel_def.h
gawk '{ printf "%s = %s\n", $2, $3 }' atmel_def.h > atmel_def.mak
avr-gcc -c -mmcu=attiny85 -DF_CPU=8000000 -I . -I ./added -I
./converted -I/usr/local/avr/include -ffreestanding -gstabs+
-Wa,-adhlns=bootload.lst,-L,-gstabs+ -DRAM_START=0x0060 -DSRAM_SIZE=512
added/bootload.S -o bootload.o
./added/fastload.inc: Assembler messages:
./added/fastload.inc:77: Error: illegal relocation size: 1
./added/fastload.inc:78: Error: illegal relocation size: 1
./added/fastload.inc:79: Error: illegal relocation size: 1
make: *** [bootload.o] Error 1
und die relevanten Zeilen aus ./added/fastload.inc
.byte UserFlash>>16
.byte (UserFlash>>8) & 0xff
.byte UserFlash & 0xff
Ju
Datum:
Angehängte Dateien:Du bist offensichtlich der Erste, der die avr-gcc/avr-gas-Version auf einem µC ohne Boot Section einsetzt. Dann läuft einiges anders. Könntest Du bitte auch dann eine Rückmeldung geben, wenn alles funktioniert? Hier die Version, die die von Dir gemeldeten Fehler behebt.
Datum:
@mizch Klar doch gebe ich auch Rueckmeldung wenn ales tut wie es soll. Das Problem mit dem Compiler hast Du im Griff, er laeuft durch ohne irgendetwas zu beanstanden, doch avrdude meckert beim flashen. flaco:~/Devel/AVR/BootLoader/fastboot$ avrdude -cusbasp -pt85 -Uflash:w:bootload.hex avrdude: AVR device initialized and ready to accept instructions Reading | ################################################## | 100% 0.01s avrdude: Device signature = 0x1e930b avrdude: NOTE: FLASH memory has been specified, an erase cycle will be performed To disable this feature, specify the -D option. avrdude: current erase-rewrite cycle count is 1 (if being tracked) avrdude: erasing chip avrdude: reading input file "bootload.hex" avrdude: input file bootload.hex auto detected as Intel Hex avrdude: ERROR: address 0x3e2e out of range at line 1 of bootload.hex avrdude: write to file 'bootload.hex' failed avrdude: safemode: Fuses OK avrdude done. Thank you.
Datum:
Da hat er recht. 0x3e2e ist "out of range" für ein 8k-Teil. Ich kümmere mich darum.
Datum:
Woher hast Du Deine tn85def.inc? Beim neuesten AVR Studio (4.18SP1) ist nur eine für den Tiny45 dabei. Falls Du eine aus offiziellen Quellen hast, könntest Du sie mir zukommen lassen? Falls Du sie Dir aus der tn45def.inc gebaut hast: Hast Du beachtet, dass die Flashgröße dort in Worten (16 Bit) angegeben ist?
Datum:
Angehängte Dateien:Die tn85def.inc habe ich aus diesem Thread Beitrag "tn85def.inc tn84def.inc" Ju
Datum:
Kannst Du in Deiner atmel_def.h nachschauen, welchen Wert dort FLASHEND hat?
Datum:
Angehängte Dateien:Vergiss die vorige Frage, es war mein Fehler. Ich konnte das Problem jetzt reproduzieren. Mitgeliefert eine Version, die es korrigiert. Für Neueinsteiger: Bitte README lesen.
Datum:
Bitte die Version mit 21 im Namen nur für den Tiny85 benutzen. Sie behebt Probleme damit, schafft aber andere. Alle anderen bitte bei Build#20 (fastboot_build20.tar.gz) bleiben.
Datum:
Angehängte Dateien:Hier ist eine neue, gründlich überarbeitete Version. Ich habe sie querbeet mit den Typen Tiny45, Tiny85, mega8, mega64 und mega2560 geprüft. Auch die Typen "dazwischen" sollten keine Probleme bereiten. Die 64k-Grenze ist also weg, ebenso das Problem mit dem Tiny85. Was nicht geht, sind die ganz kleinen Typen ohne 'movw'-Instruktion wie der Tiny26. Es muss nur noch der Makefile angepasst werden und das Atmel-def-File hinzugefügt werden; siehe README. Bitte diesen lesen.
Datum:
Ich hab das jetzt mal fuer einen m8 konfiguriert
Der build22 meckert bei mir eine fehlende Datei an.
./get_bootsection_addrs.sh
fehlt ihm.
flaco:~/Devel/AVR/m8/BootLoader/fastboot$ make clean
rm -f atmel_def.h bootload.x *.defs *.o *.gas *.mak *.lst *.02x *.map
flaco:~/Devel/AVR/m8/BootLoader/fastboot$ make
Makefile:118: atmel_def.mak: No such file or directory
./_conv.awk m8def.inc | gawk '/PAGESIZE|SIGNATURE_|SRAM_|FLASHEND|BOOT/'
> atmel_def.h
gawk '{ printf "%s = %s\n", $2, $3 }' atmel_def.h > atmel_def.mak
avr-gcc -c -Wa,-adhlns=bootload.lst -mmcu=atmega8 -DF_CPU=16000000 -I .
-I ./added -I ./converted -I/usr/local/avr/include -ffreestanding
-gstabs+ -L,-gstabs+ -DRAM_START=0x0060 -DSRAM_SIZE=1024
-DSTX_PORT=PORTD -DSTX=PD1 -DSRX_PORT=PORTD -DSRX=PD0 added/bootload.S
-o bootload.o
avr-gcc -c -Wa,-adhlns=stub.lst -mmcu=atmega8 -DF_CPU=16000000 -I . -I
./added -I ./converted -I/usr/local/avr/include -ffreestanding -gstabs+
-L,-gstabs+ -DRAM_START=0x0060 -DSRAM_SIZE=1024 -DSTX_PORT=PORTD
-DSTX=PD1 -DSRX_PORT=PORTD -DSRX=PD0 added/stub.S -o stub.o
vars="$(./get_bootsection_addrs.sh 0x0fff 0xf80 0xf00 0xe00 )"; \
eval "$vars"; \
sed -e "s/@LOADER_START@/$LOADER_START/g" \
-e s'/@RAM_START@/0x0060/g' \
-e s'/@RAM_SIZE@/1024/g' \
-e "s/@STUB_OFFSET@/$STUB_OFFSET/g" \
bootload.template.x > bootload.x; \
avr-ld -N -E -T bootload.x -Map=bootload.map \
--cref bootload.o stub.o -o bootload.elf --defsym Application=0
/bin/bash: ./get_bootsection_addrs.sh: No such file or directory
avr-ld:bootload.x:21: syntax error
make: *** [bootload.elf] Error 1
Datum:
Versuche es einmal mit der umbenannten get_text_addrs.sh. Da steht etwas "plausibles" drin. Werner
Datum:
Angehängte Dateien:get_bootsection_addrs.sh ist neu und fehlt in der Liste der zu packenden Programme. Das habe ich übersehen und deshalb ist sie leider nicht mitgeliefert. Sie befindet sich im Anhang. Morgen kommt eine neue gepackte Version, die dann komplett ist.
Datum:
Angehängte Dateien:Hier die komplette neue Version. Es muss nur noch der Makefile angepasst werden und das Atmel-def-File hinzugefügt werden; siehe README. Bitte diesen lesen.
Datum:
@mizch Hut ab, "You got it". Um das ganze mal laufen zu sehen habe ich es zuerst mit einem m8 getestet. Und nachdem ich die fuses alle richtig gesetzt habe lief der bootloader astrein und mein Programm startet nach dem upload. Dann zurueck zum t85. Bootloader compiliert einwandfrei und laesst sich per ISP flashen. efuse auf 0xFE gesetzt Upload-Programm auf dem PC gestartet und es "uploaded" Nur startet mein Programm nicht. :-( Das Test-Programm was ich "uploade" wackelt nur an einem Pin. Wenn ich es per ISP flashe dann wackelt der Pin auch. Nur nach bootloader-upload wackelt er nicht. Ich kann das upload-Programm auf dem PC mehrmals aufrufen und immer wieder "uploaded" es. (ich muss keinen Reset am ATTiny dazu machen). hier die Ausgabe vom upload-Programm flaco:~/Devel/AVR/tn85/FirstTry$ ./bootloader -p main.hex -d /dev/ttyS1 -b 9600 ================================================= | BOOTLOADER, Target: V2.1 | ================================================= COM dev : /dev/ttyS1 Baudrate : 9600 Program : main.hex ------------------------------------------------- Waiting for device... Press CTRL+C to exit. \ ...Connected! Bootloader : V2.1 File "devices.txt" not found! Target : 1E930B (?) Buffer : 64 Bytes Size available: 7678 Bytes CRC enabled and OK. Reading main.hex... File read. Highest address in hex file: 0x0006D (109 Bytes) Writing program memory... Programming "main.hex": 00000 - 0006D SUCCESS CRC: o.k. Elapsed time: 1.292 seconds ...starting application Wie bewegt man den t85 dazu das er erst den Bootloader und wenn nichts ueber serial rein kommt dann das Programm startet. Beim m8 war es die BOOTRST - Fuse, die der t85 nicht hat. Ju
Datum:
Bei MCUs ohne Bootsection überschreibt der Lader den Reset-Vektor (biegt ihn auf sich um) und merkt sich den eigentlich dort geschriebenen Inhalt in den 2 Flash-Bytes direkt unterhalb seiner eigenen Beginnadresse. Dadurch startet immer erst der Bootlader. Wenn der ins Timeout fällt (0,3 sec oder so), wird das Anwenderprogramm gestartet. Es gibt einen Punkt, den ich im Verdacht habe. Nehme mal aus dem Makefile im Abschnitt
bootload.elf : bootload.o stub.o |
das „-c” direkt nach get_text_addrs.sh heraus und probiere, ob das Anwenderprogramm dann startet. Nach der Textersetzung den Bootlader komplett neu mit
make -B |
übersetzen.
Datum:
SUUUUPIIII, das wars. jetzt tut er wie er soll. 1000000- Dank . "realy great job" Ju
Datum:
Angehängte Dateien:Danke fürs Testen. Dann will ich die korrigierte Version mal hiermit unter's Volk bringen. Für Neueinsteiger, die z.B. durch den Wiki hierher geleitet wurden: Bitte die Datei 'README' als Erstes anschauen. Es muss der Makefile angepasst werden und das Atmel-def-File hinzugefügt werden.
Datum:
Hallo euch allen, ich wollt mir grad einen Bootloader für den atmega 8 bauen ... aber ich bekomm es nicht hin. und ich hab es eigentlcih nach anleitung gemacht. 1. alles extrahiert 2. die m8def.inc datei ausm AVR studio in den ordner kopiert 3. MCU = atmega8, ATMEL_INC = m8def.inc im makefile definiert 4. --> make all Fehler: Build started 22.1.2010 at 02:57:24 vars="$(./get_bootsection_addrs.sh 0x0fff 0xf80 0xf00 0xe00 )"; \ eval "$vars"; \ sed -e "s/@LOADER_START@/$LOADER_START/g" \ -e s'/@RAM_START@/0x0060/g' \ -e s'/@RAM_SIZE@/1024/g' \ -e "s/@STUB_OFFSET@/$STUB_OFFSET/g" \ bootload.template.x > bootload.x; \ avr-ld -N -E -T bootload.x -Map=bootload.map \ --cref bootload.o stub.o -o bootload.elf --defsym Application=0 ./get_bootsection_addrs.sh: objdump: command not found c:\WinAVR-20081205\bin\avr-ld.exe:bootload.x:21: syntax error make: *** [bootload.elf] Error 1 Build failed with 1 errors and 0 warnings... an was liegt das? bitte um Hilfe... danke
Datum:
> ./get_bootsection_addrs.sh: objdump: command not found
Oha - da wird 'objdump' statt 'avr-objdump' aufgerufen. Das fällt
natürlich auf einem System wie meinem nicht auf, wo auch ein nativer gcc
installiert ist und objdump deshalb existiert. Ersetze in Datei
get_bootsection_addrs.sh „objdump” durch „avr-objdump” (oder Du wartest
bis heute abend, dann kommt eine korrigierte Version).
Der andere Fehler dürfte nur ein Folgefehler sein.
Datum:
das ging schnell... ich kann eh erst heut abend neu testen .. dann werde ich weiter probieren. Hat jemand schon mal einen Bootloader für den AT90CAN128 via CAN realisiert. ich suche schon ewig nach so einer lösung und finde nicht wirklich etwas. Als verbindung würde ich den CAN <> USb adapter von mictronics nehmen.... der funktioniert wunderbar und ist einfach aufgebaut. siehe link: http://www.mictronics.de/projects/usb-can-bus/ Vielen Dank für die hilfe
Datum:
Angehängte Dateien:Hier die aktualisierte Version, die nicht objdump, sondern avr-objdump voraussetzt. Letzterer ist u.a. Teil von WinAVR und sollte somit immer vorhanden sein. Sonst hat sich nichts geändert. Für Neueinsteiger, die z.B. durch den Wiki hierher geleitet wurden: Bitte die Datei 'README' als Erstes anschauen. Es muss der Makefile angepasst werden und das Atmel-def-File hinzugefügt werden.
Datum:
Hallo Leute ich versuche gerade den Bootloader auf einem ATmega2560 zu installieren. Makefile hab ich laut nach README angepasst, make ausgeführt. Versuche ich das hex-File zu flashen, gibts aber den folgenden verification-Fehler:
avrdude -p atmega2560 -P /dev/ttyUSB1 -c stk500v2 -U flash:w:bootload.hex:i -vvv ... ... avrdude: reading on-chip flash data: Reading | ################################################## | 100% 64.57s avrdude: verifying ... avrdude: verification error, first mismatch at byte 0x1fc00 0xff != 0xf8 avrdude: verification error; content mismatch |
Was mich stutzig macht, ist der Ort 0x1fc00 -- das ist doch irgendwie in der nähe der Bootloadergrenze (0x1fe00) auf welche ich die BOOTSZ-Fuses gesetzt hab. Der Output von "make" lautet:
Makefile:118: atmel_def.mak: No such file or directory ./_conv.awk m2560def.inc | gawk '/PAGESIZE|SIGNATURE_|SRAM_|FLASHEND|BOOT/' > atmel_def.h gawk '{ printf "%s = %s\n", $2, $3 }' atmel_def.h > atmel_def.mak avr-gcc -c -Wa,-adhlns=bootload.lst -mmcu=atmega2560 -DF_CPU=16000000 -I . -I ./added -I ./converted -I/usr/local/avr/include -ffreestanding -gstabs+ -L,-gstabs+ -DRAM_START=0x0200 -DSRAM_SIZE=8192 -DSTX_PORT=PORTE -DSTX=PE1 -DSRX_PORT=PORTE -DSRX=PE0 added/bootload.S -o bootload.o avr-gcc -c -Wa,-adhlns=stub.lst -mmcu=atmega2560 -DF_CPU=16000000 -I . -I ./added -I ./converted -I/usr/local/avr/include -ffreestanding -gstabs+ -L,-gstabs+ -DRAM_START=0x0200 -DSRAM_SIZE=8192 -DSTX_PORT=PORTE -DSTX=PE1 -DSRX_PORT=PORTE -DSRX=PE0 added/stub.S -o stub.o vars="$(./get_bootsection_addrs.sh 0x1ffff 0x1fe00 0x1fc00 0x1f800 )"; \ eval "$vars"; \ sed -e "s/@LOADER_START@/$LOADER_START/g" \ -e s'/@RAM_START@/0x0200/g' \ -e s'/@RAM_SIZE@/8192/g' \ -e "s/@STUB_OFFSET@/$STUB_OFFSET/g" \ bootload.template.x > bootload.x; \ avr-ld -N -E -T bootload.x -Map=bootload.map \ --cref bootload.o stub.o -o bootload.elf --defsym Application=0 LOADER_START=0x3fc00 STUB_OFFSET=0x3fe *** Note: set BOOTSZ fuses for the word address 0x1fe00 *** avr-objcopy -O ihex bootload.elf bootload.hex |
Versuche ich mit lboot zu flashen, beginnt das Programm mit dem Flashvorgang, bricht aber immer bei 85% ab. Hm, wo mache ich was falsch? Vielen Danke und beste Grüße Jochen
Datum:
Mir sieht es danach aus, als ob bei der Erzeugung des .hex-Files etwas schieflief. Das wäre dann ein Fehler des Programms, nicht auf Deiner Seite. Es dürfte 1 oder 2 Tage dauern, bis ich mich das genauer ansehen kann. Hab' solange Geduld.
Datum:
Ich habe doch schon was. Ich habe nämlich zufällig die Datei hier, mit der ich für dem m2560 getestet habe. Könntest Du bitte verifizieren, ob Deine .hex-Datei mit
:020000023000CC :10FC0000 |
beginnt (die zweite Zeile ist auf den Teil abgeschnitten, auf den es ankommt)? Das ist die Startadresse des Bootloaders ((3000 << 4) + fc00). Falls das zutrifft, könntest Du bitte noch überprüfen, dass nirgendwo anders im .hex-File eine Zeile auftritt, die mit
:02000002 |
beginnt? Damit wäre sicher gestellt, dass das Hex-File nirgendwo unter 0x30000 gehen kann (es bleibt - oder sollte bleiben - sowieso oberhalb 3fc00, das fc00 wird aber dann durch die einzelnen Records bestimmt). Ist beides der Fall, dürfte davon auszugehen sein, dass es sich um ein Problem beim Flashen handelt und dass im Bootloader-.hex nichts ist, was die von avrdude monierte Adresse 0x1fc00 betreffen kann.
Datum:
Übrigens: Obiges geht auch kürzer. Mach' mal
avr-objdump -h bootload.hex |
und schau nach, wo die Flashadressen (VMA oder LMA, sollte beides dasselbe sein) sich befinden.
Datum:
Hallo kann beides bestätigen, den Anfang der hex-Datei und das nicht-auftauchen der Adresse... Grüße
Datum:
Oh, da war jemand schneller... hier das Ergebniss:
avr-objdump -h bootload.hex bootload.hex: file format ihex Sections: Idx Name Size VMA LMA File off Algn 0 .sec1 00000400 0003fc00 0003fc00 00000011 2**0 CONTENTS, ALLOC, LOAD |
Datum:
Dann ist es ein Problem Deines AVRs oder Flashers, sorry. Der Bootloader will ja nicht nach 0x1fc00, sondern nach 0x3fc00. Die 0x1fe00 als Beginn der Boot-Section sind übrigens eine Wortadresse und liegen daher nur optisch nahe bei Byteadresse 0x1fc00 (avrdude verwendet Byteadressen), auf der der Fehler auftritt.
Datum:
Hallo Oh, das ist eine blöde Diagnose... Was könnte ich denn mit dem vorhandenen Programmer (stk500v2) noch versuchen? Ansonsten würde mir nur bleiben einen neuen Flasher zu kaufen? Das sieht ja schonmal nicht nach einem elektrischen Problem mit dem Flasher aus (Kabel defekt oder ähnliches), wegend er runden Speicheradresse bei der der Fehler auftritt. Könnte es vielleicht am Linux-Treiber liegen? Oder avrdude? Grüße
Datum:
Mir ist nicht klar, was der avrdude mit der Adresse 0x1fc00 zu schaffen hat, wenn das zu flashende .hex ausschließlich Adressen im Bereich 0x3fc00..0x3ffff enthält. (Da Du die Option -D (disable auto erase) nicht angegeben hast, sollte übrigens ein Erase stattgefunden haben und dort 0xff stehen. Das deutet auf einen Fehler des Chips hin.) Meine allererste Vermutung war wegen der Fehleradresse, dass der Bootloader sich fälschlicherweise doch dorthin lädt, aber das ist ja nun ausgeschlossen. Vielleicht kann jemand anderes etwas dazu sagen.
Datum:
Hi, der Chip könnte defekt sein? Eieiei... Könnte ich das testen, in dem ich eine hex-File erstelle welche nur 0xff's enthält, flashe und wieder auslese? Das auslesen des ganzen Flashspeichers zur Zeit geht. Wie finde ich die Adresse 0x1fc00 ? Habe gerade mal mit Windows und AVR-Studio versucht zu flashen (die exakt gleiche hex-Datei). Da sagt er mir direkt "content matches", und flashen wäre erfolgreich gewesen. Danach scheint der Controller aber tot zu sein, mit lboot kann ich mich dann auch (wieder unter Linux) nicht verbinden. Flashe ich (erfolglos) mit Linux, verbindet sich lboot beim Controller-Reset ja immerhin, bricht dann aber nach einer bestimmten Zeit mit einem Fehler ab... BOOTSZ1 und BOOTSZ0 sind beide auf "unprogrammed" (Bit=1) gesetzt, um einen 512byte großen Bootloader anzugeben. Das BOOTRST Bit ist "programmed" (Bit=0). Das SPIEN ist auch "programmed" (Bit=0). Aber vielen Dank schonmal für die Hilfe... Hat mir schonmal was gebracht! Grüße Jochen
Datum:
Auffällig ist ja schon, dass auf 3fc00 der Inhalt 0xf8 steht und dieser Dir auf 1fc00 zurückgemeldet wird. Neben einem Chipdefekt könnte bei serieller Programmierung auch ein Verschleifen mit dem Nachbar-Adressbit in Frage kommen, da sich beide Adressen nur in einem Bit unterscheiden. Du könntest spaßeshalber die zweite Zeile im .hex herausnehmen (die erste mit :020000023000CC MUSS drinbleiben) und schauen, ob dann als Fehler 0x60 auf Adresse 1fc10 gemeldet wird. Dann weißt Du zwar, dass die Adressen der oberen Flashhälfte in der unteren doppeln, aber viel bringt das Wissen eigentlich nicht. Kannst Du denn andere größere Programme mit avrdude flashen?
Datum:
Hm, ja wenn ich die zweite Zeile im hex lösche, gibts den entsprechenden Fehler:
avrdude: verifying ... avrdude: verification error, first mismatch at byte 0x1fc10 0xff != 0x60 avrdude: verification error; content mismatch |
Andere Programme kann ich problemlos flashen, das aktuelle Projekt hat 14382 bytes (laut avrdude, die hex-Datei ist 40kB groß?). Leider komme ich auf die schnelle auch nicht an einen anderen Programmer, also werde ich das "Projekt Bootloader" wohl verschieben müssen...
Datum:
Die Größe der .hex-Datei kommt schon hin. Je 16 Code-Bytes enthält sie 42 Bytes. Dazu kommen Vor-und Nachspannzeilen. 14k ist nicht besonders groß für einen 256k-Flash. Ich denke, dass Du bei höheren Größen über dieselben Probleme stolpern wirst; einen Zusammenhang mit dem Bootloader kann ich jedenfalls beim besten Willen nicht erkennen.
Datum:
Hallo Hc, habe gerade den Umstieg von 1.7 auf 2.5 gewagt. Was läuft hier schief? avr-gcc -c -Wa,-adhlns=bootload.lst -mmcu=atmega8 -DF_CPU=8000000 -I . -I ./added -I ./converted -I/usr/local/avr/include -ffreestanding -gstabs+ -L,-gstabs+ -DRAM_START= -DSRAM_SIZE= -DSTX_PORT=PORTD -DSTX=PD1 -DSRX_PORT=PORTD -DSRX=PD0 added/bootload.S -o bootload.o ./converted/password.inc: Assembler messages: ./converted/password.inc:13: Error: non-constant expression in ".if" statement ./converted/message.inc:17: Error: non-constant expression in ".if" statement ./converted/message.inc:23: Error: non-constant expression in ".if" statement ./added/fastload.inc:73: Error: illegal relocation size: 1 ./added/fastload.inc:74: Error: illegal relocation size: 1 ./added/fastload.inc:76: Error: illegal relocation size: 1 ./added/fastload.inc:77: Error: illegal relocation size: 1 ./added/fastload.inc:78: Error: illegal relocation size: 1 ./added/fastload.inc:80: Error: illegal relocation size: 1 ./added/fastload.inc:81: Error: illegal relocation size: 1 ./added/fastload.inc:82: Error: illegal relocation size: 1 make: *** [bootload.o] Fehler 1
Datum:
Es fehlen die defines für SRAM_START und SRAM_SIZE. Mach' doch mal einen „make -B” und poste dann die Zeile, die mit ./conf.awk beginnt. Füge bitte als Anhang Deine m8def.inc, atmel_def.h und atmel_def.mak dazu (sie sind nicht gross). Irgendetwas ist auf dem Weg von m8def.inc zu diesen beiden Dateien schief gegangen.
Datum:
Hc Zimmerer schrieb: > Mach' doch mal einen „make -B” und poste dann die Zeile, die mit > > ./conf.awk beginnt. Füge bitte als Anhang Deine m8def.inc, atmel_def.h > > und atmel_def.mak dazu (sie sind nicht gross). make -B war der entscheidende Hinweis: _conv.awk fehlte das x-bit und gleich das nächste Problem: $ make -B ./_conv.awk /home/erik/src/avr/fastboot/avr_gcc/../../avrasm2/defs/m8def.inc | gawk '/PAGESIZE|SIGNATURE_|SRAM_|FLASHEND|BOOT/' > atmel_def.h gawk '{ printf "%s = %s\n", $2, $3 }' atmel_def.h > atmel_def.mak avr-gcc -c -Wa,-adhlns=bootload.lst -mmcu=atmega8 -DF_CPU=8000000 -I . -I ./added -I ./converted -I/usr/local/avr/include -ffreestanding -gstabs+ -L,-gstabs+ -DRAM_START=0x0060 -DSRAM_SIZE=1024 -DSTX_PORT=PORTD -DSTX=PD1 -DSRX_PORT=PORTD -DSRX=PD0 added/bootload.S -o bootload.o avr-gcc -c -Wa,-adhlns=stub.lst -mmcu=atmega8 -DF_CPU=8000000 -I . -I ./added -I ./converted -I/usr/local/avr/include -ffreestanding -gstabs+ -L,-gstabs+ -DRAM_START=0x0060 -DSRAM_SIZE=1024 -DSTX_PORT=PORTD -DSTX=PD1 -DSRX_PORT=PORTD -DSRX=PD0 added/stub.S -o stub.o vars="$(./get_bootsection_addrs.sh 0x0fff 0xf80 0xf00 0xe00 )"; \ eval "$vars"; \ sed -e "s/@LOADER_START@/$LOADER_START/g" \ -e s'/@RAM_START@/0x0060/g' \ -e s'/@RAM_SIZE@/1024/g' \ -e "s/@STUB_OFFSET@/$STUB_OFFSET/g" \ bootload.template.x > bootload.x; \ avr-ld -N -E -T bootload.x -Map=bootload.map \ --cref bootload.o stub.o -o bootload.elf --defsym Application=0 tee: /dev/stderr: Keine Berechtigung *** Note: set BOOTSZ fuses for the word address 0xf00 *** get_bootsection_addrs.sh ist neu. Was soll das 'tee /dev/stderr' bewirken?
Datum:
Das tee /dev/stderr soll bewirken, dass die Werte auch sichtbar ausgegeben werden, mehr nicht. Es kann also auch wegbleiben, bis ich mir eine andere Anzeigemethode habe einfallen lassen. Auf welchem System arbeitest Du (Linux, FreeBSD, Windows, ...)? Weißt Du zufällig, welche Standard-Shell dort benutzt wird?
Datum:
Angehängte Dateien:Hier eine Version, in der der tee nach /dev/stderr herausgenommen und ersetzt wurde. Sonst hat sich an der Funktionalität nichts geändert, es sollte aber auf einer größeren Vielfalt an Systemen durchlaufen. Für Neuanwender: bitte README lesen. Es gibt einen Abschnitt "QUICK START", der alles nötige erklären sollte.
Datum:
Hc Zimmerer schrieb: > Das tee /dev/stderr soll bewirken, dass die Werte auch sichtbar > ausgegeben werden, mehr nicht. Es kann also auch wegbleiben, bis ich > mir eine andere Anzeigemethode habe einfallen lassen. ( printf... ) öffnet eine Subshell. Nichth so elegant. Nimm doch statt tee die Ausgabeumleitung nach &2. > Auf welchem System arbeitest Du (Linux, FreeBSD, Windows, ...)? Weißt > Du zufällig, welche Standard-Shell dort benutzt wird? Linux. Wenn Du /bin/sh reinschreibst bekommst Du auch /bin/sh = Bourne Shell. Nichts mehr und nicht weniger. Das schränkt zwar ein, bleibt aber portabel.
Datum:
> ( printf... ) öffnet eine Subshell. Nichth so elegant. Ich weiß nicht, was an einer Subshell unelegant sein soll. Sie ist ein normales Programmierkunstrukt, um etwas zusammenzufassen. > Nimm doch statt tee die Ausgabeumleitung nach &2. Das ist gewiss nicht die Lösung. Denn damit habe ich es auf stdout nicht mehr. Dort wird es aber gebraucht. Oder warum glaubst Du, dass das tee da ist? Um Dich zu verwirren? Das wäre ja geschafft. > Linux. Wenn Du /bin/sh reinschreibst bekommst Du auch /bin/sh = Bourne > Shell. Dann bekomme ich ein Shell, die Boune-kompatibel sein sollte, aber mehr nicht. Insbesondere nicht, wie Dein "/bin/sh = Bourne Shell" vortäuscht, eine bestimmte. Das kann nämlich dash, bash, ash, busybox, ... sein. Das nicht wissend, hast Du die Frage eben schnippisch mit "/bin/sh = Bourne Shell" beantwortet. Lassen wir's.
Datum:
Hallo euch allen, ich bin schon seit einiger Zeit auf der Suche nach einem CAN-Bootlader für den AT90CAN. Leider konnte ich dazu aber kein fertiges Projekt finden. Genauere Informationen gibt es unter fogendem Link: Titel - Beitrag "CAN BUS Bootloader AT90CAN" Ich hoffe es finden sich einige um dieses Projekt zu realisieren oder die dabei helfen können. Grüße martin
Datum:
Könntet ihr die Diskussion bitte an eine passende Stelle verlagern? Das hat mit dem Thema des Threads nichts zu tun und eine solche Unterhaltung gehört auch nicht in die Codesammlung.
Datum:
Das Thema soll auch nicht hier diskutiert werden. Ich wollte mit dem Eintrag auf das Problem aufmerksam machen. Da diesen Thread viele lesen, die Ahnung von der Programmierung von bootloadern und den zugehörigen Terminal-Programmen haben. Mit dieser Erfahrung können Sie sehr wahrscheinlich bei einer Lösung helfen. danke martin
Datum:
Hallo Hc! Noch eine Bitte fürs Makefile: bootload.elf und bootload.hex in der clean-Regel löschen.
Datum:
Hallo, Ich bins nochmal, in der Hoffnung an der rechten Stelle zu sein... nachdem ich meinen avrisp2-Programmer in die Tonne getreten habe und mir einen neuen (AVRISPmkII) besorgt habe, klappte das Programmieren des Bootloaders. Bin genau nach der Anleitung im Wiki vorgegangen:
avrdude -p atmega2560 -P usb -c stk500v2 -U flash:w:"bootload.hex":i -U flash:v:"bootloader.hex":i -y |
Leider erhalte ich dann beim Flashen mit lboot trotzdem einen CRC-Fehler:
./bootloader -v -d /dev/ttyUSB0 -b 115200 -p ../../version0.05/main.hex ================================================= | BOOTLOADER, Target: V2.1 | ================================================= Port : /dev/ttyUSB0 Baudrate: 115200 File : ../../version0.05/main.hex Reading : ../../version0.05/main.hex... File read. Size : 3767 Bytes Program and verify device. ------------------------------------------------- Waiting for device... connected! Bootloader : V2.1 Target : 1E9801 Buffer : 7680 Byte Size available: 261120 Byte CRC enabled and OK. Programming : 00000 - 00EB7 Writing | ##################################################################################################################### | 100% Elapsed time: 0.26 seconds, 14488 Bytes/sec. ---------- Programming failed (wrong CRC)! ---------- Verify : 00000 - 00EB7 Verifying | ################################################################################################################### | 100% Elapsed time: 0.54 seconds, 6976 Bytes/sec. ---------- Verification failed (wrong CRC)! ---------- ...starting application |
Das hier war eine minimal-Version, flashe ich meine komplette Firmware bricht lboot sogar nach einer Zeit ab (abhängig von der hex-Datei immer an der gleichen Stelle). Das USB-Kabel hab ich auch schon getauscht. Bedeutet es das mein Flash wirklich defekt ist?
Datum:
@Jochen: Du könntest die Datei zur Überprüfung mit dem ISP flashen und verifizieren. Aber auch so ist es eher unwahrscheinlich (wenn auch nicht ausgeschlossen), dass es sich um ein Problem des Bootloaders handelt. @eku: Das ist sinnvoll (in Übereinstimmung mit dem, was andere Makefiles bei 'clean' machen). Für die nächste Version notiert.
Datum:
Die gleiche hex-Datei kann ich mit einem ISP ganz normal flashen, schon hundertmal gemacht -- läuft auch super. Aber das was im Flash steht, wird ja bei der Bootloader installation überschrieben, oder? Danach kann ich dann mit lboot nicht zugreifen. Vielleicht ein Problem mit lboot? Ich seh ein, das fastboot keine Probleme macht ;-) Vielen Dank für die Hilfe...
Datum:
Ich kann Dir leider keine endgültige Antwort geben, da ich nicht jeden ATmega-Typ einzeln testen kann. Ich kann nur gewährleisten, dass der erzeugte Code identisch mit dem Original (fastboot von Peter Dannegger) ist. Da auch dort kein entsprechender Fehler gemeldet ist und es den schon etwas länger gibt, vermute ich, dass Du in Deiner Hardware suchen musst. Aber sicher kann ich es nicht sagen.
Datum:
Moin, ich habe zwei Fragen zum Bootloader, da meine Assembler-Kenntnisse nicht sonderlich groß sind: 1. Ich möchte den AtMega128 gerne über eine Modemverbindung aktualisieren. Hierzu boote ich meine Hauptapplikation und starte so den Bootloader und nehme das Update vor. Das funktioniert soweit auch ganz gut, wenn die Verbindung nicht unterbrochen wird. Kommt es aber zu einer Unterbrechung, dann ist das Gerät leider nicht mehr erreichbar. Es hilf dann nur noch ein Hardware-Reset, wozu man logischerweise am Gerät stehen muss. Ich wollte daher gerne wissen, ob im Bootloader keine Überprüfung beim Flashen vorgenommen werden kann, ob ALLE Daten korrekt geschrieben worden? Falls nicht, dann springt der Bootloader erst gar nicht in die Hauptapplikation und wartet auf das erneute Einspielen der Firmware. Woran erkennt der Bootloader aktuell, dass sich (angeblich) eine Applikation im Flash befindet? 2. Ist es möglich die Lockbits nach dem Firmwareupdate durch den Bootlader zu setzen. Ich möchte gerne das Auslesen der Firmware über ISP verhindern. Vielen Dank schon mal!
Datum:
Würde der Watchdog Dir helfen?
Datum:
Martin Gerken schrieb: > Würde der Watchdog Dir helfen? Der Watchdog hilft leider nicht weiter wenn das Firmwareupdate "mittendrin" unterbrochen wird. Dann ist der Code ja potentiell überhaupt nicht mehr lauffähig. Der Bootloader müsste halt bei Neustart eine Möglichkeit haben zu überprüfen ob der Flash-Vorgang erfolgreich war, bzw. ob eine funktionsfähige Firmware vorhanden ist.
Datum:
F. Wuro schrieb: > Hierzu boote ich meine Hauptapplikation und starte so den > Bootloader und nehme das Update vor. Das funktioniert soweit auch ganz > gut, wenn die Verbindung nicht unterbrochen wird. Wenn das Programm unvollständig geschrieben wurde, wird es bei der Ausführung mit hoher Wahrscheinlichkeit in den Watchdog laufen und der Bootlader wird neu gestartet, wenn die Fuses richtig gesetzt sind. Von daher scheint mir der Watchdog schon ein möglicher Ausweg. Ein Schreiben der Lockbits ist zwar für einen Bootloader theoretisch möglich. Da die 512 Bytes für den Bootloader aber gesteckt voll sind, habe ich gewisse Zweifel, dass Peter Dannegger das implementiert (Du müsstest ihn fragen). Ich möchte mit der AVR-GCC-Version jedenfalls immer seiner Vorlage folgen und keinen Fork machen.
Datum:
Vielen Dank für die schnelle Unterstützung! In der Tat ist der Watchdog die Lösung. Wichtig dabei ist den Watchdog über die Fuse WDTON zu aktivieren und nicht über die Software, da diese im Falle einer Verbindungsabbruchs ja nicht korrekt geschrieben wird. Bezüglich der Lockbits werde ich mich wie vorgschlagen an Peter Danneberger wenden.
Datum:
Hc Zimmerer schrieb: > Die 64k-Grenze ist also weg,... Hallo zusammen, ich habe das Problem, dass Applications >64k auf einem ATmega2561 nicht programmiert werden können (<64k ohne Probleme). Programmierung >64k mit ISP und avrdude oder AVR Studio ist ohne Probleme möglich. @Hc Zimmerer du schreibst die Grenze ist weg. Kannst du mir einen Tip geben wo du was geändert hast? Ich verwende momentan den Bootloader v2.1 aufm AVR - programmiert wird von einem externen Master gem. Protokoll. mit Bootloader programmiert: :10FFE0009F4F2817390739F481E08093AA084957B1 :10FFF0004093E110089550913310952F52FF0BC09C :020000021000EC :10000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 :10001000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0 mit AVR Studio programmiert: :10FFE0009F4F2817390739F481E08093AA084957B1 :10FFF0004093E110089550913310952F52FF0BC09C :020000021000EC :100000008091E50F873639F481E08093AA0887E470 :100010008093E210089593FF0BC08091E60F873222 Vielen Dank schon mal im Voraus.
Datum:
F. S. schrieb: > du schreibst die Grenze ist weg. Kannst du mir einen Tip > geben wo du was geändert hast? Das war eine ganze Reihe von Änderungen, die aber alle darauf hinausliefen, dass der erzeugte Code identisch ist mit dem durch avrasm2 erzeugten Original von peda. Die Originale, mit denen geprüft wird, sind ein paar Tinys, der Mega8, Mega64 und Mega2560. Der 2561 ist also nicht dabei, die Unterschiede dürften aber für einen Bootloader nicht ins Gewicht fallen. Der Vergleich läuft so ab: Das Makefile besitzt ein Target (cmp), das die Codes vergleicht. Dabei werden zunächst beide Versionen (avrasm2 und avr-gcc) in reines Binärformat gewandelt, um Unterschiede im Aufbau der Intel-Hex-Dateien wegzubekommen. Diese beiden Binärdateien werden in einen Hexdump gewandelt und die zwei Hexdumps schließlich mit etwas Shellskript-Magie verglichen. Die Magie sorgt dafür, dass die Unterschiede (falls vorhanden) mit Adressinformationen angereichert werden, so dass sie einfach im Listing wiedergefunden werden können. (Dieser Teil des Makefiles setzt ein Unix-artiges Betriebssystem voraus.) Ein Test mit allen denkbaren AVRs am lebenden Objekt würde den Rahmen sprengen. Auch habe ich hauptsächlich mit den kleineren AVRs zu tun; der größte, den ich hier habe, ist ein 644. Dein Hex-Auszug deutet darauf hin, dass nichts oberhalb der 64-k-Grenze geschrieben wurde. Wenn ich mich richtig erinnere, gab es zumindest einen Fehlerbericht hier in diesem Thread, wo zuviel dort geschrieben wurde (und der letztlich nicht ganz geklärt blieb - es schien mir unwahrscheinlich, dass ein Fehler des Bootladers vorliegt). Ich kann frühestens ab Wochenende nochmal tiefer in das Thema einsteigen ... nur wüsste ich im Moment nicht, wie. Ich kann wahrscheinlich (und muss) davon ausgehen, dass das Original von peda seine Sache schon richtig macht. Vielleicht gibt diese Antwort hier Dir eine Ideee zu einem Vorschlag, vier Augen sehen schließlich mehr als zwei.
Datum:
abend... ich versuche grad einen Bootloader für den atmega8 mit fastboot_build26 zu erstellen. aber ich bekomm es nicht hin. und ich hab es eigentlich nach anleitung gemacht. 1. alles extrahiert 2. die m8def.inc datei ausm AVR studio in den ordner kopiert 3. MCU = atmega8, ATMEL_INC = m8def.inc im makefile definiert 4. --> make all makefile:118: atmel_def.mak: No such file or directory gawk '{ printf "%s = %s\n", $2, $3 }' atmel_def.h > atmel_def.mak make.exe: *** No rule to make target `all'. Stop. aber in dem ordner fastboot wird doch solch ein ordner erstellt mit folgendem inhalt: SIGNATURE_000 = 0x1e SIGNATURE_001 = 0x93 SIGNATURE_002 = 0x07 BOOTRST = 0 BOOTSZ0 = 1 BOOTSZ1 = 2 FLASHEND = 0x0fff SRAM_START = 0x0060 SRAM_SIZE = 1024 ***** = BOOTLOADER PAGESIZE = 32 FIRSTBOOTSTART = 0xf80 SECONDBOOTSTART = 0xf00 THIRDBOOTSTART = 0xe00 FOURTHBOOTSTART = 0xc00 SMALLBOOTSTART = FIRSTBOOTSTART LARGEBOOTSTART = FOURTHBOOTSTART was ist daran jetzt falsch? ich verwende WinAVR mit dem programmers notepad2. danke für die hilfe Paul
Datum:
> makefile:118: atmel_def.mak: No such file or directory > gawk '{ printf "%s = %s\n", $2, $3 }' atmel_def.h > atmel_def.mak > > aber in dem ordner fastboot wird doch solch ein ordner erstellt Dieser Ablauf ist so schon in Ordnung; die 'No such file' - Meldung kommt immer beim ersten Mal und es wird daraufhin, wie Du richtig festgestellt hast, die angemeckerte Datei schon erstellt. Das Anmeckern kann nicht abgestellt werden, da der Makefile sie includet. Das hat nichts damit zu tun: > make.exe: *** No rule to make target `all'. Stop. Der Grund: Du musst einfach 'make' aufrufen, ohne Argumente (wie 'all').
Datum:
mhm... also war meine vermutung richtig... nur die funktion "make" gibt es sicher nicht im programmer notepad 2 oder? ich kann es jedenfalls nciht finden. da kann ich das ganze also nur mit dem avr studio machen oder? :-( danke
Datum:
> nur die funktion "make" gibt es sicher nicht im programmer notepad 2 > oder? Das weiß ich nicht. Was spricht dagegen, ein Kommandozeilenfenster aufzumachen, 'cd' ins Verzeichnis zu machen und 'make' zu tippen?
Datum:
Angehängte Dateien:Alternativ dazu kannst Du auch beiliegendes Makefile nehmen. Die einzige Änderung gegenüber dem Original ist, dass es über ein Dummy-Ziel namens 'all' verfügt, das vom wirklichen Ziel abhängt.
Datum:
hab ich noch nie so gemacht ... aber hat geklappt danke
Datum:
Hallo ich würde sehr gerne wissen mit welchem Compiler die Host-Software für windows kompiliert wurde. Da ich es mit MinGW nicht hinbekomme. Mfg Teshima
Datum:
Was genau verstehst Du unter „Host-Software für windows“?
Datum:
Den teil denn ich in Windows laufen lassen muss um die hex datei zu übertragen.
Datum:
Der Thread mit u.a. der Host-Software befinden sich laut Wiki (http://www.mikrocontroller.net/articles/AVR_Bootlo...) hier („Host-Software für Win32“): Beitrag "Re: UART Bootloader ATtiny13 - ATmega644" . Dort nachzuschauen bzw. anzufragen dürfte für Deine Zwecke besser geeignet sein, da der Thread hier sich mit der residenten AVR-GCC-Version beschäftigt und keine Host-Software behandelt.
Datum:
Hallo, ich versuche seit gestern einen Bootloader auf einem Atmega1281 zum Laufen zu bewegen. Ich habe bereits den Bootloader t13 - m644 ausprobiert, mit dem ich bis jetzt auch keine Probleme hatte. Leider fällt er diesmal durch sporadische Nichtfunktion auf. Daher dachte ich mir, probierst du eben mal diesen hier. Leider habe ich da schon beim Erstellen meine Probleme. Ich denke, alles so wie in der README gemacht zu haben. Ich benutze AVR-Studio 4.17 build 666 mit WinAVR-20090313. Beim Übersetzen kommt der Fehler: Makefile:118: atmel_def.mak: No such file or directory Was aber wohl ganz normal ist, wie ich weiter oben gelesen habe. Die Datei atmel_def.mak wird aber erstellt. Nach mehreren grün markierten Erfolgsmeldungen kommen zum Abschluss diese beiden Fehler. d:\Programme\Atmel\WIN_AVR\bin\avr-ld.exe: avr:51 architecture of input file `bootload.o' is incompatible with avr output d:\Programme\Atmel\WIN_AVR\bin\avr-ld.exe: avr:51 architecture of input file `stub.o' is incompatible with avr output Das ist doch bestimmt was ganz simples und ich bin einfach nur zu doof es zu finden. Könnt Ihr mir bitte weiterhelfen? Gruß Paul
Datum:
Hast Du im Makefile die nötigen Anpassungen durchgeführt, z.B. den µC-Typ eingestellt? Welcher ist dort eingestellt und welcher im Studio?
Datum:
Ja, habe ich alles gemacht. Auch im AVR-Studio ist als Device atmega1281 eingestellt. Ist es richtig, das in den Projektordnern auf der linken Seite (source files, header files usw.) nichts eingebunden ist?
Datum:
Das war jetzt dumm ausgedrückt von mir. Auf der linken Seite ist nur das Makefile eingebunden, aber sonst nichts.
Datum:
Ja, das ist richtig. Der Source ist für die Übersetzung ohne AVR-Studio gedacht, kann aber natürlich auch mit verwendet werden. Du kannst die Quelldateien angeben, aber da mit Makefile übersetzt wird, steuert nur dieser die Übersetzung. Dein Problem dürfte aber darin liegen, dass die Quellen für einen andren Typ kompiliert wurden als der Linker erwartet. Hast Du mal übersetzt und danach den µC-Typ geändert? Egal. Starte mal cmd.exe, wechsle in das Projekt-Verzeichnis, und rufe „make -B“ auf.
Datum:
Oh, das wusste ich nicht, aber leider hat es dennoch nichts genützt. Aber: Eben habe ich aus Spaß im Makefile mal den Proessortyp in Atmega2560 geändert, aber mit m1281def.inc übersetzt. Hat funktioniert. Dann habe ich den Prozessortyp wieder in Atmega1281 geändert und nochmal übersetzt. Und es hat wieder geklappt. Ich kann danach unendlich oft problemlos übersetzen. Wenn ich aber zwischendurch wieder mal auf atmega2560 umstelle, geht es danach auch mit atmega1281 nicht mehr. Der atmega2560 ist wie ein umschalter, mit dem ich zwischen "geht" und "geht nicht" wechseln kann.
Datum:
Wenn Du übersetzt, dann den Makefile änderst, arbeitet das Ding weiter mit den für einen anderen Typ übersetzten Dateien. Das ist nicht sinnvoll. Denn Makefiles sind dazu da, dass bereits gemachte Arbeit nicht nochmal gemacht werden muss. Durch Deine Änderungen am Makefile sorgst Du dafür, dass die bereits gemachte Arbeit den falschen µC-Typ betrifft und mit ungeeigneten Dateien weitergemacht wird. Wenn Du am Makefile was änderst, musst Du vor der nächsten Übersetzung „make clean“ aufrufen.
Datum:
Ich kenne mich mit Makefiles eigentlich gar nicht aus. Mich interessiert mehr die Aufgabe die der Controller dann erledigen soll, daher war ich dafür immer zu bequem und habe das Makefile automatisch erstellen lassen. Ich habe gerade mal ein paar Controllertypen ausprobiert und habe dabei immer den Controllertyp mit entsprechendem .inc File getestet. Es gehen eigentlich alle außer: atmega128 atmega1280 atmega1281 Ich habe nach jeder Änderung im Makefile "make clean" durchgeführt. Vielen Dank schonnmal für deine schnelle Hilfe.
Datum:
Makefiles werden so richtig auch erst bei wesentlich größeren Projekten nützlich, wo die Übersetzungszeit einen wesentlichen Anteil am Debug-Zyklus bekommt. Wie dem auch sei: Ich habe heute Nachmittag einen Termin und werde abends oder morgen die Übersetzung für die von Dir genannten Typen nochmal prüfen. Für'n Moment ist mir die Zeit zu knapp, noch einzusteigen.
Datum:
Gefunden. Als Workaround: Ersetze in bootload.template.x ziemlich am Beginn die Zeile
OUTPUT_ARCH(avr:2) |
durch
OUTPUT_ARCH(avr:51) |
und baue dann neu, also entweder „make -B“ oder „make clean; make“ ausführen. Dieser Workaround ist nur für diesen speziellen Fall (ATmega128x) gültig. Eine allgemeine Lösung wird voraussichtlich bis zum Wochenende warten müssen. Dann gibt es eine neue Version.
Datum:
Hallo, du bist einfach der Beste. Es hat sich ohne Probleme bauen lassen und auch der Bootloader scheint jetzt richtig zu funktionieren. Bei dem anderen hatte ich immer das Problem, dass die Host Software ständig Onewire Modus erkannt hat, obwohl ich Twowire benutze. Ich hoffe das ist jetzt vorbei, aber bis jetzt sieht es gut aus. Vielen Dank nochmals für deine schnelle Hilfe. Grüße Paul
Datum:
Hallo nochmal, kurz nachdem du mir der Workaround gezeigt hast, hatte ich keine Probleme mit dem Bootloader. Eben wollte ich was auf den Controller übertragen, da kommt wieder dieser Fehler mit dem Onewire! COM1 at 38400 Baud: Connected <One Wire> Bootloader VFFFFFFFF.FF Error, wrong device informations Eine Verringerung der Baudrate nützt auch nichts. Ich hatte sogar in dem .def File der Host-Software den atmega1281 mit eingetragen. Leider ohne Erfolg. Ich hab mir jetzt gerade Version 1.7 der Host Software runtergeladen und mit der scheint es zu funktionieren. Iss ja auch nicht so, dass ich hier einen Drahtverhau habe. Der Controller sitzt auf einer richtigen Platine und ist mit ca. 10cm langen Kabeln an einen TTL->RS232 Wandler von Pollin angeschlossen. Nichts Breadboard oder so. Naja, vielleicht funktioniert es ja weiterhin, dann wäre alles gut. Gruß Paul
Datum:
Das dürfte, wie Du bemerkt hast, ein Problem der Host-Software sein. Ich drück' Dir die Daumen, dass es mit der neuen Version weiterhin geht.
Datum:
Angehängte Dateien:Hier die aktuelle Version (für alle Typen inklusive des Bugfixes für die ATmega128x). Vor dem Loslegen bitte README lesen und den ersten Teil des Makefile anpassen. Die Anpassungen geschehen hier im Makefile (anders als im Wiki beschrieben, der die avrasm2-Version behandelt).
Datum:
Hallo, das ging ja sauschnell, herzlichen Dank. Du konntest es wohl nicht erwarten mir zu helfen? ;-) Ich habe eben build27 auf den Atmega1281 geflasht. Bauen ging absolut reibungslos. Das Problem mit fehlerhaften Onewire-Erkennung liegt mit Sicherheit an der Host-Software, denn es trat ja auch mit dem anderen Bootlaoder auf. Ich habe eben problemlos ein paar mal mit beiden Versionen (1.7, 2.1) Firmware auf den Controller geladen. Ich kann aber noch nichts Genaues sagen, werde aber zunächst mal wieder Version 2.1 testen. Da ich den Bootloader bei meiner Applikation eigentlich brauche und auch schon mittelschwer verzweifelt war, weil er nicht ging, hatte ich mich schon nach anderen umgeschaut. Keiner den ich gefunden hatte, ist so bequem, vielseitig und universell. Der auf avr_asambler2-Basis war ja auch schon bequem, aber jetzt ist es ein reiner Genuss. Der Bootloader kann ja nicht den EEPROM programmieren. Kann ich die Variablen/Konstanten per ISP "EEPROMMEN" und die Firmware dann per Bootloader? Grüße Paul P.S.: Könntest du vielleicht bitte kurz erklären (aber nicht zu kompliziert), was da nun faul war? Was ist denn an den Atmega128x so anders, dass so ein Fehler auftreten kann?
Datum:
Was geändert wurde: Ich verwende ein eigenes Linker-Script. Das Linkerscript bestimmt die Speicheraufteilung. Da der Bootloader ans Ende des Flash kommt, ist das standardmäßige Linkerscript des AVR-GCC ungeeignet, deshalb das eigene in einem eigenen Linker-(avr-ld-)Lauf. Das Linkerscript (bootload.x) wird während des Make-Laufs aus einer Vorlage (bootload.template.x) erstellt. Bisher war die AVR-Architektur, für die gelinkt wird, fest vorgegeben. Das führte beim ATmega128x zu dem Fehler, den Du bekommen hast. Nun wird der AVR-GCC gefragt, welche Architektur er nehmen würde, wenn er normal linken würde (die Zeile mit avr-gcc -### ... | gawk ...). Die Architektur wird extrahiert und ins Linkerscript eingetragen. Zu Deiner anderen Frage: Der Bootloader löscht das EEProm nicht, Du kannst es also mit ISP „vorprogrammieren“.
Datum:
Hallo, danke für die Erklärung. Das konnte ich schon halbwegs verstehen. Was ich nur komisch fand, war halt, dass ausgerechnet die m128x Typen betroffen waren. Ich habe übrigens heute den Controller mehrmals problemlos mit Version 2.1 der Host-Software programmiert. Der beschrieben Fehler trat auch nicht einmal auf. Ich werde mich nochmal melden, sollte der Fehler wieder auftreten. Wenn er wieder auftritt, steige ich wieder auf Version 1.7 um. Das mit dem EEPROM dachte ich mir schon, ich wollte nur noch mal sicher gehen. Ich hab schon Stunden nach Fehlern im Code gesucht, aber keine gefunden; dabei hatte ich Rinv... nur vergessen die *.eep-Datei zu übertragen. Gruß Paul
Datum:
AHRGHHHHHHHHHHHH!!! Ich werde noch verrückt. Jetzt geht das wieder nicht. Beide Versionen der Host Software gehen nicht mehr. Das Übertragen von Firmware geht nur nach dem der Bootloader frisch geflasht wurde. Kann es sein, dass da irgendwas mit den Adressen nicht stimmt und er sich mit der Firmware teilweise selbst überschreibt? Gruß Paul
Datum:
hallo, ich glaube ich habe den selben Fehler. - nutze winavr - Bootloader für den AT90can128 auf den UART1(Port D1 und D0) ich habe es mit einem Bootloader für den atmega 8 versucht, da klappt alles besten. jedoch bekomme ich bei der auswahl alle dinge für den AT90Can128 folgende Fehler: *** Note: set BOOTSZ fuses for the word address 0xfe00 *** LOADER_START=0x1fc00 STUB_OFFSET=0x3fe c:\WinAVR-20100110\bin\avr-ld.exe: avr:51 architecture of input file `bootload.o' is incompatible with avr output c:\WinAVR-20100110\bin\avr-ld.exe: avr:51 architecture of input file `stub.o' is incompatible with avr output make.exe: *** [bootload.elf] Error 1 Probiert habe ich es mit dem speziellen Makefile mit dem Befehl makeall und über das Kommandozeilenfenster. Beide bringen den selben Fehler. kann mir jemand möglichst schnell helfen?
Datum:
Hast Du auch die aktuelle Version Beitrag "Re: Peter Danneggers Bootloader (fastboot) für AVR-GCC-Toolchain" (Build 27) dazu verwendet? Nachtrag: Martin J. schrieb: > Probiert habe ich es mit dem speziellen Makefile Das klingt mir eher so, als hättest Du stattdessen (oder zusätzlich) einen speziellen Workaround für einen bestimmten Prozessor blind übernommen (auch avr:51 passt dazu), der durch die neue Version hinfällig wurde.
Datum:
--> ich meite dieses Makefile Hc Zimmerer schrieb: > Alternativ dazu kannst Du auch beiliegendes Makefile nehmen. Die > einzige Änderung gegenüber dem Original ist, dass es über ein Dummy-Ziel > namens 'all' verfügt, das vom wirklichen Ziel abhängt. ich hatte ncoh die version 26, mit der gab es dieses Problem, mit der Version 27 ist es behoben. danke kannst du mir sagen wie Große der Bootloader ist? reicht 1024Byte?
Datum:
Hi,
Ich habe versucht den Build 27 zu compilieren und bekam dabei den
folgenden output:
Makefile:121: atmel_def.mak: No such file or directory
./_conv.awk m168def.inc | gawk
'/PAGESIZE|SIGNATURE_|SRAM_|FLASHEND|BOOT/' > atmel_def.h
gawk '{ printf "%s = %s\n", $2, $3 }' atmel_def.h > atmel_def.mak
avr-gcc -c -Wa,-adhlns=bootload.lst -mmcu=atmega168 -DF_CPU=16000000 -I
. -I ./added -I ./converted -I/usr/local/avr/include -ffreestanding
-gstabs+ -L,-gstabs+ -DRAM_START=0x0100 -DSRAM_SIZE=1024
-DSTX_PORT=PORTD -DSTX=PD1 -DSRX_PORT=PORTD -DSRX=PD0 added/bootload.S
-o bootload.o
avr-gcc -c -Wa,-adhlns=stub.lst -mmcu=atmega168 -DF_CPU=16000000 -I .
-I ./added -I ./converted -I/usr/local/avr/include -ffreestanding
-gstabs+ -L,-gstabs+ -DRAM_START=0x0100 -DSRAM_SIZE=1024
-DSTX_PORT=PORTD -DSTX=PD1 -DSRX_PORT=PORTD -DSRX=PD0 added/stub.S -o
stub.o
vars="$(./get_bootsection_addrs.sh 0x1fff 0x1f80 0x1f00 0x1e00 )"; \
arch="$(avr-gcc -mmcu=atmega168 -### bootload.o -o x 2>&1 |
gawk '/\/bin\/ld/ {print $3}')";\
echo "$vars"; \
eval "$vars"; \
sed -e "s/@LOADER_START@/$LOADER_START/g" \
-e s"/@ARCH@/$arch/" \
-e s'/@RAM_START@/0x0100/g' \
-e s'/@RAM_SIZE@/1024/g' \
-e "s/@STUB_OFFSET@/$STUB_OFFSET/g" \
bootload.template.x > bootload.x; \
avr-ld -N -E -T bootload.x -Map=bootload.map \
--cref bootload.o stub.o -o bootload.elf --defsym
Application=0
*** Note: set BOOTSZ fuses for the word address 0x1f00 ***
LOADER_START=0x3e00
STUB_OFFSET=0x1fe
avr-ld:bootload.x:18: syntax error
make: *** [bootload.elf] Error 1
an der Zeile 18 im boottload.x steht "OUTPUT_ARCH()"
dort wo der inhalt von $arch stehen sollte steht also nichts...
Was sollte denn eigentlich dessen inhalt sein? MCU? Quell-Architektur?
Der Befehl ist mir ein bisschen zu lang um ihn zu verstehen... (bin
nicht gerade fit was bash programmierung angeht :/ )
tatsächlich gibt >> arch="$(avr-gcc -mmcu=atmega168 -### bootload.o -o
x 2>&1 | gawk '/\/bin\/ld/ {print $3}')" << eine leere arch variable
Falls ich ein Einzelfall bin kann ich es ja per hand nachtragen
MFG, Stefan
Datum:
Kannst Du mir den Output der folgenden 2 Kommandos posten?
avr-gcc -mmcu=atmega168 -### bootload.o -o X avr-gcc --version |
Datum:
Ersteres: Using built-in specs. Target: avr Configured with: /var/tmp/portage/cross-avr/gcc-4.4.3/work/gcc-4.4.3/configure --prefix=/usr --bindir=/usr/i686-pc-linux-gnu/avr/gcc-bin/4.4.3 --includedir=/usr/lib/gcc/avr/4.4.3/include --datadir=/usr/share/gcc-data/avr/4.4.3 --mandir=/usr/share/gcc-data/avr/4.4.3/man --infodir=/usr/share/gcc-data/avr/4.4.3/info --with-gxx-include-dir=/usr/lib/gcc/avr/4.4.3/include/g++-v4 --host=i686-pc-linux-gnu --target=avr --build=i686-pc-linux-gnu --disable-altivec --disable-fixed-point --without-ppl --without-cloog --enable-nls --without-included-gettext --with-system-zlib --disable-checking --disable-werror --enable-secureplt --disable-libmudflap --disable-libssp --disable-libgomp --enable-cld --with-python-dir=/share/gcc-data/avr/4.4.3/python --disable-libgcj --enable-languages=c,c++ --enable-shared --disable-threads --disable-bootstrap --disable-libgomp --with-bugurl=http://bugs.gentoo.org/ --with-pkgversion='Gentoo 4.4.3 p1.0' Thread model: single gcc version 4.4.3 (Gentoo 4.4.3 p1.0) COMPILER_PATH=/usr/libexec/gcc/avr/4.4.3/:/usr/libexec/gcc/avr/4.4.3/:/usr/libexec/gcc/avr/:/usr/lib/gcc/avr/4.4.3/:/usr/lib/gcc/avr/ LIBRARY_PATH=/usr/lib/gcc/avr/4.4.3/avr5/:/usr/lib/gcc/avr/4.4.3/../../../../avr/lib/avr5/:/usr/lib/gcc/avr/4.4.3/:/usr/lib/gcc/avr/4.4.3/../../../../avr/lib/ COLLECT_GCC_OPTIONS='-mmcu=atmega168' '-o' 'X' "/usr/libexec/gcc/avr/ld" "-m" "avr5" "-Tdata" "0x800100" "-o" "X" "/usr/lib/gcc/avr/4.4.3/../../../../avr/lib/avr5/crtm168.o" "-L/usr/lib/gcc/avr/4.4.3/avr5" "-L/usr/lib/gcc/avr/4.4.3/../../../../avr/lib/avr5" "-L/usr/lib/gcc/avr/4.4.3" "-L/usr/lib/gcc/avr/4.4.3/../../../../avr/lib" "bootload.o" "-lgcc" "-lc" "-lgcc" Die version ist da zwar ersichtlich aber dennoch: avr-gcc (Gentoo 4.4.3 p1.0) 4.4.3 Copyright (C) 2010 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Die toolchain und gcc habe ich vor knapp 4 monaten mit hilfe von crossdev gebaut, bisher hatte ich aber noch keine probleme damit MFG, Stefan
Datum:
Stefan schrieb: > Die toolchain und gcc habe ich vor knapp 4 monaten mit hilfe von > crossdev gebaut, bisher hatte ich aber noch keine probleme damit Kein Problem. Das Problem ist vielmehr, dass ich Annahmen über den internen Aufbau der Toolchain gemacht habe, die bei Dir nicht zutreffen. Es war mir dabei klar, dass das u.U. Probleme machen könnten, es schien mir aber sehr unwahrscheinlich. Tja, war wohl nix. Gegen Abend werde ich eine neue Version fertig haben, die auch mit Deinem avr-gcc läuft.
Datum:
Angehängte Dateien:Hier nun die modifizierte Version. Die Zielarchitektur wird jetzt so ermittelt, dass auch mit Nicht-Standard-avr-gccs keine Probleme mehr auftauchen sollten. Sonst hat sich nichts geändert; es gibt also keinen Grund, von den Vorversionen zu wechseln. Vor dem Loslegen bitte README lesen und den ersten Teil des Makefile anpassen. Die Anpassungen geschehen hier im Makefile (anders als im Wiki beschrieben, der die avrasm2-Version behandelt).
Datum:
Danke für die Mühe bei mir wird jetzt jedenfalls die Zielarchitektur korrekt erkannt MFG, Stefan
Datum:
Hallo, ich würde gerne den Bootloader für einen ATmega64 verwenden. Leider kommt beim Compilieren des Bootloaders folgender Fehler:
avr-gcc -c -Wa,-adhlns=stub.lst -mmcu=atmega64 -DF_CPU=14745600 -I . -I ./added -I ./converted -I/usr/local/avr/include -ffreestanding -gdwarf-2 -L,-gdwarf-2 -DRAM_START=0x0100 -DSRAM_SIZE=4096 -DSTX_PORT=PORTE -DSTX=PE1 -DSRX_PORT=PORTE -DSRX=PE0 added/ stub.S -o stub.o vars="$(./get_bootsection_addrs.sh 0x7fff 0x7e00 0x7c00 0x7800 )"; \ arch="$(./get_avr_arch.sh -mmcu=atmega64 bootload.o)"; \ echo "arch=$arch";\ echo "$vars"; \ eval "$vars"; \ sed -e "s/@LOADER_START@/$LOADER_START/g" \ -e s"/@ARCH@/$arch/" \ -e s'/@RAM_START@/0x0100/g' \ -e s'/@RAM_SIZE@/4096/g' \ -e "s/@STUB_OFFSET@/$STUB_OFFSET/g" \ bootload.template.x > bootload.x; \ avr-ld -N -E -T bootload.x -Map=bootload.map \ --cref bootload.o stub.o -o bootload.elf --defsym Application=0 *** Note: set BOOTSZ fuses to the word address 0x7e00 *** ./get_avr_arch.sh: awk: command not found ./get_avr_arch.sh: [: =: unary operator expected get_avr_arch.sh: Could not find an architecture in avr-gcc's internal ld command line arch= LOADER_START=0xfc00 STUB_OFFSET=0x3fe c:\WinAVR-20090313\bin\avr-ld.exe:bootload.x:18: syntax error make: *** [bootload.elf] Error 1 Build failed with 2 errors and 0 warnings... |
Ich hoffe jemand kann mir weiter helfen. Ich gehe nach der README vor und benutze AVR Studio 4.18 Vielen Danke Tobias
Datum:
Angehängte Dateien:Tobias S. schrieb: > ./get_avr_arch.sh: awk: command not found Probiere mal die angehängte Datei get_avr_arch.sh. Einfach in das ausgepackte Verzeichnis gehen und die vorhandene überschreiben. Vermutlich ist das ein Problem mit WinAVR: ich nahm an, dass er das Unix-Standard-(POSIX-)Kommando „awk“ kennt. Ich vermute nun, dass er es nur unter dem speziellen Namen „gawk“ kennt.
Datum:
Ich habe auch ein Problem mit der architecture Erkennung. Mit aktueller Version 2.18 sieht der make Output so aus:
vars="$(./get_bootsection_addrs.sh 0x3fff 0x3f00 0x3e00 0x3c00 )"; \
arch="$(./get_avr_arch.sh -mmcu=atmega32 bootload.o)"; \
echo "arch=$arch";\
echo "$vars"; \
eval "$vars"; \
sed -e "s/@LOADER_START@/$LOADER_START/g" \
-e s"/@ARCH@/$arch/" \
-e s'/@RAM_START@/0x0060/g' \
-e s'/@RAM_SIZE@/2048/g' \
-e "s/@STUB_OFFSET@/$STUB_OFFSET/g" \
bootload.template.x > bootload.x; \
avr-ld -N -E -T bootload.x -Map=bootload.map \
--cref bootload.o stub.o -o bootload.elf --defsym Application=0
*** Note: set BOOTSZ fuses to the word address 0x3f00 ***
./get_avr_arch.sh: Zeile 38: [: =: Einstelliger (unärer) Operator erwartet.
get_avr_arch.sh: Could not find an architecture in avr-gcc's internal ld command line
arch=
LOADER_START=0x7e00
STUB_OFFSET=0x1fe
avr-ld:bootload.x:18: syntax error
make: *** [bootload.elf] Fehler 1
|
Hier die Ausgabe der beiden Befehle:
avr-gcc -mmcu=atmega168 -### bootload.o -o X Using built-in specs. COLLECT_GCC=avr-gcc COLLECT_LTO_WRAPPER=/usr/lib/gcc/avr/4.5.1/lto-wrapper Target: avr Configured with: ../configure --disable-libssp --disable-nls --enable-languages=c,c++ --infodir=/usr/share/info --libdir=/usr/lib --libexecdir=/usr/lib --mandir=/usr/share/man --prefix=/usr --target=avr --with-gnu-as --with-gnu-ld --with-as=/usr/bin/avr-as --with-ld=/usr/bin/avr-ld Thread model: single gcc version 4.5.1 20100610 (prerelease) (GCC) COMPILER_PATH=/usr/lib/gcc/avr/4.5.1/:/usr/lib/gcc/avr/4.5.1/:/usr/lib/gcc/avr/:/usr/lib/gcc/avr/4.5.1/:/usr/lib/gcc/avr/ LIBRARY_PATH=/usr/lib/gcc/avr/4.5.1/avr5/:/usr/lib/gcc/avr/4.5.1/../../../../avr/lib/avr5/:/usr/lib/gcc/avr/4.5.1/:/usr/lib/gcc/avr/4.5.1/../../../../avr/lib/ COLLECT_GCC_OPTIONS='-mmcu=atmega168' '-o' 'X' "/usr/lib/gcc/avr/4.5.1/collect2" "-m" "avr5" "-Tdata" "0x800100" "-o" "X" "/usr/lib/gcc/avr/4.5.1/../../../../avr/lib/avr5/crtm168.o" "-L/usr/lib/gcc/avr/4.5.1/avr5" "-L/usr/lib/gcc/avr/4.5.1/../../../../avr/lib/avr5" "-L/usr/lib/gcc/avr/4.5.1" "-L/usr/lib/gcc/avr/4.5.1/../../../../avr/lib" "bootload.o" "-lgcc" "-lc" "-lgcc" |
avr-gcc --version avr-gcc (GCC) 4.5.1 20100610 (prerelease) Copyright (C) 2010 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
Idee, woran es hapert? Gruß, Julian
Datum:
julian schrieb: > Idee, woran es hapert? Es hängt damit zusammen: > avr-gcc (GCC) 4.5.1 20100610 (prerelease) und dass „collect2“ statt „avr-gcc“ zum Compilieren aufgerufen wird (siehe Deine Ausgabe zu „avr-gcc -mmcu=atmega168 -### bootload.o -o X“). Da Dein avr-gcc ein Prerelease ist, kann ich Dir leider nur sagen, dass ich da erst abwarten möchte, ob das so bleibt und Dich bitten, bis dahin mit einem stabilen Release zu übersetzen.
Datum:
Vielen Dank jetzt hat es funktioniert. Danke für deine Mühe. Ich finde es super, was du da auf die Beine gestellt hast. Respekt. Vielen Dank Tobias
Datum:
Angehängte Dateien:Die aktuelle Version, so angepasst, dass es auch wieder mit WinAVR läuft (enthält das geänderte get_avr_arch.sh von ein paar Artikel darüber). Sonst keine Änderungen. Vor dem Loslegen bitte README lesen und den ersten Teil des Makefile editieren. Die Anpassungen geschehen hier im Makefile (anders als im Wiki beschrieben, der die avrasm2-Version behandelt).
Datum:
Inzwischen hat meine Distribution auf avr-gcc-4.5.1 stable aktualisiert. Das Skript funktioniert trotzdem nicht. Hier die Ausgaben:
make
Makefile:120: atmel_def.mak: Datei oder Verzeichnis nicht gefunden
./_conv.awk m32def.inc | gawk '/PAGESIZE|SIGNATURE_|SRAM_|FLASHEND|BOOT/' > atmel_def.h
gawk '{ printf "%s = %s\n", $2, $3 }' atmel_def.h > atmel_def.mak
avr-gcc -c -Wa,-adhlns=bootload.lst -mmcu=atmega32 -DF_CPU=12000000 -I . -I ./added -I ./converted -I/usr/local/avr/include -ffreestanding -gstabs+ -L,-gstabs+ -DRAM_START=0x0060 -DSRAM_SIZE=2048 -DSTX_PORT=PORTD -DSTX=PD1 -DSRX_PORT=PORTD -DSRX=PD0 added/bootload.S -o bootload.o
avr-gcc -c -Wa,-adhlns=stub.lst -mmcu=atmega32 -DF_CPU=12000000 -I . -I ./added -I ./converted -I/usr/local/avr/include -ffreestanding -gstabs+ -L,-gstabs+ -DRAM_START=0x0060 -DSRAM_SIZE=2048 -DSTX_PORT=PORTD -DSTX=PD1 -DSRX_PORT=PORTD -DSRX=PD0 added/stub.S -o stub.o
vars="$(./get_bootsection_addrs.sh 0x3fff 0x3f00 0x3e00 0x3c00 )"; \
arch="$(./get_avr_arch.sh -mmcu=atmega32 bootload.o)"; \
echo "arch=$arch";\
echo "$vars"; \
eval "$vars"; \
sed -e "s/@LOADER_START@/$LOADER_START/g" \
-e s"/@ARCH@/$arch/" \
-e s'/@RAM_START@/0x0060/g' \
-e s'/@RAM_SIZE@/2048/g' \
-e "s/@STUB_OFFSET@/$STUB_OFFSET/g" \
bootload.template.x > bootload.x; \
avr-ld -N -E -T bootload.x -Map=bootload.map \
--cref bootload.o stub.o -o bootload.elf --defsym Application=0
*** Note: set BOOTSZ fuses to the word address 0x3f00 ***
get_avr_arch.sh: Could not find an architecture in avr-gcc's internal ld command line
arch=
LOADER_START=0x7e00
STUB_OFFSET=0x1fe
avr-ld:bootload.x:18: syntax error
make: *** [bootload.elf] Fehler 1
|
avr-gcc -mmcu=atmega32 -### bootload.o -o X Using built-in specs. COLLECT_GCC=avr-gcc COLLECT_LTO_WRAPPER=/usr/lib/gcc/avr/4.5.1/lto-wrapper Target: avr Configured with: ../configure --disable-libssp --disable-nls --enable-languages=c,c++ --infodir=/usr/share/info --libdir=/usr/lib --libexecdir=/usr/lib --mandir=/usr/share/man --prefix=/usr --target=avr --with-gnu-as --with-gnu-ld --with-as=/usr/bin/avr-as --with-ld=/usr/bin/avr-ld Thread model: single gcc version 4.5.1 (GCC) COMPILER_PATH=/usr/lib/gcc/avr/4.5.1/:/usr/lib/gcc/avr/4.5.1/:/usr/lib/gcc/avr/:/usr/lib/gcc/avr/4.5.1/:/usr/lib/gcc/avr/ LIBRARY_PATH=/usr/lib/gcc/avr/4.5.1/avr5/:/usr/lib/gcc/avr/4.5.1/../../../../avr/lib/avr5/:/usr/lib/gcc/avr/4.5.1/:/usr/lib/gcc/avr/4.5.1/../../../../avr/lib/ COLLECT_GCC_OPTIONS='-mmcu=atmega32' '-o' 'X' "/usr/lib/gcc/avr/4.5.1/collect2" "-m" "avr5" "-o" "X" "/usr/lib/gcc/avr/4.5.1/../../../../avr/lib/avr5/crtm32.o" "-L/usr/lib/gcc/avr/4.5.1/avr5" "-L/usr/lib/gcc/avr/4.5.1/../../../../avr/lib/avr5" "-L/usr/lib/gcc/avr/4.5.1" "-L/usr/lib/gcc/avr/4.5.1/../../../../avr/lib" "bootload.o" "-lgcc" "-lc" "-lgcc" |
avr-gcc --version avr-gcc (GCC) 4.5.1 Copyright (C) 2010 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
Datum:
Angehängte Dateien:Der get_avr_arch.sh im Anhang sollte sowohl für bisherige als auch für neue Versionen von avr-gcc gehen. Einfach über den vorhandenen reinkopieren. Probier's mal damit aus und gib bitte Rückmeldung, ob es klappt.
Datum:
Danke, make läuft jetzt problemlos durch!
Datum:
Hallo,
beim Versuch, den Fastboot (build29) für den ATmega8515 zu kompilieren
(das Makefile habe ich wie in der Readme beschrieben angepasst), bekomme
ich leider immer die folgenden Fehlermeldungen:
In file included from ./added/fastload.inc:22,
from ./converted/bootload.asm:57,
from added/bootload.S:47:
./added/fastload.h:109:1: warning: "BOOTSTART" redefined
In file included from added/bootload.S:30:
./atmel_def.h:6:1: warning: this is the location of the previous
definition
./added/fastload.inc: Assembler messages:
./added/fastload.inc:76: Error: illegal relocation size: 1
./added/fastload.inc:77: Error: illegal relocation size: 1
./added/fastload.inc:78: Error: illegal relocation size: 1
make: *** [bootload.o] Error 1
Build failed with 1 errors and 2 warnings...
In der atmel_def.h steht nach dem build folgendes:
#define FLASHEND 0xFFF
#define SMALLBOOTSTART 0b00111110000000 // (0x0F80) smallest boot
block is 128W
#define SECONDBOOTSTART 0b00111100000000 // (0x0F00) 2'nd boot block
size is 256W
#define THIRDBOOTSTART 0b00111000000000 // (0x0E00) third boot block
size is 512W
#define LARGEBOOTSTART 0b00110000000000 // (0x0C00) largest boot block
is 1KW
#define BOOTSTART THIRDBOOTSTART // OBSOLETE!!! kept for compatibility
#define PAGESIZE 32 // number of WORDS in a page
Offenbar stört das Define "BOOTSTART" und es fehlen die Defines
"SIGNATURE_000", "SIGNATURE_001" und "SIGNATURE_002".
Wenn ich testweise die atmel_def.h gegen die ursprüngliche Version aus
dem Fastload-Archiv austausche und mit dem AVR-Studio nur einen Build
ausführe, tritt kein Fehler auf. Bei einem Rebuild werden dann die
atmel_def.mak und die atmel_def.h neu erzeugt und der Fehler tritt
wieder auf.
Kann mir jemand sagen, was bei der Erzeugung schief läuft?
Jens
Datum:
Mit dem Mega8515 hat es vermutlich noch niemand probiert. Die meisten Nutzer hier bevorzugen wohl µCs aus der Nach-Napoleonischen Zeit ... :). Mach mal erst eines: Lösche den vorhandenen atmel_def.h und starte den Make-Vorgang. Der atmel_def.h wird dann neu gebaut. Ich bitte um Rückmeldung, ob dieselben Fehler auftreten. Falls ja (gleiches Fehlerbild), schau mal in dem von Dir im Makefile eingebundenen m8515def.inc nach dem Symbol SIGNATURE_000, konkret nach der Zeile
.equ SIGNATURE_000 = 0x1e |
Taucht die dort auf?
Datum:
Erstmal vielen Dank für Deine schnelle Antwort! Ich muss wohl mal öfter meine Email abrufen ;-) Wenn ich einen Clean Build mache oder die Datei atmel_def.h manuell lösche, wird sie so erzeugt, wie ich sie oben gepostet habe und der Fehler tritt auf. Die m8515def.inc enthält keine Definition des Symbols SIGNATURE_000.
Datum:
Gut. Wenn ich mir den von Dir geschriebenen Auszug aus atmel_def.h genauer anschaue, scheint mir, dass er nicht von einem originalen m8515def.inc von Atmel abgeleitet ist. Falls das der Fall ist, besorge Dir bitte einen originalen. Vom Hersteller gelieferte Include-Files zu nehmen, sie dann zu modifizieren, aber unter gleichem Namen wieder abzulegen, ist (höflich ausgedrückt) extrem böse. Man lädt sich solche Probleme damit ein, und die kommen dann auch mit Freuden. Die hinzugefügten Kommentare und ihr Stil¹ scheinen mir darauf hinzudeuten. Sollte dieser Fall nicht vorliegen, ist die Ursache zwar unklar, aber besorge Dir mal einen m8515def.inc von einem aktuellen AVR Studio. Damit läuft es durch (eben probiert). _______________ ¹ 'Multiple exclamation marks,' he went on, shaking his head, 'are a sure sign of .... usw.
Datum:
Es war zwar eine originale Datei von Atmel, aber eine veraltete. Ich habe den Fehler gemacht, die m8515def.h aus dem Ordner '...AvrAssembler\Appnotes' statt aus dem Ordner '...AvrAssembler2\Appnotes' zu verwenden; dabei handelte es sich um die Version 1.0 vom 16.04.2002. Mit der aktuellen Version 2.35 vom 25.02.2010 funktioniert es jetzt. Vielen Dank nochmal für Deine Unterstützung! Jens
Datum:
Ok. In der nächsten Version wird nochmal im Kommentar betont werden, dass es die Version aus AvrAssembler*2* sein muss. Steht zwar schon da, aber Betonung kann nichts schaden. Vielen Dank für die Rückmeldung.
Datum:
Mal eine kleine Frage: Wenn ich aus meiner uC Anwendung in den Bootloader zurückspringen möchte, kann ich das mittels
asm("jmp 0x0000"):
|
machen?
Datum:
Hm, make hat mir
LOADER_START=0x7e00 |
ausgegeben. Wenn ich aber ein
asm("jmp 0x7e00");
|
ausführe, scheint der bootloader nicht zu starten. Zumindest kann lboot kein device finden. Irgendeine Idee wie ich das prüfen könnte? Eine Bootmeldung oder so gibt der Loader ja nicht aus, oder?
Datum:
Hmm. In dem Moment, in dem Du zum Bootloader springst, läuft da das PC-Programm bereits? Der Bootloader prüft nur sehr kurz, ob sein Gegenstück läuft (ein paar 100 ms), um den normalen Restart nicht nennenswert zu verzögern.
Datum:
Ja, ich habe das Absetzen des Reset-Commands in das Tool eingebaut. Würde der Bootloader einfach durchlaufen müsste anschließend ja meine Hauptanwendung auch wieder erreichbar sein. Ist sie aber nicht.
Datum:
Nur ein Verdacht: Versuch's mal mit „asm volatile("jmp 0x7e00")“.
Datum:
Es gibt noch eine mögliche Falle: Verwendest Du den UART in Deinem Programm und der Bootloader liegt auf denselben Pins? Dann musst Du den UART-Sender disablen (TXEN weg), denn der Bootloader verwendet Soft-UART und kann sonst auf den Pin nicht zugreifen.
Datum:
Ah, der UART war das Problem! Danke! Jetzt funktioniert es wunderbar!
Datum:
Ich hätte da noch mal eine Frage/Anregung: Wäre es möglich das Starten der Anwendung nach 300ms zu unterbinden, wenn ein an den AVR angeschlossener Taster betätigt wird? Sprich so lange PINX low ist unabhängig vom Timeout im Bootloader verweilen. Die 300ms können nämlich etwas kurz sein, wenn der AVR hinter einem USB/seriell Wandler-hängt der beim Reset getrennt werden muss. Sprich man muss innerhalb von 300ms feststellen, dass Device ist jetzt da, und die Verbindung aufbauen... Das kann evtl knapp sein.
Datum:
Hallo Julian, schau mal in diesen Beitrag, da ist die Frage schonmal aufgekommen: Beitrag "Re: UART Bootloader ATtiny13 - ATmega644" Und dann gibt's hier direkt eine Lösung dazu: Beitrag "Re: UART Bootloader ATtiny13 - ATmega644" Das sollte eigentlich genau das sein, was du suchst. Gruß, Jens
Datum:
Perfekt, genau das habe ich gesucht! Danke!
Datum:
Hallo, ich nutze jetzt seit einiger Zeit den fastboot auf dem ATmega8515 und bin begeistert davon. Eben wollte ich ihn für einen AT90S8515 kompilieren und bekomme trotz der entsprechenden Anpassungen im Makefile die folgenden Fehlermeldungen beim Kompilieren: ./converted/abaud.inc: Assembler messages: ./converted/abaud.inc:18: Error: illegal opcode movw for mcu at90s8515 ./converted/abaud.inc:20: Error: illegal opcode movw for mcu at90s8515 ./converted/abaud.inc:21: Error: illegal opcode movw for mcu at90s8515 ./converted/abaud.inc:50: Error: illegal opcode movw for mcu at90s8515 ./converted/password.inc:13: Error: illegal opcode lpm for mcu at90s8515 ./converted/password.inc:13: Error: postincrement not supported ./converted/command.inc:26: Error: illegal opcode movw for mcu at90s8515 ./converted/command.inc:47: Error: illegal opcode movw for mcu at90s8515 ./converted/message.inc:17: Error: illegal opcode lpm for mcu at90s8515 ./converted/message.inc:23: Error: illegal opcode lpm for mcu at90s8515 ./converted/message.inc:23: Error: postincrement not supported ./converted/verify.inc:12: Error: illegal opcode lpm for mcu at90s8515 ./converted/verify.inc:12: Error: postincrement not supported ./converted/progtiny.inc:8: Error: illegal opcode movw for mcu at90s8515 ./converted/progtiny.inc:49: Error: constant value required ./converted/progtiny.inc:50: Error: illegal opcode spm for mcu at90s8515 ./converted/progtiny.inc:62: Error: constant value required ./converted/progtiny.inc:63: Error: illegal opcode spm for mcu at90s8515 ./converted/progtiny.inc:75: Error: constant value required ./converted/progtiny.inc:76: Error: illegal opcode spm for mcu at90s8515 ./converted/uart.inc:17: Error: illegal opcode movw for mcu at90s8515 ./converted/uart.inc:66: Error: illegal opcode lpm for mcu at90s8515 ./converted/uart.inc:92: Error: illegal opcode movw for mcu at90s8515 ./added/fastload.inc:73: Error: illegal relocation size: 1 ./added/fastload.inc:74: Error: illegal relocation size: 1 make: *** [bootload.o] Error 1 Build failed with 1 errors and 0 warnings... Es sieht ja so aus, als wenn ein falscher Befehlssatz für den Prozessor verwendet würde. Habe ich irgendeine Einstellung nicht beachtet, oder muss ich den Assembler Code auf den entsprechenden Prozessor anpassen? Jens
Datum:
Hast Du ihn in dem Verzeichnis übersetzt, in dem Du zuvor eine andere Version erstellt hast? Falls ja: „make -B“ aufrufen oder das komplette Paket in ein neues Verzeichnis auspacken und dort die andere Version erstellen.
Datum:
Ja, zuerst hatte ich den ganzen Ordner mit der ATmega8515-Konfiguration kopiert und angepasst. Danach habe ich dann das Paket "fastboot_build29" komplett neu ausgepackt und dort die entsprechenden Einstellungen vorgenommen, jedoch mit denselben Fehlermeldungen beim Kompilieren. "make -B" bringt auch dieselben Fehlermeldungen.
Datum:
OK. Ich kenne den at90s8515 nicht. Was mich stutzig macht, ist, dass der laut Assembler-Fehlermeldungen die Befehle lpm und spm nicht kennen soll. Vor ich mich tiefer hineinstürze: Liest hier jemand mit, der ihn kennt? Ist das richtig so? Ist dann ein Bootloader überhaupt möglich?
Datum:
Ich habe gerade mal nachgeschaut; der ATmega8515 ist ja der Nachfolger des AT90S8515 mit einigen Verbesserungen und Fehlerbehebungen und es wird auch nur noch der ATmega8515 verkauft. Da ich nur noch einen einzigen AT90S8515 hier liegen habe, wird es das einfachste sein, in Zukunft einfach auf den ATmega zu gehen. Da läuft ja der Bootloader auch wunderbar.
Datum:
Ich denke auch, dass es sich nicht lohnt, da noch Gehirnschmalz zu investieren. Schließen wir das Thema also mit „AT90S8515 geht nicht“ ab.
Datum:
Hallo Hc, ich versuche mit Version 2.9 von Beitrag "Peter Danneggers Bootloader (fastboot) für AVR-GCC-Toolchain" den Bootloader für eien Tiny45 zum Laufen zu bekommen. Der Tiny45 spring nicht in den Bootloader. Beim Vergleich des generiereten bootload.hex mit dem unter Windows generierten fällt auf, dass nicht nur der Hexcode ein anderer ist, sondern auch der Opcode FC am Beginn des Flashs fehlt: :020000020000FC Soweit ich den Bootvorgang des Tinys verstanden habem funktioniert es ohne obigen Opcode nicht.
Datum:
Es fehlt kein Opcode. Das letzte Byte (Dein „Opcode“ FC) ist immer die Prüfsumme des Records, also nie ein Opcode. Sie trägt zum Inhalt nichts bei. Der Rest des Records ist vom Typ 2, setzt somit die Segmentadresse, und zwar auf 0, was Default ist. Als Segment-Record erzeugt es ebenfalls keinen Opcode. Die von Dir vermisste Zeile darf also wegfallen, da sie nichts bewirkt und von avrasm2 nur automatisch generiert wird. Solltest Du noch Zweifel haben, frag' mal Google oder die Wikipedia nach „Intel Hex“.
Datum:
Ich bin's mal wieder... Ich würde die Logik mit der Taste gerne noch etwas erweitern. Wenn die Taste mehr als (etwa) 3s gedrückt wurde, soll der Bootloader auch dann aktiv bleiben wenn die Taste losgelassen wird. Also so lange bis per Befehl die Haupt-Firmware gestartet wird oder das Device resettet wird. Hat da jemand einen Tipp wie man das realisieren könnte? Ich hatte gedacht ein zusätzliches Register zu verwenden, auf 10 zu initialisieren und per dec bis auf 0 herunterzuzählen. Falls das Register 0 ist sollte timeout_btncheck direkt wieder zu abaud springen. Aber die Implementierung ist mir bisher nicht geglückt... Gruß, Julian
Datum:
Hallo zusammen, ich bekomme den one-wire Modus nicht an's Laufen und weiß auch nicht, wo das Problem liegt. Two-wire funktioniert. Hardware: attiny25 8MHz interner RC-Oszillator, brownout 1,8V, 100nF Puffer USB-Seriell-Wandler: pl2303 China Adapter, max232 entfernt, direkter 0V-3,3V Pegel Verschaltung: TX---[ 1kΩ ]---PB4 RX-------------PB4 Software auf dem PC: bootloader-1.1.tar.gz aus http://www.avrfreaks.net/index.php?module=Freaks%2... und lboot.tgz aus Beitrag "Re: UART Bootloader ATtiny13 - ATmega644" Software auf dem µC: fastboot_build29.tar.gz aus Beitrag "Re: Peter Danneggers Bootloader (fastboot) für AVR-GCC-Toolchain" Anstatt zu flashen dreht sich nur der Wartebalken, die PC-Seite kommt dort auch nie weiter. Baudraten habe ich alles von 60 - 230400 ausprobiert. Mit dem Oszi habe ich die Leitungen überprüft, der PC sendet fleißig und es ist auch wenig Jitter drauf. Der AVR zieht die Leitung anscheinend nie nach unten. Mir ist nicht klar, wo der Fehler liegt. Ist die GCC-Implementierung des bootloaders grundsätzlich one-wire fähig? Wenn ja, hat sie schon einmal bei jemanden funktioniert? Ist die linux-software one wire fähig? Ich habe im source code nirgends die echo-Abfrage gefunden. Nur in protocol.h folgendes:
Erkennung 1-Drahtmodus: Es wird geprüft, ob das 1. Zeichen des Paßworts zurück kommt (Echo). Das CONNECT wird gesendet auf der Startflanke des 0xFF. |
Gibt es eine neuere Version oder habe ich veraltete Software erwischt? Im wiki-Artikel habe ich etwas von Version 2.2 gelesen. Der Link ist verstümmelt und ich habe die Version nicht gefunden. Mit dem two-wire Modus funktioniert es einwandfrei, ich bin ganz begeistert. Für Vorschläge wo ich suchen kann bin ich dankbar.
Datum:
Hallo, wenn Du den Max einfach weglässt, und dann direkt verbindest, dürfte der One-Wire Modus nicht gehen, weil die Pegel invertiert sind. Deshalb antwortet der ATTiny nicht. Evtl. müssten die Pegel im bootloader code auch gedreht werden, ich habe das allerdings noch nicht ausprobiert. Die Linux Version des Bootloaders Du probiert hast kann One-Wire Mode, eine neuere Version davon ist Beitrag "Re: UART Bootloader ATtiny13 - ATmega644" . Gruß, Bernhard
Datum:
Angehängte Dateien:Hallo Bernhard, danke für deine Antwort. Ich habe jetzt einen ft232 verwendet der die Pegel schon gedreht hat und auch die neuere Software. Der Fehler ist der gleiche. Kannst du mir sagen, wo ich den Fehler suchen kann? Ich bin komplett ahnungslos. Der Zweidrahtmodus funktioniert übrigens immer noch einwandfrei. Auf dem Oszi sehe ich, dass die Leitung am Anfang konstant high ist und zwischendrin immer wieder kurz auf Masse gezogen wird. Ich habe mal mein lst file angehängt, vielleicht erkennt jemand dadran meinen Fehler.
Datum:
Bernhard M. schrieb: > wenn Du den Max einfach weglässt, und dann direkt verbindest, dürfte der > One-Wire Modus nicht gehen, weil die Pegel invertiert sind. Wenn ich den Abschnitt richtig verstanden hätte, wäre mir viel Arbeit erspart geblieben. Es funktioniert jetzt!
;------------------------------------------------------------------------- ; Macros ;------------------------------------------------------------------------- #if ONEWIRE .macro IOPortInit cbi STX_PORT, SRX ; for non-inverted logic ;sbi STX_PORT, SRX ; weak pullup on cbi STX_DDR, SRX ; as input .endm .macro TXD_0 sbi STX_DDR, SRX ; strong pullup = 0 .endm .macro TXD_1 cbi STX_DDR, SRX ; weak pullup = 1 .endm .macro SKIP_RXD_0 sbic SRX_PIN, SRX ; for non-inverted logic ;sbis SRX_PIN, SRX ; low = 1 .endm .macro SKIP_RXD_1 sbis SRX_PIN, SRX ; for non-inverted logic ;sbic SRX_PIN, SRX ; high = 0 .endm #else |
Das Problem war tatsächlich, dass alle Pegel invertiert waren. Auf dem Weg dorthin habe ich VirtualBox + WinXP auf einem atom notebook installiert, um den windows fboot.exe client testen zu können und ~20 Stunden mich mit assembler code und wild togglenden leds beschäftigt. Danke für den super bootloader und die Hilfe:
./bootloader -d /dev/ttyUSB0 -b 115200 -p solarLamp.hex ================================================= | BOOTLOADER, Target: V2.1 | | (Dec 24 2010 20:47:23) | ================================================= Program device. Port : /dev/ttyUSB0 Baudrate : 115200 File : solarLamp.hex Reading : solarLamp.hex... File read. Size : 1086 Bytes ------------------------------------------------- Waiting for device... connected (one wire)! Bootloader : V2.1 Target : 1E930A ATmega88 Buffer : 960 Byte Size available: 7680 Byte CRC enabled and OK. Programming : 0x00000 - 0x0043D Writing [################################################################################################] 100% Elapsed time : 0.27 seconds, 4019 Bytes/sec. ++++++++++ Device successfully programmed! ++++++++++ ...starting application |
Datum:
Just in case. und natuerlich als lobendes feedback fuer die Autoren. Ich hab mich jetzt auch an den ganz kleinen Attiny's mit dem bootloader versucht, aktuell den Attiny13A. Und, es funktioniert ohne Probleme. Die Eckdaten: uC : Attiny13A @ 9.6MHz intern RC-Osc Fuses for dem desaktivieren des Reset lfuse: 0x7A hfuse: 0xEF fastboot_build29.tar.gz PC Programm fuer den serial upload : bootloader-1.1 OS: Ubuntu 10.04 (nur Packete aus den offiziellen Quellen) gcc version : avr-gcc -v Using built-in specs. Target: avr Configured with: ../src/configure -v --enable-languages=c,c++ --prefix=/usr/lib --infodir=/usr/share/info --mandir=/usr/share/man --bindir=/usr/bin --libexecdir=/usr/lib --libdir=/usr/lib --enable-shared --with-system-zlib --enable-long-long --enable-nls --without-included-gettext --disable-checking --disable-libssp --build=i486-linux-gnu --host=i486-linux-gnu --target=avr Thread model: single gcc version 4.3.4 (GCC) Hier nochmal ein dickes Danke an die Autoren. Ju
Datum:
Ich hab da eine ähnliche Frage: Meine Schaltung hat aus anderen Gründen einen Halbduplex-Eindraht-"Bus", der (wegen der höheren Spannungen) über einen Pegelwandler aus Transistoren angesteuert wird. Sieht für den Controller aus wie "normales" 2-Wire, nur dass alles gesendete gleichzeitig auch wieder zurückkommt (und natürlich nur Halbduplexbetrieb mögich ist). Andere Busteilnehmer sind für den Bootloader nicht relevant, weil dann nicht vorhanden. Nun ergibt sich folgendes Problem, dass der Bootloader (auf 2-Wire Mode konfiguriert) damit nicht zurechtkommt. Testweise mal die Schaltung umgebastelt, so dass der Controller direkt mit dem PC verbunden ist, klappt es natürlich (also prinzipiell nichts defekt). Bekommt der PC ein Echo, der Controller aber nicht, meint das Programm im 1-Wire Modus zu arbeiten, was dann auch problemlos funktioniert. Den PC stört das Echo also nicht, und 1-wire->2-wire verträgt sich in die Richtung. Sobald der Controller aber ein Echo bekommt funktioniert nix mehr, die PC-Software scheitert an der Erkennung, egal was PC-seitig los ist mit der Schnittstelle. Gibts da eine Lösung?
Datum:
Versuch mal, in added/fastload.h an der Stelle
#if SRX == STX && SRX_PORT == STX_PORT #define ONEWIRE 3 #else #define ONEWIRE 0 #endif |
die Zeile
#define ONEWIRE 3 //Force onewire protocol |
drunter zu setzen. Das setzt den Vergleich darüber außer Kraft und erzwingt One-Wire-mode für die Software; Sende- und Empfangspins bleiben dennoch verschieden. Einen Versuch ist es wert, Funktionsgarantie kann ich keine geben.
Datum:
Mittlerweile habe ich einen ziemlich ekelhaften Hack zusammengebaut, der aber zu funktionieren scheint. Elegant sind die fest definierten Pins natürlich nicht. Dazu stellt man in der Makefile irgendwas für RX und TX ein, nur eben das gleiche... Mal so als feature request: Das ganze in "sauber" und zusätzlich aktivierbarer Sende/Empfangsumschaltung auf einem dritten Pin hätte durchaus nennenswertes Anwendungsgebiet, z.b. für Halbduplex RS485... Wenn man die Polarität jedes einzelnen Pins noch "sauber" definieren könnte wäre das dann optimalst.
#if ONEWIRE .macro IOPortInit cbi PORTD, PD0 ; PU disable cbi DDRD, PD0 ; RX as input sbi PORTD, PD1 ; TX high sbi DDRD, PD1 ; TX as output .endm .macro TXD_0 cbi PORTD, PD1 ; TX low = 0 .endm .macro TXD_1 sbi PORTD, PD1 ; TX high = 1 .endm .macro SKIP_RXD_0 sbic PIND, PD0 ; RX high = 1 .endm .macro SKIP_RXD_1 sbis PIND, PD0 ; RX low = 0 .endm #else |
Datum:
Hallo Eins vorab , dies ist mein erster versuch mit winavr und avr studio, erbarmen ;-), bin Anfänger und programmier bis dato in bascom - Also im Makefile habe ich alles bis "End user presets" eingestellt und auch probehalber die Einstellung DEBUG = dwarf-2 eingestellt - die m16def.ic reinkopiert - Hab noch das File (get_avr_arch.sh ) mit dieser : Beitrag "Re: Peter Danneggers Bootloader (fastboot) für AVR-GCC-Toolchain" ersetzt - dann im Avr Studio auf build gedrückt. ?Muß ich noch irgendwo was einstellen, damits richtig kompiliert wird ? get_avr_arch.sh Build started 14.2.2011 at 23:20:48 Makefile:120: atmel_def.mak: No such file or directory ./_conv.awk m16def.inc | gawk '/PAGESIZE|SIGNATURE_|SRAM_|FLASHEND|BOOT/' > atmel_def.h gawk '{ printf "%s = %s\n", $2, $3 }' atmel_def.h > atmel_def.mak avr-gcc -c -Wa,-adhlns=bootload.lst -mmcu=atmega16 -DF_CPU=16000000 -I . -I ./added -I ./converted -I/usr/local/avr/include -ffreestanding -gdwarf-2 -L,-gdwarf-2 -DRAM_START=0x0060 -DSRAM_SIZE=1024 -DSTX_PORT=PORTD -DSTX=PD1 -DSRX_PORT=PORTD -DSRX=PD0 ad ded/bootload.S -o bootload.o avr-gcc -c -Wa,-adhlns=stub.lst -mmcu=atmega16 -DF_CPU=16000000 -I . -I ./added -I ./converted -I/usr/local/avr/include -ffreestanding -gdwarf-2 -L,-gdwarf-2 -DRAM_START=0x0060 -DSRAM_SIZE=1024 -DSTX_PORT=PORTD -DSTX=PD1 -DSRX_PORT=PORTD -DSRX=PD0 added/ stub.S -o stub.o vars="$(./get_bootsection_addrs.sh 0x1fff 0x1f80 0x1f00 0x1e00 )"; \ arch="$(./get_avr_arch.sh -mmcu=atmega16 bootload.o)"; \ echo "arch=$arch";\ echo "$vars"; \ eval "$vars"; \ sed -e "s/@LOADER_START@/$LOADER_START/g" \ -e s"/@ARCH@/$arch/" \ -e s'/@RAM_START@/0x0060/g' \ -e s'/@RAM_SIZE@/1024/g' \ -e "s/@STUB_OFFSET@/$STUB_OFFSET/g" \ bootload.template.x > bootload.x; \ avr-ld -N -E -T bootload.x -Map=bootload.map \ --cref bootload.o stub.o -o bootload.elf --defsym Application=0 *** Note: set BOOTSZ fuses to the word address 0x1f00 *** arch=avr5 LOADER_START=0x3e00 STUB_OFFSET=0x1fe avr-objcopy -O ihex bootload.elf bootload.hex Build failed with 1 errors and 0 warnings...
Datum:
hier noch die generierte atmel_def.h #define SIGNATURE_000 0x1e #define SIGNATURE_001 0x94 #define SIGNATURE_002 0x03 ; ***** BOOT_LOAD ******************** #define BOOTRST 0 // Select Reset Vector #define BOOTSZ0 1 // Select Boot Size #define BOOTSZ1 2 // Select Boot Size #define FLASHEND 0x1fff // Note: Word address #define SRAM_START 0x0060 #define SRAM_SIZE 1024 ; ***** BOOTLOADER DECLARATIONS ****************************************** #define PAGESIZE 64 #define FIRSTBOOTSTART 0x1f80 #define SECONDBOOTSTART 0x1f00 #define THIRDBOOTSTART 0x1e00 #define FOURTHBOOTSTART 0x1c00 #define SMALLBOOTSTART FIRSTBOOTSTART #define LARGEBOOTSTART FOURTHBOOTSTART
Datum:
sorry ganz vergessen ich verwende die version 29 von fastboot Beitrag "Re: Peter Danneggers Bootloader (fastboot) für AVR-GCC-Toolchain"
Datum:
hmm ? ich glaub die Antwort weiter oben ~100 Posts gefunden zu haben, beim ersten mal ist das normal weil sie erst erstellt wird??
Datum:
eine frage hätte ich da noch , kann ich bascom kompilierte hex dateien auf einen Atmega mit FASTBOOT29 Bootloader, uploaden ? wann nicht dann is eh schon wieder ende :-(
Datum:
Hallo klaus, warum denn nicht, wenn der Code noch in den AVR passt ? Du könntest auch eine ASM Datei übersetzen und dann auf einen AVR laden. Ich verwende jetzt nur noch den Bootloader, entweder im 2-wire mode mit FT232RL oder im 1-wire mode mit Adapterkabel auf einen Eigenbau USB-RS232 Wandler. AVR sind atTiny85, atMega32, atMega48, atMega88 und atMega8. Funktioniert wunderbar..
Datum:
Hallo Uwe Danke übrigens für die Antwort ja es hat bei mir jetzt auch geklappt, hab ja erst heut nachmittag mitm einlesen hier angefangen es funktioniert jetzt zwar aber n paar dinge muss ich schon noch klären wie z.B heisst das passwort immer noch peda oder gibts das überhaupt noch hab hald grad mal schnell windows software zum überspielen von meinem programm benutzt und da is alles voreingestellt auch das passwort , also jetzt gleich mal das testen :-) Danke , leider ist mein Grundverständnis in sachen hex, ihex , assembler nicht so gut Ich hoffe aber noch :-) gruß Klaus
Datum:
Also Peda gibts noch Zum Thema software uart derzeit hab ich ja die original ports im makefile eingstellt lassen aber daß is ja meine hardware uart, die benutz ich ja auch anderweitig Aberr daß kommt sich ja nicht ins gehege da ja mein eigenes Programm zur Laufzeit vom Bootloader ... uploaden gar nicht läuft Die SW Uart ist aber schon ne richtige , oder? man kann also 2 xbeliebige Ports als uart verwenden ? das werde ich zwar nicht machen aber würde das funktionieren? das genialste finde ich die 1wire lösung , die werde ich morgen antesten :-) herzlichste grueße an alle die sich an diesem Bootloader beteiligt haben Danke
Datum:
da ich bei mir die sache im auto verbaue hab ich einen Ausstand den es noch reinzuholen hilt Wireless RS232 Habe mich schon bei den Zigbit Sachen eingelesen , scheint mir am sinnvollsten aber noch ist der Groschen nicht gefallen , vielleicht kennt ja jemand noch links ? grüße Ps.: Gute Nacht ... und ab in die Heia
Datum:
oh gott die flasherei ufert etzad aus :-( so gut geht das jetzt , strom aus , ein ... fertig morgen brauch ich warsch. einen neuen atmega ;-)
Datum:
Hello! I'm trying your bootloader but i'm in trouble...
The bootloader does not compile.
I'm using the fastboot_build29.tar.gz file just that
This is the makes's output:
Makefile:120: atmel_def.mak: No such file or directory
./_conv.awk m8def.inc | gawk '/PAGESIZE|SIGNATURE_|SRAM_|FLASHEND|BOOT/'
> atmel_def.h
gawk '{ printf "%s = %s\n", $2, $3 }' atmel_def.h > atmel_def.mak
avr-gcc -c -Wa,-adhlns=bootload.lst -mmcu=atmega8 -DF_CPU=8000000 -I .
-I ./added -I ./converted -I/usr/local/avr/include -ffreestanding
-gstabs+ -L,-gstabs+ -DRAM_START= -DSRAM_SIZE= -DSTX_PORT=PORTD
-DSTX=PD1 -DSRX_PORT=PORTD -DSRX=PD0 added/bootload.S -o bootload.o
In file included from ./added/fastload.inc:22:0,
from ./converted/bootload.asm:57,
from added/bootload.S:47:
./added/fastload.h:109:0: warning: "BOOTSTART" redefined
./atmel_def.h:6:0: note: this is the location of the previous definition
avr-gcc -c -Wa,-adhlns=stub.lst -mmcu=atmega8 -DF_CPU=8000000 -I . -I
./added -I ./converted -I/usr/local/avr/include -ffreestanding -gstabs+
-L,-gstabs+ -DRAM_START= -DSRAM_SIZE= -DSTX_PORT=PORTD -DSTX=PD1
-DSRX_PORT=PORTD -DSRX=PD0 added/stub.S -o stub.o
vars="$(./get_text_addrs.sh 0xFFF)"; \
arch="$(./get_avr_arch.sh -mmcu=atmega8 bootload.o)"; \
echo "arch=$arch";\
echo "$vars"; \
eval "$vars"; \
sed -e "s/@LOADER_START@/$LOADER_START/g" \
-e s"/@ARCH@/$arch/" \
-e s'/@RAM_START@//g' \
-e s'/@RAM_SIZE@//g' \
-e "s/@STUB_OFFSET@/$STUB_OFFSET/g" \
bootload.template.x > bootload.x; \
avr-ld -N -E -T bootload.x -Map=bootload.map \
--cref bootload.o stub.o -o bootload.elf --defsym
Application="$LOADER_START-2"
*** Last available byte address for the user program: 0x1dfd
get_avr_arch.sh: Could not find an architecture in avr-gcc's internal ld
command line
arch=
LOADER_START=0x1e00
STUB_OFFSET=0x1fe
avr-ld:bootload.x:18: syntax error
make: *** [bootload.elf] Error 1
I'll be waiting for your response...
Datum:
Looks like you're using an avr-gcc version which is not (yet) known to the script. Which version of avr-gcc are you using? Please provide the output of
avr-gcc --version |
and (maybe) a few words about where you got it from. Thanks.
Datum:
Hello! I'm using avr-gcc (GCC) 4.5.2 from comunity repo of archlinux... Thanks!
Datum:
Angehängte Dateien:Could you please replace your current get_avr_arch.sh in the bootloader's directory with the one attached to this article, then run 'make -B' and post the results (important is the part from 'arch=' until 'End of test. Exiting now')? It may take some time (depending on what I can see from the result, one day or so) until I come back as I am quite busy right now, however.
Datum:
I think it's running successfully with the atmega324a, with the atmega8 still doesn't compile... here is the output from ATMEGA324A: arch=1: '"/usr/lib/gcc/avr/4.5.2/collect2"' 2: '"-m"' 3: '"avr5"' 4: '"-Tdata"' 5: '"0x800100"' 6: '"-o"' 7: '";#magic1295671ghkl-."' 8: '"crtm324a.o"' 9: '"-L/usr/lib/gcc/avr/4.5.2/avr5"' 10: '"-L/usr/lib/gcc/avr/4.5.2/../../../../avr/lib/avr5"' 11: '"-L/usr/lib/gcc/avr/4.5.2"' 12: '"-L/usr/lib/gcc/avr/4.5.2/../../../../avr/lib"' 13: '"bootload.o"' 14: '"-lgcc"' 15: '"-lc"' 16: '"-lgcc"' End of test. Exiting now. LOADER_START=0x7e00 STUB_OFFSET=0x1fe sed: -e expression #2, char 16: unknown option to `s' avr-objcopy -O ihex bootload.elf bootload.hex And with ATMEGA8: arch=1: '"/usr/lib/gcc/avr/4.5.2/collect2"' 2: '"-m"' 3: '"avr4"' 4: '"-o"' 5: '";#magic1295671ghkl-."' 6: '"/usr/lib/gcc/avr/4.5.2/../../../../avr/lib/avr4/crtm8.o"' 7: '"-L/usr/lib/gcc/avr/4.5.2/avr4"' 8: '"-L/usr/lib/gcc/avr/4.5.2/../../../../avr/lib/avr4"' 9: '"-L/usr/lib/gcc/avr/4.5.2"' 10: '"-L/usr/lib/gcc/avr/4.5.2/../../../../avr/lib"' 11: '"bootload.o"' 12: '"-lgcc"' 13: '"-lc"' 14: '"-lgcc"' End of test. Exiting now. LOADER_START=0x1e00 STUB_OFFSET=0x1fe sed: -e expression #2, char 16: unknown option to `s' bootload.o: In function `Messages': (.text+0x1d9): undefined reference to `SIGNATURE_000' bootload.o: In function `Messages': (.text+0x1da): undefined reference to `SIGNATURE_001' bootload.o: In function `Messages': (.text+0x1db): undefined reference to `SIGNATURE_002' make: *** [bootload.elf] Error 1 Thanks != cisterns...
Datum:
Angehängte Dateien:Things are getting more unclear to me instead of more clear. Could you please do the same again with the attached get_avr_arch.sh?
Datum:
OK. This is with ATMEGA324A 1: '"/usr/lib/gcc/avr/4.5.2/collect2"' '"-m"' 2: '"-m"' '"avr5"' Match found. arch=avr5 LOADER_START=0x7e00 STUB_OFFSET=0x1fe avr-objcopy -O ihex bootload.elf bootload.hex ----- And this with ATMEGA8 1: '"/usr/lib/gcc/avr/4.5.2/collect2"' '"-m"' 2: '"-m"' '"avr4"' Match found. arch=avr4 LOADER_START=0x1e00 STUB_OFFSET=0x1fe avr-ld:bootload.x:22: syntax error make: *** [bootload.elf] Error 1 -----
Datum:
OK. Please try the get_avr_addr.sh from this link: [[Beitrag "Re: Peter Danneggers Bootloader (fastboot) für AVR-GCC-Toolchain"]] If you still get an error in bootload.x, please attach it to your next posting.
Datum:
Still doesn't compile with atmega8... --- arch=avr4 LOADER_START=0x1e00 STUB_OFFSET=0x1fe avr-ld:bootload.x:22: syntax error make: *** [bootload.elf] Error 1 --- here is the bootload.x: /* bootload.template.x and bootload.x Time-stamp: <2010-01-14 21:22:26 hcz> Linker script for Peter Dannegger's bootloader. Always make sure you edit bootload.template.x. Any changes made to bootload.x will be overwritten during the next make. Symbols enclosed in @ will be replaced when bootload.x is generated (see sed part in Makefile). */ OUTPUT_FORMAT("elf32-avr","elf32-avr","elf32-avr") OUTPUT_ARCH(avr4) MEMORY { text (rx) : ORIGIN = 0x1e00, LENGTH = 0x1fe + 2 bss (rw!x) : ORIGIN = 0x8000000 + , LENGTH = } /* PHDRS { stub PT_LOAD ; } */ SECTIONS { .bss : { *(.bss) } > bss . = 0x1e00 ; .text : { bootload.o(.text) /* place a jump to api_call at the very end: */ . = 0x1fe ; stub.o(.text) } /* Stabs and DWARF debugging sections, taken from 'avr-ld --verbose' */ .stab 0 : { *(.stab) } .stabstr 0 : { *(.stabstr) } .stab.excl 0 : { *(.stab.excl) } .stab.exclstr 0 : { *(.stab.exclstr) } .stab.index 0 : { *(.stab.index) } .stab.indexstr 0 : { *(.stab.indexstr) } .comment 0 : { *(.comment) } /* DWARF debug sections. Symbols in the DWARF debugging sections are relative to the beginning of the section so we begin them at 0. */ /* DWARF 1 */ .debug 0 : { *(.debug) } .line 0 : { *(.line) } /* GNU DWARF 1 extensions */ .debug_srcinfo 0 : { *(.debug_srcinfo) } .debug_sfnames 0 : { *(.debug_sfnames) } /* DWARF 1.1 and DWARF 2 */ .debug_aranges 0 : { *(.debug_aranges) } .debug_pubnames 0 : { *(.debug_pubnames) } /* DWARF 2 */ .debug_info 0 : { *(.debug_info) *(.gnu.linkonce.wi.*) } .debug_abbrev 0 : { *(.debug_abbrev) } .debug_line 0 : { *(.debug_line) } .debug_frame 0 : { *(.debug_frame) } .debug_str 0 : { *(.debug_str) } .debug_loc 0 : { *(.debug_loc) } .debug_macinfo 0 : { *(.debug_macinfo) } } thanks
Datum:
There is a second problem, which is not related to get_avr_arch.sh. Let's continue tomorrow, around evening.
Datum:
Hi Juan, i'm using gentoo with crossdev and gcc-4.5.2. Everything still works fine here. I suspect there is something wrong with your installation. The output of avr-gcc --version:
avr-gcc (Gentoo 4.5.2 p1.1, pie-0.4.5) 4.5.2 |
And here is the output when i compile the projekt with make:
Makefile:125: atmel_def.mak: No such file or directory
./_conv.awk m8def.inc | gawk '/PAGESIZE|SIGNATURE_|SRAM_|FLASHEND|BOOT/' > atmel_def.h
gawk '{ printf "%s = %s\n", $2, $3 }' atmel_def.h > atmel_def.mak
avr-gcc -c -Wa,-adhlns=bootload.lst -mmcu=atmega8 -DF_CPU=8000000 -I . -I ./added -I ./converted -I/usr/local/avr/include -ffreestanding -gstabs+ -L,-gstabs+ -DRAM_START=0x0060 -DSRAM_SIZE=1024 -DSTX_PORT=PORTB -DSTX=PB2 -DSRX_PORT=PORTB -DSRX=PB2 added/bootload.S -o bootload.o
avr-gcc -c -Wa,-adhlns=stub.lst -mmcu=atmega8 -DF_CPU=8000000 -I . -I ./added -I ./converted -I/usr/local/avr/include -ffreestanding -gstabs+ -L,-gstabs+ -DRAM_START=0x0060 -DSRAM_SIZE=1024 -DSTX_PORT=PORTB -DSTX=PB2 -DSRX_PORT=PORTB -DSRX=PB2 added/stub.S -o stub.o
vars="$(./get_bootsection_addrs.sh 0x0fff 0xf80 0xf00 0xe00 )"; \
arch="$(./get_avr_arch.sh -mmcu=atmega8 bootload.o)"; \
echo "arch=$arch";\
echo "$vars"; \
eval "$vars"; \
sed -e "s/@LOADER_START@/$LOADER_START/g" \
-e s"/@ARCH@/$arch/" \
-e s'/@RAM_START@/0x0060/g' \
-e s'/@RAM_SIZE@/1024/g' \
-e "s/@STUB_OFFSET@/$STUB_OFFSET/g" \
bootload.template.x > bootload.x; \
avr-ld -N -E -T bootload.x -Map=bootload.map \
--cref bootload.o stub.o -o bootload.elf --defsym Application=0
*** Note: set BOOTSZ fuses to the word address 0xf00 ***
arch=avr4
LOADER_START=0x1e00
STUB_OFFSET=0x1fe
avr-objcopy -O ihex bootload.elf bootload.hex
|
Just open the makefile and execute the commands by hand. Try to get to the part where it fails. Then fix it and / or report. Good luck :)
Datum:
Suspect files are the defs file from Atmel (m8def.inc) and
atmel-defs.{h,mak}, if you want to investigate for yourself further.
More tomorrow.
Datum:
Angehängte Dateien:Here is the m8def.inc i'd use... The atmel_def.mak says FLASHEND = 0xFFF SMALLBOOTSTART = 0b00111110000000 SECONDBOOTSTART = 0b00111100000000 THIRDBOOTSTART = 0b00111000000000 LARGEBOOTSTART = 0b00110000000000 BOOTSTART = THIRDBOOTSTART PAGESIZE = 32 I suspect that something is missing in the .def file but I do not know what...
Datum:
From the Makefile:
# Name of the Atmel defs file for the actual MCU. [...] # Be sure to use AVR Tools\AvrAssembler2\, not AVR Tools\AvrAssembler\. |
Your m8def.inc is the one from AVR Tools\AvrAssembler\.
Datum:
Thanks! With Atmega8 now arch=avr4 LOADER_START=0x1e00 STUB_OFFSET=0x1fe avr-objcopy -O ihex bootload.elf bootload.hex and Atmega324A: arch=avr5 LOADER_START=0x7e00 STUB_OFFSET=0x1fe avr-objcopy -O ihex bootload.elf bootload.hex It's a great bootloader!
Datum:
Hat schonmal jemand den Bootloader unter AVR Studio 5 compilieren können? Ich hab gesehen, dass der mega128 unterstützt wird. wird es auch eine version für den mega1284 geben?
Datum:
Hat das Ganze eigentlich schon jemand auf dem Mega48 hinbekommen? Bei mir will das jedenfalls nicht. mega88 geht, kein Problem. Beim m48 allerdings: stub.o: In function `stub': (.text+0x0): undefined reference to `api_call' make: *** [bootload.elf] Error 1 Kommentiere ich das entsprechende in der stub.S aus, läuft das durch ohne Fehler, der Bootloader auch, nur startet das Userprogramm natürlich nie.
Datum:
Kein Problem, wenn die passenden ASM Datei für den atmega48.inc da ist und vorher "make clean" aufgerufen wird. Die Anpassungen in der Datei makefile setzte ich vorraus !
Datum:
Uwe S. schrieb: > und > vorher "make clean" aufgerufen wird. Argh, danke! Da denkt man als IDE-verwöhnter User natürlich nicht dran, dass man das ggf. tun sollte...
Datum:
Ich habe diese Version von get_avr_arch.sh http://www.mikrocontroller.net/attachment/103485/g... und für mein Atmega16 diese Datei http://www.mikrocontroller.net/attachment/29668/m16def.inc in das Verzeichnis des bootloaders runtergeladen. Das kompilieren funktioniert nicht und die Ausgabe ist die selbe (außer -mmcu=atmega16) wie avion23 hier gepostet hat: Beitrag "Re: Peter Danneggers Bootloader (fastboot) für AVR-GCC-Toolchain" Ich weiß nicht weiter, kann mir jemand helfen, das avr_arch script versteh ich nicht. Ich benutze archlinux und avr-ld Version 2.21.1 und gcc version 4.6.1 oder hat mir jemand ein fertiges hexfile für den atmega16?
Datum:
Hi, ich würde gerne diesen Bootloader einsetzten, hab hier auch schon einiges gelesen, hab aber mittlerweile die Übersicht verloren. zuviel verschiedene Versionen, platformen, whatever ... Welches ist die aktuelle (stabile) Version) und wo ist sie? Mein Ziel im moment, den Bootloader in ein Mega16, dann mega8x, später auch tiny, .. aber erst mal der 16. Ich nutze XP habe AVRstudio, mit dem ich den bootloader dann auch gerne erzeugen können möchte. Für C das DEV-C Als Programm auf PC seite, ist ein DOS program das in der XP dosbox läuft ok. Anschluß läuft über USB/V24 kabel dann max auf µ seite.(später möchte ich auch die 1 wire ohne max probieren) der Downloadlink von (http://www.mikrocontroller.net/articles/AVR_Bootlo...) Version 2.1 des Bootloaders incl. DOS Host-Software (Forumsbeitrag): führt zu irgendwinem log, aber nicht zum dowbload von etwas brauchbarem. Version 2.1 des Bootloaders für AVR-GCC-Toolchain (Forumsbeitrag): führt zu fastboot_build29.tar.gz hat das irgendwas mit V2.1 zu tun klingt irgendwie nach linux ne version 0.0.29 ... also nichts was man braucht. (Leute vergebt doch mal brauchbare Namen) die letzte version die ich gefunden hab ist fboot18.zip Wenigstens in dem Artikel sollte doch unter downloads der erste Eintrag zu dem richtigen aktuellen Download führen.
Datum:
Angehängte Dateien:Hallo Adi, ich hänge Dir meine Quelle aus diesem Thread an und empfehle diese direkt zu übersetzen, da das Makefile einige Konfigurationsparameter enthält, die man für seinen Ziel µP. anpassen MUSS. Weitere Makefiles sind dort enthalten, die schon Anpassungen an meine Hardware enthalten. Viel Erfolg und bitte lese den Thread..
Datum:
Hallo Zusammen, ich versuche gerade auch den Bootloader ans laufen zu bekommen. Leider bekommt die fboot.exe keine Verbindung zustande. Deswegen hier zuerst mein Aufbau und dann Fragen: ATMega88 mit internen 8Mhz an FTDI Wandler (USART - USB); BS WinXP SP3. Ich habe den Code aus dem letzten Beutrag hier verwendet und die fboot.exe aus Version 1.7 (habe ich sonst nirgens gefunden). Nun stellt sich folgende Frage: Ich habe den Bootsector size mal mit 512 und mit 1024 Wörtern probiert, funktioniert aber nicht (natürlich den entsp. Vector aktiviert). Ich hatte dann noch beim start des fboot eine Fehlermeldung von Windows, dass ein virtueller Treiber nicht initialisiert werden konnte. Habe das versucht zu ignorieren (RNBOVDD.dll) und entsprechend gibt es keine Kommunikation. Hat jemand einen Tipp für mich? Vielen Dank! Gruß, Marten83
Datum:
hallo, hast du dir das makefile für den mega88 angepasst? wie sehen deine fusebits aus? welche ausgaben liefert der Make-Durchlauf? - Fehlermeldungen.
Datum:
Hi, sorry, dass ich so spät wieder antworte. Die Makefile habe ich nur auf 8Mhz editiert und ein "-" vor das "include atmel_def.mak", da er ansonsten gemeckert hat. Die Fusebits: low 0xE2; high 0xdf; extended 0xfe; lock 0x3f. Ausserdem habe ich das den FTDI auf Com2 geändert. Gibt es vielleicht probleme, weil ich bei 8Mhz und 115.2k einen Error von 8,5% habe? MfG, Marten83
Datum:
Hi, so, habe den Fehler gefunden. Eine Leiterbahn auf meiner Platine (natürlich für den USART, wie könnte es anders sein) hatte einen Haarriss. Deswegen ist keine Verbindung zustande gekommen. Aber nochmals zur Sicherheit: Die "section size" habe ich nun auf 256 Wörter gesetzt. Beim kompilieren kommt aber ein Hinweis: *** Note: set BOOTSZ fuses to the word address 0xf00 ***. Das wären in diesem Fall 1024 Wörter. Mit 256 hats geklappt, deswegen gehe ich davon aus, dass das richtig war? MfG, Marten83
Beitrag #2404825 wurde vom Autor gelöscht.
Datum:
Hallo zusammen, ich habe heute leider erfolglos versucht den bootloader in Betrieb zu nehmen. AVR Studio 4 gibt folgende Fehlermeldung aus: Build started 11.12.2011 at 20:12:46 Makefile:120: atmel_def.mak: No such file or directory ./_conv.awk m32def.inc | gawk '/PAGESIZE|SIGNATURE_|SRAM_|FLASHEND|BOOT/' > atmel_def.h Der Befehl "." ist entweder falsch geschrieben oder konnte nicht gefunden werden. make: *** [atmel_def.h] Fehler 255 Build failed with 1 errors and 0 warnings... Ich verstehe nicht, warum der Befehl "." nicht ausgeführt wird. Kann mir jemand bitte helfen? Danke :-) Micky
Datum:
Hallo, Du mußt mit das Programm 'make' und das Makefile direkt verwenden !
Datum:
Wenn ich in der DOS-Konsole make eingebe, erhalte ich den gleichen Fehler. ich verwende: GNU Make 3.81
Datum:
Micky schrieb: > Der Befehl "." ist entweder falsch geschrieben oder > konnte nicht gefunden werden. Das ist eine Fehlermeldung von cmd.exe. Es wird also die falsche Shell aufgerufen/ausgeführt.
Datum:
Stefan Ernst schrieb: > Micky schrieb: >> Der Befehl "." ist entweder falsch geschrieben oder >> konnte nicht gefunden werden. > > Das ist eine Fehlermeldung von cmd.exe. Es wird also die falsche Shell > aufgerufen/ausgeführt. "." ist der aktuelle Ordner in dem man sich befindet. Würde sagen, da fehlt der Befehl/Programm in dem Ordner, der direkt nach dem Punk mit Ordnertrennzeichen angegeben werden muss.
Datum:
Nils S. schrieb: > "." ist der aktuelle Ordner in dem man sich befindet. Würde sagen, da > fehlt der Befehl/Programm in dem Ordner, der direkt nach dem Punk mit > Ordnertrennzeichen angegeben werden muss. Nee, für cmd.exe ist der Schrägstrich danach kein Pfad-Trenner, also sieht es den Punkt alleine als auszuführendes Kommando. Die Kommandozeile muss mit einer Unix-artigen Shell ausgeführt werden.
Datum:
Verstehe. Die Datei _conv.awk ist aber da. Könnte es aber auch an den Übergabeparametern liegen? Wenn einer Falsch oder garnicht definiert ist? Ich muß für heute leider schluß machen. Ich melde mich morgen wieder :-). Danke für die bisherige Hilfe!
Datum:
Hallo Stefan, bezgl. deiner Unix-Shell. In der Anleitung zu dem Bootloader wird dies nicht erwähnt. Eigentlich soll make damit zurechtkommen oder?
Datum:
Micky schrieb: > Eigentlich soll make damit zurechtkommen oder? Make führt die Kommandos aber nicht selber aus. Es übergibt einfach die komplette Kommandozeile an eine Shell, und in deinem Fall an die falsche. Warum kann ich dir so aus dem Stegreif nicht sagen.
Datum:
Wenns wirklich an der fehlenden Shell liegt, wäre cygwin wahrscheinlich eine Lösung. Du kannst aber auch den Ordner Zippen, hier im Forum als Anhang hochladen und einer der Linux-User wird für dich schnell make tippen. Ich hätte avr-gcc 4.3.4.
Datum:
Nils S. schrieb: > Wenns wirklich an der fehlenden Shell liegt, wäre cygwin wahrscheinlich > eine Lösung. Dass sie fehlt ist gar nicht mal gesagt. Sie wird nur einfach nicht benutzt. Vielleicht ist z.B. eine Umgebungsvariable SHELL auf cmd.exe gesetzt, oder ähnliches. Ich kann so aus dem Stegreif nicht sagen, nach welchen Kriterien Make genau ermittelt, welche Shell aufzurufen ist und in das Makefile selber kann ich im Augenblick auch nicht rein schauen.
Datum:
Hier die Make-Doku zu dem Thema: http://www.gnu.org/s/hello/manual/make/Choosing-th... Geh das doch bitte mal selber durch. Insbesondere natürlich den Teil unter > Choosing a Shell in DOS and Windows
Datum:
Angehängte Dateien:Hallo Stefan, anbei der gezippte Ordner. Danke für den Hinweis bezgl. Cygwin. Dies schaue ich mir morgen an. Heute geht es bei mir leider nicht mehr.
Datum:
>Hier die Make-Doku zu dem Thema: >http://www.gnu.org/s/hello/manual/make/Choosing-th... >Geh das doch bitte mal selber durch. >Insbesondere natürlich den Teil unter Danke für den Link! Ich schaue ihn mir morgen an!
Datum:
Stefan Ernst schrieb: > Hier die Make-Doku zu dem Thema: > http://www.gnu.org/s/hello/manual/make/Choosing-th... > Geh das doch bitte mal selber durch. > Insbesondere natürlich den Teil unter >> Choosing a Shell in DOS and Windows Danke Stefan! Daran lag es.