Seriell? Nein, ISP und schnell!

Einen ISP-Programmer hatte ich schon bevor ich meinen ersten Arduino hatte, war dem Studium geschuldet, wo ich mit ATmega8 in Assembler arbeitete. Doch auch mit dem Arduino benutze ich den weiterhin, ohne kann ich nicht. Zum einen funktioniert bei mir das Flashen über die serielle Schnittstelle selten gut, beliebt ist dabei
avrdude: stk500_getsync() attempt x of y: not in sync resp=0x00
stk500_recv(): programmer is not responding
Zum Anderen nutze ich auch viele Atmels außerhalb der Arduino-Gebilde. Zwar kann man einen Arduino als ISP-Programmer opfern, aber dann doch lieber gleich eine vernünftige und funktionierende Version. Absolut notwendig wird so etwas, wenn man seinen Bootloader zerschossen hat.

ISP steht für In System Programming, also grob: der Chip kann bleiben wo er ist verbaut und über diese Schnittstelle programmiert werden, sofern ein ISP-Header verfügbar ist. Bei allen Arduino-Boards sind dieser bereits vorinstalliert – als ISP6. Die sechs lustigen Pins, angeordnet als 2×3, bieten die normalen SPI Pins. ISP basiert auf SPI oder JTAG, in unserem Fall SPI. Vereinfacht wird der Arduino, bzw. ATmega zum Slave Gerät, der Rechner spricht ihn dann mit dem ISP-Gerät als einfachen Flash und EEPROM an.

Wenn man den obigen Fehler bekommt, kann es sein, dass irgendwelche Fuses zerschossen wurden, der Bootloader nicht richtig läuft (z.B. Reset nicht mit Wartezeit durchführt) oder durch irgendwas anderes der Haussegen schief hängt. Das Problem bei der seriellen Schnittstelle ist, dass sie asynchron läuft. Vergleichbar mit normalem Reden: der Gegenüber sagt etwas und wir erkennen automatisch die Buchstaben, ohne, dass er uns ein extra Zeichen gibt. Spricht er zu schnell, können wir es nicht mehr verstehen. Zu langsam wird es schnell uninteressant. Bei ISP gibt der Gesprächspartner den Takt vor und wir passen uns automatisch dran an, ob wir wollen oder nicht.

Vorteile von ISP:

  • Meist schneller beim Flashen
  • Deutlich zuverlässiger
  • Viel flexibler

Viel flexibler bezieht sich z.B. auf einen 32u2 oder 32u4 beim Leonardo, Micro oder Uno: statt des normalen Bootloaders kann man den Arduino auch als USB-MIDI-Gerät nutzen.

Die Kosten für einen ISP-Programmer sind je nach Typ zwischen 3 und 100 Euro. Funktionieren tun sie fast alle. Im Normalfall erhält man einen Programmer mit ISP10 Header, einen Adapter auf ISP6 gibt es aber schon ab einem Euro. Am Besten einen Programmer nutzen, der in der Arduino IDE unter Tools > Programmer aufgelistet ist. Denn genau das muss man machen, um über ISP zu flashen:
Adapter aus besagtem Menü auswählen und den Uploadbutton bei angeschlossenem Board mit gehaltener Shift-Taste klicken. Beim Shortcut ebenfalls die Umschalttaste zu Strg+P/cmd+P dazunehmen. Eine aktive serielle Schnittstelle muss man seit Version 1.6 nicht mehr haben. Bedeutet, wenn man zwei Nanos da hat, stöpselt man den Ersten an, läd hoch und dann beim Zweiten – ohne, dass man im Menü die serielle Schnittstelle wechseln muss. Einfacherer Workflow also für die kleine Serienfertigung.

Was auch möglich wird: ATtinys und andere Atmels flashen, die es so auf kein normales Board geschafft haben oder die man einfach ohne das ganze Gedöns nutzen möchte.

Mein Rat: einen günstigen ISP-Programmer samt ISP10-ISP6-Adapter kaufen und sich nie wieder Gedanken über Fehlermeldungen, wie not in sync oder Verweigerungen des Treibers machen. Ansonsten einen günstigen Arduino opfern und als ISP-Programmer nutzen.

