Forum: Mikrocontroller und Digitale Elektronik Flashen über CAN möglich?


von crazy horse (Gast)


Lesenswert?

Vorab - ich habe noch nie mit Bootlader gearbeitet. Es geht um Mega8 und 
Mega16/32, ein Gerät wird auch einen Mega128 erhalten. Dazu jeweils 
einen MCP2515, es werden verschiedene Geräte am Bus hängen. Bin gerade 
am CAN-Bus planen und überlege, ob ich eine Software-Updatemöglichkeit 
überhaupt einplanen soll. Schön wäre es, wenn es ginge...
Also kurze Frage: ist es überhaupt möglich? Ich müsste also auf eine 
bestimmte Botschaft hin dass normale Programm verlassen können, in den 
Bootladersektor springen, dort CAN-Nachrichten empfangen, in welchem 
Format auch immer das dann übertragen wird, und dieses in den "normalen" 
Flash schreiben.
Also keine Einzelheiten, nur ob es prinzipiell möglich ist.

von Martin Thomas (Gast)


Lesenswert?

Ja

von Stefan K. (_sk_)


Lesenswert?

Hallo crazy horse,

klar geht das, und je mehr Microcontroller im System sind, desto 
sinnvoller wird es auch.

Hast Du ein Schnittstellenmodul, um auf den CAN vom PC aus zuzugreifen? 
Welches? Ggf. an dessen Protokoll anlehnen.

Ich baue mir auch gerade einen Bootloader - für meinen Hausbus. Ich 
benutze den MCP2515 und Mega16 bzw. Mega32. Wenn Du willst, können wir 
uns gerne mal zusammenmailen.

Viele Grüße, Stefan

von crazy horse (Gast)


Lesenswert?

na, das klingt ja schon mal beruhigend.
Es wird ungefähr 8 verschiedene Gerätearten im System geben, von einigen 
nur ein einziges, von anderen bis zu 32.
Chef des Ganzen wird ein Beck-IPC, der würde dann über Ethernet 
angebunden, darüber würde dann auch ein Software-update der Peripherie 
laufen, prinzipiell aber auch über Modem/GSM, wenn das Ding in der Pampa 
hängt.
Wird recht umfangreich das Ganze, umso sorgfältiger muss die Planung 
sein.
Z.B. muss dann auch Hard- und Software-Revision auslesbar sein, jede 
Menge Datentransfers, Parametrierungen, Alarmwerte, Schnittstellen zu 
anderen Feldbussen und und und. Wahrscheinlich werde ich gleich auf 
CAN2.0B gehen, die 11bit gehen schneller aus als man denkt, wenn man 
sinnvolle Gruppen bilden will. Und überall ein bisschen Reserve hat noch 
nie geschadet :-)

von Stefan K. (_sk_)


Lesenswert?

Wenn Du es einfach haben willst mit dem Bootloader, dann ist es 
sinnvoll, dem Bootloader die gesamte NRWW-Sektion - also die maximal 
mögliche Bootsektor-Grösse - zu gönnen. Nur dann kann nämlich der 
Bootloader das gesamte Applikations-Flash beschreiben, ohne auf das 
Flash warten zu müssen.
Das hat den Vorteil, dass Du den Bootloader wie ein ganz normales 
Programm schreiben kannst - mit Interrupts, die die Daten vom CAN holen 
und in ein FIFO füllen, und mit einer main-Schleife, die das Parsen der 
CAN-Daten und das Flash-Programmieren übernimmt.
(Im anderen Fall bleibt Dein AVR während dem Flash-Programmieren stehen 
-> Essig mit IRs. Der Bootloader muss dem Host also vor jedem 
Programmiervorgang (alle  128 bzw. 256 Bytes) mitteilen, dass er eine 
Weile abwesend ist bzw. der Host nichts schicken darf,).

Wichtig ist auch die Geschwindigkeit des CAN-Bus: ist der CAN schneller 
mit der Übertragung der Flash-Daten oder der ATmega mit dem 
Programmieren einer Page? Im letzteren Fall kannst Du ev. auf ein 
Handshake verzichten und nur am Schluss der Flash-Programmierung eine 
Kontrolle des Applikations-Flash z.B. per CRC machen.

