Flashen über CAN möglich?

Gast #430372
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.
#430395
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
Gast #430402
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 :-)
#430497
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
Gast #430529
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.
#430543
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

Gast #3428130
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
Gast #3428184
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.
Gast #3440572
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
Gast #3440576
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren