Mahlzeit zusammen, ich habe auf meinen ATmegas einen STK500v2 kompatiblen Bootloader laufen, d.h. ich kann mittels avrdude flashen. Nach einem Reset wartet der Bootloader für eine definierte Zeit, z.B. 5s, danach wird in die Applikation gesprungen. Soweit, so gut. Denke dieses Vorgehen ist mehr oder weniger Standard. Wenn ich im laufenden Betrieb flashen will dann geht das nur umständlich. Ich muss irgendwie in den Bootloader kommen, notfalls über einen PowerDown Reset. Das erfordert physischen Zugang zum Gerät. Schöner fänd ichs, wenn ich per Kommando mein Gerät resetten könnte. Dann muss ich nicht erst an der Stromversorgung oder sonstwo herummurksen. Grundsätzlich geht das, denn meine Applikation beherbergt einen Kommandointerpreter der UART-Kommandos ausführen kann. Unter anderem auch einen Software-Reset. Allerdings kennt avrdude diesen Befehl natürlich nicht. Wie würdet ihr das also lösen? Ich sehe nur die Möglichkeit: - vorm avrdude-Aufruf schnell mit einem beliebigen Terminalprogramm den Reset-Befehl absetzen. Ist halt Mehraufwand. Könnte man evtl. über ein Shell-Skript lösen. Kriegt man das geschickter hin? Bietet Stk500v2 irgendwie die Möglichkeit? Oder kann avrdude auch "eigene Kommandos" irgendwie absetzen?
dummy schrieb: > Watchdog aktivieren > while(1); Du hast dir meinen Beitrag nicht durchgelesen, oder?
>Du hast dir meinen Beitrag nicht durchgelesen, oder?
Wenn in deiner App stk500v2 Kommandos empfangen werden in den Bootloader
springen. Ansonsten steht es dir frei den Sourcecode
von avrdude zu modifizieren.
dummy schrieb: >>Du hast dir meinen Beitrag nicht durchgelesen, oder? > > Wenn in deiner App stk500v2 Kommandos empfangen werden in den Bootloader > springen. Wäre eine Möglichkeit. Dann muss der stk500v2 Interpreter allerdings auch noch in die Applikation mit rein. OK, Flash wäre noch genug vorhanden. Was mich bisl davon abhält ist dass auf UART0 momentan mein eingangs erwähnter Kommando-Interpreter hört. Dann müsste dieser wieder aufgebohrt werden um Kommandos als Stk500-Kommando zu identifizieren. Unschön, aber liese sich machen. > Ansonsten steht es dir frei den Sourcecode > von avrdude zu modifizieren. Unschön, weil Insellösung. Es wäre ungeschickt, einen Stk500v2 Bootloader anstatt ein Eigengewächs zu verwenden um mit gängigen Tools kompatibel zu sein, nur um dann diese Tools zu modifizieren :-) Stellt mich alles nicht so recht zufrieden :/
Hi, so ganz verstehe ich Dein Problem nicht. Jeder ISP Programmer zieht die Reset Leitung auf low bevor (und während) er programmiert. Oder meinst Du das flashen mit dem Bootloader? Dann kannst Du mit avrdude so einen Reset schicken (Beispiel): avrdude -p atmega32 -P /dev/ttyS0 -b 115200 -c avr910 (d.h avrdude ohne weiteren Befehl aufrufen) Danach muß natürlich relativ schnell das Terminalprogramm ins Spiel kommen. Gruß Andreas
Andreas B. schrieb: > Jeder ISP Programmer zieht die > Reset Leitung auf low bevor (und während) er programmiert. > Danach muß natürlich relativ schnell das Terminalprogramm ins Spiel > kommen. > so ganz verstehe ich Dein Problem nicht. Nimms mir nicht übel, aber ich merks.
Entweder ich hab mein Anliegen so schlecht geschildert oder ich hab heut einfach Pech mit meinen Antworten... Ich suche mal die Schuld bei mir und versuche, alles nochmal genau zu beschreiben: 1) Ich habe einen Bootloader der das STK500v2 Protokoll spricht 2) Dieser wird nach Reset grundsätzlich durchlaufen und startet nach einer bestimmten Zeit die Applikation 3) Die Applikation spricht momentan kein STK500v2. 4) Die Applikation besitzt dafür einen "Kommandointerpreter", der es mir unter Anderem auch erlaubt, einen Software-Reset durchzuführen => Ziel ist, aus dem laufenden Betrieb die Applikation zu flashen, respektive in den Bootloader zu wechseln, ohne irgendwelche Tricks wie "Netzstecker ziehen" Die Lösung, per Terminal meinen Reset-Befehl zu senden und dann ganz schnell avrdude aufzurufen würde gehen. Die bedingt aber ein zweites Tool (Terminal) und ein genaues Timing (avrdude muss rechtzeitig gestartet werden)
OK, dann versuche ich auch mal etwas deutlicher zu werden: Fall 1: Bootloader flashen Jeder ISP Programmer zieht die Reset Leitung auf 0, programmmiert und interessiert sich nicht für ein laufendes Programm Fall 2: Anwendung mittels Bootloader flashen Eine Batch Datei erstellen, die via avrdude den AVR mit Programmer und CPU Typ aufruft. Dabei wird Reset auf 0 gezogen. Anschließend wird in dieser Batch Datei das Terminalprogramm aufgerufen. Ich weiß allerdings nicht, was ein STK500 Protokoll ist (habe kein STK). Somit kann ich also auch auf dem Holzweg sein. Aber für einen AVR, der per ISP ansprechbar ist und auch einen Bootloader hat, der seriell ansprechbar ist, wäre dies ein Weg. Gruß Andreas
:
Bearbeitet durch User
Oder eine Batch-Datei bzw. Shell-Script machen, die folgendes tut: * ein Script/Programm aufrufen, dass: ** den Reset-Befehl über UART absetzt ** wartet bis über den UART ein "Bootloader Ready" kommt * avrdude aufrufen
Ben schrieb: > momentan mein eingangs > erwähnter Kommando-Interpreter hört. Dann müsste dieser wieder > aufgebohrt werden um Kommandos als Stk500-Kommando zu identifizieren. > Unschön, aber liese sich machen. Das halte ich für die vernünftigste Lösung und keineswegs unschön. Je nachdem wie Dein eigenes Protokoll aufgebaut ist (und Dein Kommandointerpreter) sollte es überhaupt nicht schwer sein anhand der ersten paar Bytes die reinkommen einen Verbindungsversuch des avrdude zu erkennen und dann einen reset auslösen. Avrdude wird seinen Verbindungsversuch mehrmals wiederholen. Reset löst Du aus indem Du den watchdog auf die kürzeste Zeitspanne stellst und dann while(1);
@Andreas B. Ja du bist total auf dem Holzweg. Es geht nicht um den üblichen Aufbau einer Schaltung mit AVR, sowie einem zusätzlichen Programmieradapter. Sondern die Schaltung hat KEINEN Programmieradapter. Stattdessen hat der AVR eine Firmware, die ihn selbst flasht und einen STK500v2 Programmer simuliert. Aber das tut sie nur in den ersten Sekunden anch dem Reset. Danach wird das eigentliche Programm der Anwendung gestartet die zu einem ganz anderen Zweck seriell mit dem PC kommuniziert. Der Serielle Port kann dann eben NICHT mehr zum Programmieren genutzt werden. Aber der PC kann über den seriellen Port einen Befehl absetzen, der die Firmware im AVR dazu veranlasst, neu zu starten. Dadurch würde der Controller für einige Sekunden lang bereit sein, Befehle eines Programmieradapters anzunehmen. Nun möchte er aber PC seitig nicht zwei Programme benutzen (eins um den Reset-Befehl seriell zu senden, und ein zweites, um zu programmieren), sondern gerne beides elegant kombinieren, am liebsten nur mit avrdude. Jetzt verstanden?
Dann gibt es eigentlich nur diese Möglichkeiten: - avrdude modifizieren, Reset + Warten auf Bootloader zu machen - eigenen Com-Driver schreiben, der mit dem Weiterleiten der avrdude-Kommandos wartet und vorher noch Reset sendet - die Avr Software modifizieren, damit sie auf Programmer-Kommandos resettet - einen eigenen AVR auf dem UART mithören lassen und der macht einen Hardware-Reset, wenn er Programmer-Befehle sieht :-) - eine separate RESET-Leitung zur Zielschaltung
Ben schrieb: > Die Lösung, per Terminal meinen Reset-Befehl zu senden und dann ganz > schnell avrdude aufzurufen würde gehen. Die bedingt aber ein zweites > Tool (Terminal) Ja, und? > und ein genaues Timing (avrdude muss rechtzeitig gestartet werden) Du kannst ja die Wartezeit im Bootloader passend einstellen. Aber wie lange kann das schon dauern, nach "echo 'reset, bitte' >/dev/ttyS0" dann avrdude zu starten? Avrdude zu modifizieren halte ich wiederum für eine schlechte Lösung. Es widerspricht dem KISS-Prinzip. "One job, one tool." Schließlich hat man eine Shell genau für diese Art von Aufgabenstellung. XL
Ben schrieb: > Die Lösung, per Terminal meinen Reset-Befehl zu senden und dann ganz > schnell avrdude aufzurufen würde gehen. Die bedingt aber ein zweites > Tool (Terminal) Nein. Kein Terminal. Einfach ein simples Script das den seriellen Port öffnet, die spezielle Reset-Sequenz sendet, den Port wieder schliesst (wahrscheinlich reicht sogar ein simples echo, notfalls vorher noch die Baudrate setzen) und dann avrdude startet. Müsste mit 2 oder 3 Zeilen Bash gehen. Timing ist auch nicht kritisch denn obiges läuft in wenigen Millisekunden ab während Du wahrscheinlich fast ne halbe Sekunde (also ne halbe Ewigkeit) Zeit hättest.
:
Bearbeitet durch User
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.