Forum: Mikrocontroller und Digitale Elektronik STK500v2 Bootloader auf AT90CAN32


von Niko (Gast)


Lesenswert?

Hallo,

ich versuche gerade seit Stunden Peter Fleury's stk500v2 Bootloader auf 
meinen AT90CAN32 zu bringen.

Ich habe den Bootloader dem Chip entsprechend abgeändert (s.u) und kann 
ihn auch in die Bootloader-section vom Chip flashen (mit einem 
usbasp-programmer).
Wenn ich jedoch über den STK500-Bootloader eine hex-Datei übertrage, 
meckert avrdude:
1
verification error, first mismatch at byte 0x0000
2
0x0c != 0x8f

Wenn ich danach den Inhalt des Chips mit dem usbasp-Programmer auslese, 
enthält die hex-datei nur den Bootloader (ca. 1200 bytes).
Es scheint also so als würde der Bootloader überhaupt nichts schreiben.

Ich habe das Programm folgendermaßen angepasst:
Makefile:
1
MCU = at90can32
2
F_CPU = 16000000
3
BOOTLOADER_ADDRESS = 7C00

main.c
1
#define REMOVE_BOOTLOADER_LED
2
#define ENABLE_LEAVE_BOOTLADER
3
#define USE_USART1
4
#define BAUDRATE 115200
5
#define UART_BAUDRATE_DOUBLE_SPEED 1
6
#define BOOTSIZE 512
Außerdem habe ich noch die Signatur des Chips eingefügt und das erste 
if, in dem normalerweise der PROG_PIN abgefragt wird, "überbrückt" (also 
if(1) { ... } ).

Wenn ich das so kompiliere, kommt der Fehler:
1
illegal opcode elpm for mcu at90can32

Um diesen Fehler zu umgehen füge ich noch nach den includes
1
#undef RAMPZ
ein, damit pgm_read_word_near statt pgm_read_word_far verwendet wird.

Danach mache ich folgendes:
1) Bootloader kompilieren
2) Chip löschen (per usbasp)
3) Bootloader flashen (per usbasp)
4) Lockbits auf 0x0F setzen (per usbasp)
5) Testprogramm flashen (per stk500v2boot) -> verification error
6) Chip lesen (per usbasp) -> Leer, bis auf den Bootloader

Meine Fuses sind folgendermaßen eingestellt:
Keine Brown-Out detection
JTAG enabled
SPI enabled
Boot Flash size = 512 words
Boot Reset vector enabled
Ext. Crystal 8-16MHz 1K CK + 65ms (16MHz sind bestückt)

Ich bin für alle Vorschläge dankbar :-)

Bei Bedarf kann ich auch Sources und Makefiles posten.
von Niko D. (niko)


Lesenswert?

Ich habe jetzt mal das Tutorial 
AVR Bootloader in C - eine einfache Anleitung durchgearbeitet und da 
hat alles funktioniert (UART, Flash-pages beschreiben).

Anscheinend lag mein Problem an den Linker-Flags:

Im Original Sourcecode von Peter Fleury ist der section-start 
folgendermaßen angegeben:
1
--section-start=.text=$(BOOTLOADER_ADDRESS)

ich hatte das auf
1
--section-start=.bootloader=$(BOOTLOADER_ADDRESS)
abgeändert, da es sonst beim flashen auf einen AT90CAN128 einen 
out-of-range error erzeugte.

Jetzt habe ich es (wie im tutorial) auf
1
-Ttext=$(BOOTLOADER_ADDRESS)
abgeändert und siehe da - es funktioniert.

Testweise hab ich es wieder auf
1
--section-start=.text=$(BOOTLOADER_ADDRESS)
zurückgeändert und jetzt gehts auch damit (jedenfalls am AT90CAN32).

das
1
#undef RAMPZ
hab ich auch wieder entfernt und dafür einfach im code die drei
1
#if defined(RAMPZ)
entfernt (und jeweils die else-cases aufgehoben).

Ich glaube das Grundproblem war, dass Peter Fleury auf MCUs mit einem 
Flash >64kb überprüft indem er checkt ob RAMPZ definiert ist.
Bei einem AT90CAN32/64 existiert das Register RAMPZ zwar, wird aber 
nicht verwendet, da <=64kb verbaut sind (Siehe Datasheet S13).

Lange Rede - kurzer Sinn:
Es wäre sinnvoll
1
#if defined(RAMPZ)
durch
1
#if FLASHEND>0xFFFF
zu ersetzen, dann funktionierts auch mit AT90CAN32/64.

Liebe Grüße

Niko
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.