ISP lohnt sich


Mein neustes Spielzeug ist ein AVR ISP und nach den ersten Versuchen kann ich nur begeistert sagen: die Anschaffung lohnt sich auch für normale Aruino User!

Hintergrundwissen:
Normalerweise programmiert man einen nackten Atmel Mikrocontroller – wie er sich auf jedem Arduino befindet – über die SPI Schnittstelle mit Hilfe eines In-System Programmers. Das man einen Arduino im Normalfall dagegen über die serielle Schnittstelle programmiert liegt daran, dass auf dem Mikrocontroller bereits ein Bootloader installiert ist, der nach einem Reset erstmal kurz schaut ob da erst ein neues Programm über die serielle Schnittstelle hochgeladen werden soll. Ich habe lange darüber nachgegrübelt, wieso die nicht gleich einen ISP mit auf das Board gepackt haben und vermute es liegt daran, dass man die serielle Schnittstelle zum Computer beim Prototyping ohnehin fast immer benötigt und das ganze mit dieser Methode anfängerfreundlicher und kostengünstiger ist.

Wozu ein ISP beim Arduino?
Da ein Arduino ohne Bootloader nicht über die serielle Schnittstelle programmiert werden kann, braucht man einen ISP zwingend um zunächst einmalig den Bootloader zu installieren (bei fertigen gekauften Arduinos ist der bereits vorinstalliert).
Man kann den ISP aber auch dazu verwenden, einen Sketch direkt hochzuladen. Das hat folgende Vorteile:

  • Der Bootloader fällt weg, man spart also Speicherplatz auf dem Controller
  • Der Upload geht spürbar schneller (Getestet mit einem Atmega8 auf einem Duemilanove Board mit Diamex ISP – ca. 3 Sekunden statt ca. 9 Sekunden)
  • Die serielle Schnittstelle bleibt frei, man kann sich also das lästige Serial Monitor öffnen/schließen Spielchen bei jedem Upload sparen

Konfiguration ISP
Wenn der eigene ISP nicht in der Liste unter „Tools->Burn Bootloader“ auftaucht, muss man den zunächst einmal in der Datei /arduino-0022/hardware/programmers.txt anlegen. Bei mir habe ich folgenden Eintrag oben hinzugefügt:

diamexisp.name=Diamex ISP
diamexisp.communication=serial
diamexisp.protocol=stk500v2
diamexisp.speed=19200

Wenn man die Arduino IDE anschließend neu startet, findet man den neuen ISP auch wie folgt im Menü:

Konfiguration Board
In der Datei /arduino-022/hardware/boards.txt muss man angeben, bei welchen Boards der Upload von Sketchen über den ISP laufen soll. Das geht mit der Konfigurationsvariable [board].upload.using=[programmer]. Am besten kopiert man dazu einen bestehenden Eintrag, entfernt die [board].bootloader Einträge, fügt die [board].upload.using Angabe hinzu und gibt dem ganzen einen neuen Namen. Wie zum Beispiel hier aus meiner Config:

atmega8isp.name=ATmega8 & ISP
atmega8isp.upload.protocol=stk500v2
atmega8isp.upload.maximum_size=30720
atmega8isp.upload.speed=57600
atmega8isp.upload.using=diamexisp
atmega8isp.build.mcu=atmega8
atmega8isp.build.f_cpu=16000000L
atmega8isp.build.core=arduino

Alternative zum Serial Monitor
Jetzt können wir Sketche über den Com Port des ISP hochladen und serielle Daten über den Com Port des Arduino USB Anschlusses verarbeiten. Dummerweise gibt es in der Arduino IDE nur einen Com Port für beide Zwecke zur Auswahl. Wenn man den eingebauten Serial Monitor verwendet, müsste man also vor und nach jedem Upload den Port ändern, was ziemlich lästig wäre. Die Rettung ist ein alternatives Terminalprogramm wie zum Beispiel dieses hier. Einfach die Arduino IDE auf den Com Port des ISP stellen und im alternativen Terminalprogramm auf den USB Anschluss.

Advertisements

2 Gedanken zu “ISP lohnt sich

  1. Hallo sui,

    habe deine Anleitung direkt ausprobiert.
    1. Versuch schlug fehl, weil die IDE offensichtlich nicht oder nicht korrekt die eingetragene Baudrate zu avrdude überschreiben konnte. Habe die Baudrate dann ganz weggelassen in den Einträgen, dann nimmt er die vorgegebene für /dev/ttyUSB0 mit 115200, was ja eh schneller ist und auch bisher immer funktioniert hat.
    Mein Einträge in programmers.txt und boards.txt sehen für den mySmartUSB wie folgt aus:

    programmers.txt
    mySmartUSB.name=mySmartUSB
    mySmartUSB.communication=serial
    mySmartUSB.protocol=stk500v2

    boards.txt (hier für den Atmega168)
    atmega168.name=Arduino NG or older w/ ATmega168

    atmega168.upload.protocol=stk500v2
    atmega168.upload.maximum_size=14336
    atmega168.upload.using=mySmartUSB

    atmega168.bootloader.low_fuses=0xff
    atmega168.bootloader.high_fuses=0xdd
    atmega168.bootloader.extended_fuses=0x00
    atmega168.bootloader.path=atmega
    atmega168.bootloader.file=ATmegaBOOT_168_ng.hex
    atmega168.bootloader.unlock_bits=0x3F
    atmega168.bootloader.lock_bits=0x0F

    atmega168.build.mcu=atmega168
    atmega168.build.f_cpu=16000000L
    atmega168.build.core=arduino

    Noch als Tip: wenn man beim Uploaden die Shift Taste gedrückt hält bekommt man ausführliche Meldungen. Macht die Fehlersuche einfacher.
    Weiterer Tip: die Dateien müssen, wenn man das Ubuntu Package installiert hat, als root (sudo) geändert werden. Die Dateien befinden sich unter
    sudo kate /usr/share/arduino/…

    Danke nochmals für deine ausführliche Anleitung
    Gruß Reinhard (erni-berni)

  2. Ganz meine Meinung. Der Bootloader nervt nur und kostet unnötig Platz.

    Den abgebildeten ISP habe ich auch. Und zwei Original AVR ISP MK II. Erkenntnis: die Orginale sind Ihr Geld Wert. Im Gegensatz zum Nachbau kann man bei den Original ISPs (z.B. mit dem Mitgelieferten AVR Studio) die Programmiergeschwindigkeit hochsetzen. Das merkt sich der ISP auch nach dem Ausschalten. Damit geht die Geschwindigkeit dann nochmal deutlich nach oben.

    Der billige Klon glänzt eigentlich nur wenn das Target keine eigene Spannungsversorgung hat.

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s