Hallo, ich habe mehrere Geräte (ATMEGA32 + MCP2515) an einen CAN-Bus, welche mittels Bootloader http://www.kreatives-chaos.com/artikel/can-bootloader programmiert werden sollen. Wie kann ich die Geräte reseten, um den Bootloader zu starten ? Probleme: * 5V abschalten geht nicht, da Batterie-Puffer an einigen Geräten * Reset am Gerät später nicht möglich, da schwer zugänglich (deswegen Bootloader) * Die Geräte sind über eine 4-adrige Telefon-Leitung verbunden. +5V, GND, CANH, CANL Hat jemand ne Idee, habe im Netz nichts sinnvolles gefunden...
Über den Watchdog einen Reset auslösen. D.h. Watchdog mit Timeout X aktivieren aber den Zähler nicht zurücksetzen. Dann kommt der Reset automatisch...
Durch was soll der Watchdog aktiviert werden ? Per CAN-Nachricht ist nicht möglich... Ganz am Anfang hat die Schaltung nur den Bootloader... Wenn alles läuft darf der Watchdog nur bei nem anstehenden Software-Update auslösen.
> Per CAN-Nachricht ist nicht möglich...
Dann gehts nicht.
Du musst ja irgendwie den Reset auslösen (= in den Reset Vektor springen
egal ob per Watchdog oder anders) wenn nicht per CAN wie denn dann wenn
die einzige Verbindung ist?
M. B. schrieb: > Durch was soll der Watchdog aktiviert werden ? > Per CAN-Nachricht ist nicht möglich... wdt_enable() sobald ne besitmmte can nachricht empfangen wurde.. wdt timeout auf < 1s und gut :)
M. B. schrieb: > Durch was soll der Watchdog aktiviert werden ? > Per CAN-Nachricht ist nicht möglich... > Ganz am Anfang hat die Schaltung nur den Bootloader... Musst du halt einen kleines Urprogramm mit auf die Controller brennen, bevor du sie einbaust. Der Bootloader muss ja auch mal geflasht werden, da hängt man einfach dem HEXfile das Urprogramm an é voila... Das Urprogramm muss ja nicht viel können und kann erstmal nur aus aktivieren des Watchdogs nebst leerer Mainloop bestehen. mfg mf
Wie wär's wenn Du den Bootloader dahingehend erweiterst, dass der Watchdog im Bootloader läuft und zyklisch getriggert wird. Bei Empfang des Befehls "Start Application" stellst Du das Triggern ein und bekommst dadurch den Reset.
OK, das Urprogramm kann ich aber auch nur per Bootloader aufspielen, oder ? Der Bootloader müßte sich solange selbst resetten, bis das Urprogramm aufgespielt wurde. Die "richtige" Software muß dann aber unbedingt eine "Software-Reset-Variante" haben, sonst kann die Schaltung später nicht mehr geladen werden. Alternativ dachte ich an folgende Hardware-Lösung: .....an einen Transistor, welcher an der CANH-Leitung hängt. Wenn ich CANH kurzzeitig auf +5V lege, soll der Transistor den Kondensator an der Resetschaltung kurzschließen ...
Tja - wie kommt denn der bootloader auf den Chip? Muss also auf jeden Fall eine Möglichkeit bestehen, auch ein Mini-Zusatzprogramm gleich mit draufzuspielen. Ich kenne jedenfalls keine AVRs, die den Bootloader schon eingebaut haben (wie z.B. M16C).
Die Schaltungen sind sich alle sehr ähnlich und können später verschieden Funktionen übernehmen. Deswegen will ich nur den Bootloader per ISP aufspielen und später den Rest per CAN, je nach Verwendung... Aber das Urprogramm könnte ich ja gleich danach drauf spielen... könnte das Urprogramm auch ein paar Bytes im Bootloader überschreiben, z.B. um die ID der Schaltung zu ändern ??? Oder ist der Bootloader in einem geschützten Bereich ?
Der Bootloader liegt im Flash und kann daher durch die Applikation nicht direkt geändert werden. Du könntest Daten, die für den Bootloader und die Applikation relevant sind, z.B. in das EEPROM auslagern...
Prozessor startet Bootloader wird angesprungen Bootloader wartet 500ms auf CAN-Kommando zum Programmiermodus Watchdog wird angeschaltet Zielprogramm wird angesprungen Zielprogramm macht den Watchdog aus bzw resettet periodisch, es sei denn programmierung ist gewünscht ------------- Wenn jetzt nur der Bootloader drauf ist und kein Zielprogramm, greift der Watchdog. mfg mf PS: ich meinte damit: modifiziere den Bootloader so, dass er den Watchdog nach den 500ms anschaltet, wenn kein Zielprogramm vorhanden ist startet die Mühle von vorn. Du hast ohne Zielprogramm regelmäßig 500ms
Vielen Dank erstmal für die Vielen Antworten. Die Sache mit dem Watchdog scheint die beste Lösung zu sein. Ich werde die ID auf dem Eprom speichern und im Bootloader auslesen. So kann auch auch später die Schaltungen zu Software laden einfach resetten, indem ich den Bootloader nicht resette... EINFACH und GUT...
i.d.R. setzt man im Parameterspeicher des userprogramms noch ein flag das der bootloader beim nächsten bootup nicht in das userprogramm springt sondern im bootloader verweilt und auf das firmwareupdate wartet! ansosnten macht dein gerät ein reset, springt in den bootloader und von dort dann ja gleich wieder in dein userprogramm, dann klappt das update ja wieder nicht!
OK, das ist sinnvoll, wenn ich es nicht innerhalb der 500ms schaffe, die erste Nachricht zu senden... was oft passieren wird...! Werde ich mal im Auge behalten... DANKE Setze ich das Flag auf dem EEProm oder gibt es andere Flags für sowas ?
>Setze ich das Flag auf dem EEProm oder gibt es andere Flags für sowas?
Das setzt man im Parameterspeicher, hast Du den keine Parameter die Du
in Deinem userprogramm speichern muss? (z.B. seriennummer des Gerätes,
die adresse des gerätes...)
das kann z.B. ein eeprom oder ein flash sein.
Wenn Du keine userparameter hat, gibt es noch einen anderen Trick:
Du hinterlegst im bootloader die Prüfsumme von deinem userprogramm, im
bootloader prüfst du dann den Speicherbereich wo dein userprogramm liegt
und wenn die Prüfsumme übereinstimmt springst du in das userprogramm.
Beim firmwareupdate kannst du geziel ein byte im userprogramm
zerschiesen, nach dem reset wird dein loader dann bemerken dass die
prüfsumme falsch ist und verweilt dann im bootloader!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.