Für den CAN brauchst Du ja eine eindeutige ID. Die muss schon im 
Bootloader stehen, damit Du jeden einzelnen adressieren kannst.

Kleiner Insider-gg-Tip für die avr-libc:
Wenn Du IRs aktiviert hast, solltest Du während den Programmierbefehlen 
unbedingt die IRS kurzzeitig sperren. Die Befehle zum 
Flash-Programmieren müssen nämlich aus Sicherheitsgründen direkt 
nacheinander kommen, sonst sind sie ungültig (siehe AVR-Manual dazu). 
Kommt Dir ein IR dazwischen, wird der Flash-Schreibbefehl dann nicht 
ausgeführt.

So gehts richtig:
1
    cli();
2
    boot_page_write(page_open_adr);  // dito bei erase-befehl, etc.!
3
    sei();
boot_page_write startet nur den Flashvorgang und kommt dann sofort 
zurück, die IRs sind also nur kurz gesperrt.

Viele Grüße, Stefan

von crazy horse (Gast)


Lesenswert?

so, gerade mal die betreffende Seiten im Datenblatt angeschaut, da komme 
ich selbst beim Mega8 noch zurecht, 64Byte/page schreiben in max. 5ms.
CAN soll mit 125kBit laufen, macht also selbst bei 11bit-ID und ohne 
stuff-Bits mindestens 7ms für 64Byte, passt also in jedem Fall.
Wie ich das genau machen werde, steht noch in den Sternen, soweit bin 
ich noch lange nicht...
Was passiert denn eigentlich, wenn ich ein paar pages geschrieben habe 
(das eigentliche Programm also zerstört ist), und dann wird die 
Übertragung unterbrochen? Sei es Stromausfall, ein Kabelausfall wie auch 
immer oder sonst was anderes? Dann ist das Teil über CAN ja erst mal 
nicht mehr erreichbar? Oder aus Versehen eine fehlerhafte Version 
aufgespielt, die hängenbleibt? Gibt es da noch einen Noteingang?

Aber Danke erst mal für die nützlichen Infos, wie gesagt, habe mich 
damit bis jetzt überhaupt noch nicht beschäftigt.

von Stefan K. (_sk_)


Lesenswert?

>Was passiert denn eigentlich, wenn ich ein paar pages geschrieben habe
>(das eigentliche Programm also zerstört ist), und dann wird die
>Übertragung unterbrochen? Sei es Stromausfall, ein Kabelausfall wie auch
>immer oder sonst was anderes? Dann ist das Teil über CAN ja erst mal
>nicht mehr erreichbar? Oder aus Versehen eine fehlerhafte Version
>aufgespielt, die hängenbleibt? Gibt es da noch einen Noteingang?

Normalerweise schreibst Du den Bootloader als total eigenständiges 
Programm. Beim ATmega kannst Du per Fuse die Bootvektoren einschalten, 
dann startet der AVR nach einem Reset nicht bei 0000h, sondern eben im 
Bootbereich.
Dort steht der Bootloader. Und bleibt auch da. D.h. Du machst immer nur 
ein Update der Applikation, nie des Bootloaders. Dann kann es nie 
passieren, dass Dir der Kram komplett abstürzt (theoretisch wenigstens 
nicht ...)
Im Bootloader-Programm hast Du natürlich alle Möglichkeiten:
Sinnvoll ist, erstmal zu testen, ob die Applikation geladen werden soll. 
Ich warte dazu 3s auf einen Boot-Befehl zum Host. (Dieses Delay will man 
sicher nicht in jeder Anwendung haben, dann muss man sich eben was 
anderes ausdenken). Danach wird getestet, ob die Anwendung, die im Flash 
steht, auch gültig ist, z.B. per CRC *. Eine abgebrochene oder sonstwie 
gestörte Übertragung fällt also auch raus. Wenn die Anwendung gültig 
ist, wird sie gestartet, der Bootloader hat seinen Teil getan. Wenn die 
Applikation korrupt ist, wartet der Bootloader endlos auf Boot-Daten vom 
Host.

