Montag, 30. Dezember 2013

Chinesischer AVR-ISP

Im Rahmen des chinesischen Advents-Kalenders habe ich u.a. eine Tüte voll USB-AVRISP Adapter gekauft. Im Gegensatz zu den meisten Programmern, die man in der Bucht findet steckt dieser in einem soliden und sehr schlanken Metallgehäuse und preiswert war er obendrein. Da er extrem klein ist, fand ich ihn perfekt als Begleiter, wenn man mal zum Basteln "on the road" ist. Hier ein Familienfoto und eine Nahaufnahme mit Flachbandkabel:

 
Also gleich mal anstecken:

[283553.080099] usb 5-2: new low-speed USB device number 2 using uhci_hcd
[283553.253147] usb 5-2: New USB device found, idVendor=03eb, idProduct=c8b4
[283553.253151] usb 5-2: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[283553.253154] usb 5-2: Product: USBHID
[283553.253156] usb 5-2: Manufacturer: zhifengsoft
[283554.564881] generic-usb 0003:03EB:C8B4.0001: hiddev0,hidraw0: USB HID v1.01 Device [zhifengsoft USBHID] on usb-0000:00:1d.0-2/input0
[283554.564939] usbcore: registered new interface driver usbhid
[283554.564944] usbhid: USB HID core driver


Hm - ein HID device? Ich hatte jetzt eher mit ttyUSB oder sowas gerechnet - merkwürdig. Laut eBay Verkäufer wird das Ding von Progisp 1.72 unterstützt. Davon hab ich noch nie gehört und eine Google-Suche führt mich auf diverse, in elaboriertem Chinglish verfasste Seiten mit wenig vielversprechenden Screenshots voller fernöstlicher Schriftzeichen. Sowas will ich nicht haben, sondern meinen geliebten avrdude! Also weitersuchen. Die Beschreibung sagt etwas von USBasp - den kennt avrdude. Also testen wir das mal:

$ avrdude -p m328p -c usbasp -U flash:r:foo.dat:i
avrdude: error: could not find USB device "USBasp" with vid=0x16c0 pid=0x5dc

avrdude done.  Thank you.


Das war wohl nix - offenbar sollte der USBasp die ID 16c0:05dc haben und nicht 03eb:c8b4 wie mein chinesisches Kleinod (Typ: MX-USBISP-V3.00, 2013-03-15 laut silkscreen). Also mal nach der ID googeln. Aha - ich bin nicht allein mit meinem Problem: Das Ding ist zwar hardwaremäßig fast ein USBasp, aber das weiß seine Firmware nicht. Zu allem Überfluss kommt die originale USBasp Firmware nicht mit dieser Hardware klar - grumpf!

Also erst mal aufmachen - nur wie? So:

Einfach die Metallhülse in Richtung USB-Stecker schieben. Von innen bietet sich dann folgendes Bild:

Nach einiger Suche hab ich dann eine Lösung gefunden: im GreenPhotons-Blog von [uwezi] fand sich ein Eintrag zu genau dem Ding. Offenbar braucht die USBasp Firmware einen kleinen Tweak, um auf diesem Progammer zu laufen. Auf obiger Seite kann man auch eine bereits gepatchte Firmware herunterladen, falls man zu feige zum compilieren ist. Das folgende ist nicht auf meinem Mist gewachsen, ich gebe es aber hier wieder, damit zukünftige Leidensgenossen einen weiteren Anlaufpunkt bekommen:
  1. Zunächst besorge man sich die USBasp Firmware
  2. Dann muß diese leicht modifiziert werden:
    in main.c finden sich die Zeilen

    int main(void) {
      uchar i, j;

      /* no pullups on USB and ISP pins */
      PORTD = 0;
      PORTB = 0;
      /* all outputs except PD2 = INT0 */
      DDRD = ~(1 << 2);


    die letzte Zeile muss so verändert werden:
      DDRD = 0x00;
  3. Compilieren
  4. Metallgehäuse abziehen
  5. Auf der Unterseite der Platine finden sich zwei Kontakte, die mit "-> up <-" gekennzeichnet sind. Diese mit einem Stück Schaltdraht überbrücken. Nun ist das Ding im self-programming mode
  6. Mit einem anderen ISP-Programmer die neue Firmware flashen z.B.:
    avrdude -p m8 -c stk500v2 -P /dev/ttyACM0 \\
      -U flash:w:20130212_mega8_usbisp.hex:i
  7. Schaltdraht-Brücke raus, Gehäuse drauf
  8. Fertig
 Nun meldet sich das gute Stück korrekt als USBasp:

[285378.660075] usb 5-2: new low-speed USB device number 3 using uhci_hcd
[285378.832112] usb 5-2: New USB device found, idVendor=16c0, idProduct=05dc
[285378.832122] usb 5-2: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[285378.832129] usb 5-2: Product: USBasp
[285378.832135] usb 5-2: Manufacturer: www.fischl.de


Und auch avrdude ist nun zufrieden:

avrdude -p m328p -c usbasp -U flash:r:foo.dat:i
avrdude: AVR device initialized and ready to accept instructions

Reading |###################################| 100% 0.01s

avrdude: Device signature = 0x1e950f
avrdude: reading flash memory:

Reading |###################################| 100% 5.26s

avrdude: writing output file "foo.dat"
avrdude: safemode: Fuses OK
avrdude done.  Thank you.


Sehr gut! Und zuguterletzt sei noch erwähnt, dass man angeblich auch mit unmodifizierter USBasp Firmware arbeiten kann, wenn man ein paar Lötbrücken vom Board entfernt - ich fand die Firmware-Modifikation aber eleganter.

Einsatz mit AtmelStudio

Im Gegensatz zu avrdude unterstützt AtmelStudio den USBasp nicht. Das heißt aber nicht, das der Programmer nicht dennoch zum Einsatz kommen kann! Zwei Lösungsmöglichkeiten habe ich gefunden:
  1. Eine stk500 kompatible Firmware auf den Programmer flashen (z.B. die von Christian Ulrich).
  2. avrdude unter AtmelStudio als externen Programmer einbinden. Auf microcontroller.net hat user [eduardo] hat eine Anleitung dazu verfasst.

Fazit

Ein netter kleiner Programmieradapter, der nach obiger Firmware-Transplantation durchaus empfehlenswert ist.

Keine Kommentare:

Kommentar veröffentlichen