2 Gedanken zu „Seriell? Nein, ISP und schnell!

  1. „Aye, da gibt es vielerlei Möglichkeiten“
    So dumm ist die Sache mit dem Bootloader über Seriell auch nicht. Einige China-8051-Controller (STC-MPU’s: wen es interessiert: http://grauonline.de/wordpress/?p=44 ) haben das bereits im Prozessor-Mikrocode eingebaut. Wenn der arduino eh an der Nabelschnur eines Host-System hängt, ist es auch die naheliegende Version des ISP.
    Hängt halt immer von der Gesamtarchitektur ab, was sich anbietet.
    SPI und HVP( insbesondere bei den Pin-armen Tiny’s – dort HVSP ) sind die Brute-Force-Methoden – wenn nicht jetzt, ist er tot.
    ( unveröffentlicht: Hatte da schon mal einen Artikel zum SPI/HVSP in der Pipeline – bei Interesse kann ich das denn erstmal in das Forum schieben)
    Nur am Rande: SPI ist ja eigentlich kein Programmer, sondern nur ein serielles synchrones Protokoll mit Data-In/Out und Clock. R.Pi-Klasse-Geräte können das von Haus aus, wenn dann auch noch einige Loops mit Befehlen notwendig sind. Das läßt sich dank dem äußerst flexiblen avrdude, der auch beim arduino-environment im Hintergrund arbeitet, aber mit 2 Out und einer In-Leitung – wo auch immer die sind und per software kontrollierbar sind – bewerkstelligen. (Prominentestes Beispiel: der gute alte Parallel Drucker-Port – das Swiss-Knife für IO-Pins am PC )
    Wieder zum Bootloader-Protokoll:
    Das ganze orientiert sich ja am Atmel „Programmer“ STK500 – richtiger wäre „Upload-Protokoll“.
    Am Rande: Speziell bei Pro-Mini’s hilft bei den typischen „Error stk500_recv ()“-Problemen die DTR-Leitung zu Hilfe zu nehmen, wie es bei den Standard-Arduino-Designs implizit geht.

    Das Protokoll kann man nachlesen: http://forum.arduino.cc/index.php?topic=36774.0
    „The Arduino bootloader uses the STK500 (original, not version II) protocol: http://www.atmel.com/dyn/resources/prod_documents/doc2525.pdf.“
    Das ist bisher die beste Quelle, die ich gefunden habe, die den Bootloader in der Tiefe abhandelt:
    „Everything You Always Wanted to know about Arduino Bootloading but Were Afraid to Ask“
    Will man mehr verstehen und debuggen, hilft wohl nur in die umfangreiche atmel Doku Satz für Satz zu lesen oder den Bootloader-Source zu studieren. Aber das wird jetzt möglicherweise akademisch und einfach SPI an den AVR/Arduino zu stecken ist dann die kleinere Hürde.

    Da das mit den Links hier noch nicht so einfach zu gehen scheint, die Links als Liste:
    https://learn.sparkfun.com/tutorials/serial-peripheral-interface-spi
    http://www.atmel.com/tools/STK500.aspx
    http://www.atmel.com/dyn/resources/prod_documents/doc2525.pdf
    http://baldwisdom.com/bootloading

  2. Hallo Luca! Vielen Dank für die einführenden Informationen. Ich denke, dass ich das Prinzip der ISP-Programmierung nun verstanden habe. Nenne schon mehrere Megas mein Eigen, die allesamt den Heldentod gestorben sind. Die USB-Schnittstellen funktionieren nicht mehr. Vielleicht kann ich die Arduinos mit der Direktprogrammierung wiederbeleben? Habe gerade USB-AVR-Programmer + 10/6 Pin Adapterkabel bestellt und hoffe, damit auf dem rechten Weg zu sein. Mal sehen, wie es weiter geht… Grüße aus Dresden an alle Arduino -Fans von Frank

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

I accept that my given data and my IP address is sent to a server in the USA only for the purpose of spam prevention through the Akismet program.More information on Akismet and GDPR.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.