*:
Dazu muss im Applikations-File eine Prüfsumme mit integriert werden.

Die einfachste Art, den Bootvorgang zu starten, ist ein Reset: danach 
ist der Bootloader erstmal aktiv. Hat den Vorteil, dass alles im AVR 
definiert ist, und nicht durch die Applikation irgendwelche Register 
umgedreht wurden, die den Bootloader an der korrekten Arbeit hindern. 
Wenn es ohne Reset gehen muss, dann sollte der Bootloader sicherstellen, 
dass wirklich alle Register initialisiert werden, und sich nicht auf 
Reset-Defaults verlassen.

Viele Grüße, Stefan


von Rainer (Gast)


Lesenswert?

Hallo

Hab gerade gesehen das du dich mit einem Bootloader schon mal 
beschäftigt hast.
Ich nehme an das er bei dir schon funktioniert.

Ich habe nun die gleiche Aufgabe, ich habe 1 bis 64 Module mit einem 
ATmega16m1. Die Dinger sind so schön verbaut das ich da nicht mehr 
rankomme -> Lösung: Bootloader

Kannst du mir Infos zu deiner Lösung schicken?
Ich verwende einen PEAK CAN-USB Adapter für die PC-CAN kommunikation.

Vorab schon mal Danke

MfG

Rainer

von Rudolph (Gast)


Lesenswert?

www.atmel.com/Images/doc8247.pdf vielleicht?

Wobei ich "4k" und "slim" für ein wenig seltsam halte, alles braucht man 
davon wahrscheinlich auch nicht.

Was mich bisher vor allem auch von einem Bootloader abgehalten hat ist 
das man auf dem PC noch die Gegenseite dafür benötigt.

von Frank J. (frank5)


Lesenswert?

Hallo,

ich benutze den Bootloader von dieser 
http://www.kreatives-chaos.com/artikel/can-bootloader Seite. Bis auf das 
UI und ein paar Timing Probleme, Funktioniert das eigentlich sehr Gut. 
Ich habe mir ein kleine Programm in VC++ geschrieben, welche das Phyton 
Programm aufruft. Das tut auch einigermassen. Zu mehr reichen meine VC++ 
Kentnisse nicht aus.
Gruss
Frank

von Rainer (Gast)


Lesenswert?

Hallo zusammen.

Hab an einem ATmega16M1 den Bootloader von Atmel eingebaut. Flashen über 
FLIP-PC Software mit einem PEAK-CAN USB Adapter.

Achtung die Application Note von ATMEL AVR076 mit dem ISR Compiler 
enthält Fehler!!
Das Linker File wurde vom Mega32 kopiert und nur der Text aut Mega16 
geändert, sämtliche Speicherbereiche sind hier falsch!!

Falls das jemand testen will kann ich die aktuellen Linker Files 
zusenden.

Zum Compilieren braucht man den IAR Compiler
(siehe Compiling Notes AVR076),
den gibts als eval.Version:
Time Limited -> 30 Tage voller Umfang
Size Limited -> zeitlich unbegrenzt, auf 4k limitiert -> hört sich 
verführerisch an für den 4k Bootloader -> FALSCH, da im Projekt 
ASM-Befehle drin sind geht es trotzdem nicht.
Ich habs mit der Time Limited Version gemacht.

MfG

von Rainer (Gast)


Lesenswert?

Den Fehler habe ich bei ATMEL gemeldet und wurde bereits bestätigt.
Vielleicht gibts dann mal eine neue Version.
Super wär natürlich wenns für den AVRGCC verfügbar wäre (wie für den 
AT90CAN128/64/32, der hat aber 5,4k)

Schöne grüße aus Österreich

von Rudolph (Gast)


Lesenswert?

Häng das doch mal bitte hier an, das interessiert mich durchaus, nur 
testen kann ich das gerade nicht.
Wobei noch interessant wäre, ob man den mit den Vector-CAN Tools 
benutzen kann.

von Rainer B. (rabum)


Angehängte Dateien:

Lesenswert?

Hab das Linker-File mal angehängt

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.