Forum: Mikrocontroller und Digitale Elektronik CAN_Bootloader Programm startet nicht


von g0nz00 (Gast)


Lesenswert?

Hallo,

ich habe den CAN-Bootloader von Fabian Greif auf einen ATMega328p 
geflasht.
An dem Mega 328p ist ein MCP2515 CAN Controller angeschlossen.

Der Mega328p befindet sich irgendwie immer im Bootloader-modus wenn der 
CAN-Bootloader per SPI geflasht wurde.

Wenn ich nun das Hex-File per CAN-Bus mit dem Python-Script übertrage 
dann funktioniert das auch alles wunderbar.
Aber anschließend blinkt die "BOOT LED" wieder in einem 0,5s takt und 
ich kann immer wieder neu das Programmfile x.hex per Canbus übertragen, 
ohne einen Reset einzuleiten. Als ob der µC immer im Bootloader modus 
bleibt.

Kann mir jemand tips geben wo ich anfangen soll den Feghler zu suchen?

Gruß

Dennis

von g0nz00 (Gast)


Lesenswert?

Wenn ich alles Richtig verstanden habe dann liegt der Bootloader in 
einem speziellen Bereich des Speichers dessen Startadresse abhängig von 
der Größe und der gesetzten flags ist. in diesem Beispiel: 512 Words 
Startadresse des Bootloaders: 0x3E00

Die Flags sind eingestellt auf: L:FF H:DC E:FD

Der Bootloader scheint auch zu arbeiten denn er antwortet auf die 
gesendeten Packete.

Woran kann es liegen das das programm nicht gestartet wird? wenn ich den 
µC Resette startet er auch kein Anwendungsprogramm.

Gruß

Dennis

von Georg G. (df2au)


Lesenswert?

g0nz00 schrieb:
> Woran kann es liegen das das programm nicht gestartet wird?
Die Umschaltung von Boot-Modus auf Normal in Zeile 42 ist fehlerhaft.

> wenn ich den µC Resette startet er auch kein Anwendungsprogramm.
Das soll er auch nicht. Nach Reset soll er brav den Bootloader starten. 
Denn das ist der Sinn des Bootloaders.

von g0nz00 (Gast)


Lesenswert?

Laut Beschreibung von 
http://www.kreatives-chaos.com/artikel/can-bootloader , wartet der 
Bootloader 500ms auf die CAN-Message die eine Datenübertragung einleitet 
ansonsten startet er das Anwendungsprogramm mit einen Sprung auf Adresse 
Null.

Ich habe im Makefile nur die Startadresse des Bootloaders angepasst da 
diese nicht über ein stimmte mit dem Datenblatt.

MCU = atmega328p

F_CPU = 16000000

BOOTLOADER_BOARD_ID = 0x01

else ifeq ($(MCU), atmega328p)
BOOTSTART = 0x7C00 << hier die Änderung auf 0x3E00

http://www.atmel.com/Images/Atmel-42735-8-bit-AVR-Microcontroller-ATmega328-328P_Datasheet.pdf 
Seite: 343

Beim Ausführen von Make all hatte ich einen Fehler mit -msshort-calls 
daher habe ich diesen auskommentiert.

#CFLAGS += -mshort-calls

Es mussten nur noch in der default.h die Bit Timings geändert werden da 
der MCP an einem 8MHz Quarz läuft.

// CAN Bitrate 125 kbps
#define R_CNF1  (1<<BRP2)|(1<<BRP1)|(1<<BRP0)  <<< hier BRP2 entfernt
#define R_CNF2  (1<<BTLMODE)|(1<<PHSEG11)
#define R_CNF3  (1<<PHSEG21)


anschließend hat alles geklappt mit dem Bootloader und der Übertragung.

Nur das Starten des Anwenderprogramms scheitert.

von Georg G. (df2au)


Lesenswert?

g0nz00 schrieb:
> Ich habe im Makefile nur die Startadresse des Bootloaders angepasst da
> diese nicht über ein stimmte mit dem Datenblatt.

Fehler Nummer 1. Im Flash wird manchmal Wortweise gezählt, manchmal 
Byteweise.


> Beim Ausführen von Make all hatte ich einen Fehler mit -msshort-calls
> daher habe ich diesen auskommentiert.
Fehler Nummer 2. Dadurch sind die Fehler verschwunden? Ein Kind hält 
sich die Hand vor die Augen und sagt "du kannst mich nicht sehen".


> anschließend hat alles geklappt mit dem Bootloader und der Übertragung.
Woraus schliesst du das? Hast du nach der Übertragung das Flash 
ausgelesen und auf korrekten Inhalt geprüft?

von g0nz00 (Gast)


Lesenswert?

Zu Nummer 1:
Boot Reset Address (Start Boot Loader Section) = 0x3E00 steht so im 
datenblatt und ja es wird Wordweise gezählt aber es geht doch um die 
Startadresse.

Zu Nummer 2:
Irgendwo wurde dazu geraten das man ohne diese option compilieren soll.
Quelle habe ich nicht zur hand.


Zu Nummer 3:
Das pytonscript initialisiert den Bootloader und fängt nach der 
initialisierung an das programm zu übertragen und fragt immer wieder 
nach ob alles angekommen ist. Das funktioniert ..... ob alles an seinem 
platz steht habe ich nicht getestet.

womit kann ich den Flash komplett auslesen?

von Georg G. (df2au)


Lesenswert?

g0nz00 schrieb:
> womit kann ich den Flash komplett auslesen?

Mit jedem gängigen ISP Programmierer. Wie hast du denn deinen Bootlader 
in den Chip geladen?

von g0nz00 (Gast)


Lesenswert?

Alles klar werde das zu hause mal probieren mit dem auslesen.

Mit der Adressierung des Bootloaders hast du wohl recht .... Es wird die 
Adresse des Bytes im Makefile angegeben und nicht des Wortes.

Habe mal zum vergleich ins datenblatt vom Mega32 geguckt und auch da 
wird die Startadresse mit 0x3C00 angegeben. und Endadresse (0x3FFF) - 
Startadresse (0x3C00) sind dann 0x1FF und das dezimal sind dann 511 
Worte.

und im Makefile wird die Start adresse dann wohl in Byte angegeben.

Also ist mein "Bootloader" ein Programm im Programmbereich des 
Speichers. und die Byteadressen 0x0000 bis zur 0x3BFF werden 
übersprungen weil sie leer sind und der "Bootloader" dann ab 0x3C00 
ausgeführt und weil er mit seinen 1040Byte (0x3C00 bis 0x2008 ) in den 
Programmspeicher passt auch ausgeführt.

von g0nz00 (Gast)


Lesenswert?

So jetzt hat alles geklappt.

von Rudolph R. (rudolph)


Lesenswert?

g0nz00 schrieb:
> und die Byteadressen 0x0000 bis zur 0x3BFF werden übersprungen
> weil sie leer sind und der "Bootloader" dann ab 0x3C00 ausgeführt

Das passiert nur, wenn die Bootloader-Fuses nicht richtig gesetzt sind.
Der Bootloader wird schon direkt angesprungen.
Sonst könnte man den ja auch nur einmal benutzen...

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.