Über den Beitrag
Vor einiger Zeit hatte ich über die Programmierung von ATtiny MCUs mithilfe des Paketes ATTinyCore berichtet (Link zum Beitrag). ATtinyCore deckt aber nur einen Teil der ATtiny Familie ab. Es fehlen die Vertreter der tinyAVR®-Serien 0, 1 und 2, die Microchip in den letzten Jahren den Markt gebracht hat. Sie unterscheiden sich in einigen Aspekten grundsätzlich von den anderen Vertretern der ATtiny-Familie. Diese neueren ATtinys könnt ihr mithilfe des Paketes megaTinyCore von Spence Konde mit Arduino Code programmieren.
Der wohl größte Unterschied im Umgang mit diesen neueren Mikrocontrollern ist die Programmierung per UPDI (Unified Program and Debug Interface). Dabei handelt es sich um ein proprietäres Programmier- und Debug-Interface von Microchip, welches nur eine einzige Leitung benötigt. Ich stelle verschiedene Optionen für den Programmupload per UPDI mit der Arduino IDE vor. Das erwartet euch:
- Die megaTinyCore Familie
- Vorbereitungen
- Sketche hochladen mit megaTinyCore – 3 Optionen
- Sketche hochladen per Optiboot Bootloader
- Serial Monitor nutzen ohne Optiboot
- Ausblick
Die megaTinyCore Familie
Die megaTinyCore Familie ist ziemlich groß. Hier zunächst eine Übersicht mit einigen ausgewählten Merkmalen:
Die Bezeichnung der ATtinys verrät ein paar ihrer Eigenschaften:
- Anhand der ersten oder den ersten beiden Ziffern könnt ihr die Größe des Programmspeichers in Kilobyte ablesen.
- Die vorletzte Ziffer gibt die tinyAVR Serie an.
- Wie viele Pins der ATtiny hat, könnt ihr an der letzten Ziffer erkennen:
- ATtinyxx7: 24 Pins
- ATtinyxx6: 20 Pins
- ATtinyxx4: 14 Pins
- ATtinyxx2: 8 Pins
In der Dokumentation von megaTinyCore auf GitHub findet ihr zu den Serien und Untergruppen detailliertere Informationen inklusive der Pinout Schemata.
Gegenstand dieses Beitrages ist aber vor allem die Programmierung mithilfe von megaTinyCore und weniger die technischen Daten.
Vorbereitungen
Erwerb der Mikrocontroller
Die Verfügbarkeit der Vertreter der tinyAVR-Serien 0, 1 und 2 ist derzeit eingeschränkt. Zum Teil gibt es lange Lieferzeiten. Ich bin vor allem auf eBay fündig geworden. Für meinen Beitrag habe ich den ATtiny1614, ATtiny1626 und ATtiny3226 ausprobiert. Nicht, weil ich diese drei besonders attraktiv finde, sondern weil es die sind, die ich zu einem vernünftigem Preis bekommen konnte.
Die tinyAVRs der Serien 0, 1 und 2 sind nicht in PDIP Bauform erhältlich, d.h. ihr könnt sie nicht direkt in ein Breadboard stecken. Dafür gibt es aber Adapterplatinen. Im Netz findet ihr viele Anleitungen, wie ihr SOIC (1.27 mm Pinabstand) oder SSOP Bauteile (0.65 mm Pinabstand) auflötet.
Ohne diese Feinarbeiten geht es, wenn ihr Development Boards im Tindie Shop kauft, hier zum Beispiel die ATtiny3224/1614/1604 Versionen. Allerdings sitzt der Shop in den USA. Entsprechend hoch sind die Versandkosten von ca. 16 US$. Woanders habe ich solche Boards noch nicht gesehen, das wird sich aber bestimmt noch ändern.
Vorbereitung der Arduino IDE für megaTinyCore
Zunächst müsst ihr megaTinyCore in der Arduino IDE implementieren. Dazu geht ihr auf Datei → Voreinstellungen. Klickt auf das Symbol hinter „Zusätzliche Boardverwalter-URLs“ und tragt dort „http://drazzy.com/package_drazzy.com_index.json“ in eine separate Zeile ein:
Schließt die Fenster durch Klick auf „OK“.
Nun navigiert ihr zu Werkzeuge → Board → Boardverwalter. Sucht nach dem Paket megaTinyCore von Spence Konde und installiert es:
Wenn alles geklappt hat, dann findet ihr jetzt eine große Auswahl an ATtinys in eurer Arduino IDE:
Sketche hochladen mit megaTinyCore – 3 Optionen
Die Programmierung per UPDI erfordert geeignete Programmer. Leider gibt es bisher noch keine große Auswahl für Modelle „von der Stange“. Die gute Nachricht ist aber, dass ihr euch mit günstigen Bauteilen behelfen könnt.
Option 1: Der Arduino als UPDI Programmer
Den Arduino vorbereiten
Als Erstes machen wir aus einem Arduino UNO oder Arduino Nano einen UPDI Programmer. Es geht wohl auch mit anderen Arduino Boards, das habe ich aber nicht probiert. Die folgenden Schritte sind auszuführen:
- Holt euch jtag2udpi hier von GitHub. Dazu folgt ihr dem Link, klickt auf den grünen Button „Code“ und dann auf „Download ZIP“.
- Speichert die ZIP Datei irgendwo auf eurem Rechner und entpackt sie.
- In dem Ordner jtag2updi-master findet ihr den Unterordner source, den ihr in jtag2updi umbennent.
- Verschiebt den Ordner jtag2updi in euren Arduino Sketch Ordner. Die zip Datei und den Ordner jtag2updi-master könnt ihr jetzt löschen.
- Öffnet jtag2updi.ino aus dem Ordner jtag2updi in der Arduino IDE. Der Sketch selbst ist leer (s.u.), aber die relevanten Dateien befinden sich in demselben Ordner und werden automatisch verarbeitet.
- Ladet den Sketch auf euren Arduino. Dabei müsst ihr als Board natürlich den Arduino eurer Wahl einstellen.
Damit ist euer Arduino als UPDI Programmer einsatzbereit.
Verdrahtung
Der Anschluss eures ATtiny an den frisch gebackenen UPDI Programmer ist einfach. GND kommt an GND, VCC an VCC. Zwischen GND und Reset des Arduinos setzt ihr einen 10 µF Kondensator. Den Arduino Pin 6 verbindet ihr über einen 470 Ω Widerstand mit dem UPDI Pin des ATtiny. Bei jtag2updi auf GitHub wird ein 4.7 kΩ Widerstand angegeben. Das funktionierte bei mir auch.
Beim hier verwendeten ATtiny1614 ist der UPDI Pin der Pin 10. Welcher der UPDI Pin eures ATtiny ist, steht im Datenblatt oder ihr schaut einfach in die Pinout Schemata auf GitHub. Folgt dazu diesem Link und klickt auf die Gruppe mit eurem ATtiny.
Für Bequeme: Hier habe ich eine nette Idee gefunden, wie ihr den Arduino Nano zu einem ready-to-use UPDI Programmer umbaut.
Hochladen
Wählt in der Arduino IDE den ATtiny unter Werkzeuge → Board → megaTinyCore aus. Es gibt jeweils eine Version mit und eine ohne Optiboot Bootloader. Nehmt die ohne Optiboot. Wenn Ihr wisst, was ihr tut, könnt ihr noch allerlei Feineinstellungen vornehmen. Falls nicht, dann nehmt die Voreinstellungen.
Als Programmer stellt ihr jtag2updi ein. Jetzt könnt ihr Sketche auf euren ATtiny laden. Zum Ausprobieren nehme ich für gewöhnlich einen Blinksketch.
Option 2: USB-zu-TTL Adapter als UPDI Programmer
Die zweite Option, die ich vorstellen möchte, nutzt einen USB-zu-TTL Adapter als UPDI Programmer. So ein Teil bekommt ihr für wenige Euro in Online-Shops wie Amazon oder AliExpress. Die meisten dieser Adapter haben einen FTDI FT232 oder einen CH340 Chip. Spence Konde empfiehlt die Modelle mit dem CH340 Chip. Schaut hier, wenn ihr mehr darüber wissen wollt. Ich habe die nicht empfohlene Version mit FT232 Chip probiert und sie funktionierte auch auf Anhieb völlig problemlos. Zudem konnte ich die von Spence Konde beschriebenen Geschwindigkeitsprobleme bei mir nicht nachvollziehen.
Falls ihr den Optiboot Bootloader nutzen wollt (weiter unten), dann empfehle ich einen USB-zu-TTL Adapter mit DTR Pin.
Die Verkabelung ist auch nicht besonders kompliziert. Ihr braucht lediglich eine Diode und einen 470 Ω Widerstand. Zu der Diode habe ich unterschiedliche Angaben gefunden. Zum Teil kamen Schottky-Dioden zur Anwendung, zum Teil aber auch „normale“ Dioden.
Es muss also nicht unbedingt die hier abgebildete Diode 1N4148 sein. Bei mir funktionierte es auch mit der für diesen Zweck überdimensionierten Schottky-Diode SB360. Alternativ zur Diode könnt ihr einen Widerstand nehmen. Bei mir hat es mit 4.7 kΩ geklappt. Aber auch da gibt es, abhängig von dem von euch verwendeten Adapter, unter Umständen ein paar Stolperfallen. Ich empfehle: Probiert erst einmal aus und wenn es Probleme gibt, schaut hier, was Spence Konde dazu schreibt.
Als Programmer wählt ihr eine der SerialUPDI Optionen. Testet, welche Geschwindigkeit (Baudrate) bei euch funktioniert.
Auf GitHub findet ihr hier einen Bauplan für einen schicken, kleinen UPDI Programmer. Einen kommerziell erhältlichen SerialUPDI-Programmer habe ich bisher hier gefunden.
Option 3: Atmel-ICE als UPDI Programmer
Die mit Abstand einfachste, aber auch teuerste Variante ist die Programmierung mit dem ATATMEL-ICE (kurz: Atmel-ICE). Dafür legt ihr, je nach Ausstattung, 100 bis 200 Euro auf den Tisch. Dafür bekommt ihr aber einen guten Programmer, der neben UPDI auch JTAG, ISP, debugWIRE und einiges mehr beherrscht.
Wenn ihr den Atmel-ICE als UPDI Programmer einsetzt, dann bleiben drei seiner Anschlusspins ungenutzt. Der UPDI-Pin ist da, wo normalerweise der MISO-Pin zugeordnet ist.
Verbindet VCC mit VCC, GND mit GND und UPDI mit UPDI. VCC des Atmel-ICE liefert allerdings keine Versorgungsspannung, sondern dient lediglich der Prüfung, ob der Spannungslevel ausreichend ist. Ihr braucht also noch eine separate Spannungsquelle.
Dann wählt den Atmel-ICE als Programmer und ladet eure Sketche hoch. Einfacher geht es wirklich nicht.
Update 12/23: weitere UPDI Programmer erhältlich
Langsam scheint es mehr UPDI Programmer zu geben. Ich habe mir den EXA-PROG der Firma Diamex zugelegt und er funktioniert wunderbar. Neben UPDI beherrscht er noch eine Reihe Programmiermethoden. Stand 12/23 ist er für ca. 30 Euro zu haben.
Einen weiteren Programmer, den microUPDProgrammer von MCUdude, habe ich hier im Tindie-Shop gefunden. Er ist noch günstiger, kann aber nur UPDI.
Sketche hochladen per Optiboot Bootloader
Alternativ zu UPDI könnt ihr eure Sketche per Optiboot Bootloader über RX/TX auf die megaTinyCore Mikrocontroller hochladen. Dazu verwendet ihr wieder einen USB-zu-Seriell Adapter. Der Vorteil ist, dass der Adapter sowohl als Programmiergerät, als auch als Verbindung zum seriellen Monitor dienen kann. Nachteilig an der Methode ist der Platzbedarf des Bootloaders (ca. 500 Bytes) und ggf. eine Verzögerung beim Bootvorgang (s.u.).
Zuvor müsst ihr aber den Optiboot Bootloader (einmalig) per UPDI brennen. Um diesen Schritt kommt ihr nicht herum. Dazu wählt ihr unter Werkzeuge → Board den gewünschten ATtiny mit dem Zusatz „w/Optiboot“ und den UPDI Programmer. Wenn euer ATtiny mehrere UART-Schnittstellen besitzt, dann könnt ihr einstellen, welche davon Optiboot nutzen soll.
Optiboot ohne Reset Pin – für alle tinyAVR Serien
So könnte die Einstellung für einen ATtiny1614 aussehen:
Nachdem ihr den Bootloader gebrannt habt, entfernt ihr jetzt den UPDI-Programmer und schließt den USB-zu-Seriell Adapter an. Dazu verbindet ihr RX des Adapters mit TX des ATtiny und TX des Adapters mit RX des ATtiny. Auf GitHub finden sich die Pinout Schemata als Teil der megaTinyCore Bibliothek, falls ihr euch bezüglich der Pins nicht sicher seid.
Stellt den Port für den Adapter ein und ladet den ersten Sketch hoch. Wenn ihr danach einen weiteren Sketch hochladen wollt, dann dürft ihr den ATtiny erst acht Sekunden vor dem Hochladen mit Strom versorgen. Solange wartet der ATtiny während seines Bootvorganges auf hochzuladende Sketche. Leider müsst ihr dieselbe Zeit warten, bis eure Sketche starten.
Wenn euch die acht Sekunden nerven, dann könnt die Zeit auch auf eine Sekunde begrenzen. Diese Einstellung ist beim Brennen des Bootloaders zu wählen:
Bei einer Sekunde Wartezeit ist es allerdings eine gewisse Herausforderung, den ATtiny im richtigen Moment mit Strom zu versorgen.
Vorsicht: Die anderen beiden Einstellungsoptionen deaktivieren UPDI. D.h. ihr könnt keine Einstellungen mehr ändern, für die ihr den Bootloader brennen müsst. Nur mit einem High-Voltage UPDI-Programmer ließe sich das rückgängig machen.
Optiboot mit Reset Pin – nur für tinyAVR 2-Serie
Bei den Vertretern der tinyAVR 2-Serie ist es möglich, einen alternativen Resetpin einzurichten und die UDPI Funktionalität zu erhalten. Damit lässt sich die Programmierung bequem über den DTR Pin des USB-zu-Seriell Adapters steuern. Ich zeige das am Beispiel des ATtiny1626. Beachtet aber, dass nicht jeder USB-zu-Seriell Adapter einen solchen DTR Pin hat.
In der Arduino IDE wählt ihr unter Werkzeuge → Boards euren ATtiny aus. Nehmt wieder die Variante mit Optiboot. Dann stellt den UPDI Programmer eurer Wahl ein. Unter Werkzeuge findet ihr den Menüpunkt „UPDI/alt-RST pins and Optiboot Entry (…)“. Dort wählt ihr den folgenden, markierten Eintrag (Beispiel ATtiny 1626):
Brennt jetzt den Bootloader mit eurem UPDI Programmer. Der UPDI Pin des ATtiny1626 ist der Pin Nummer 16 (GPIO17 / PA0).
Dann verbindet ihr euren USB-zu-Seriell Adapter mit dem ATtiny. Für den ATtiny1626 sieht die Schaltung folgendermaßen aus:
Für andere ATtinys schaut ihr in das Pinout Schema um den richtigen RST, TX und RX Pin zu finden.
Wählt den Port des Adapters aus und schon könnt ihr Sketche ohne Umstöpseln oder Ähnliches hochladen.
Serial Monitor mit megaTinyCore nutzen ohne Optiboot
Nun wollt ihr nicht unbedingt die ca. 500 Bytes Flash-Speicher für den Bootloader „verbraten“ und trotzdem den seriellen Monitor benutzen. Das ist kein Problem. Dazu schließt ihr euren Programmer und den USB-zu-Seriell Adapter an den ATtiny an. Vom Adapter müsst ihr lediglich RX, TX und GND verbinden. Den VCC des Adapters schließt ihr an, falls ihr ihn als Spannungsversorgung nutzen wollt.
Wenn ihr den Arduino oder einen USB-zu-Seriell Adapter als UPDI Programmer verwendet und diese mit einem USB-zu-Seriell Adapter für die serielle Verbindung kombiniert, dann tauchen zwei auswählbare Ports unter Werkzeuge → Port auf. Beim Hochladen müsst ihr den Programmer Port aktivieren und zum Nutzen des seriellen Monitors auf den anderen Port umschalten. Bei Verwendung eines ATMEL-ICE gibt es das Problem nicht, da er nicht als serieller Port auftaucht.
Ausblick
In diesem Beitrag bin ich lediglich auf die Möglichkeiten des Programmuploads mit megaTinyCore eingegangen. Die technischen Daten und Eigenschaften der tinyAVRs habe ich nur am Rande behandelt. In einem zukünftigen Beitrag werde ich ein, zwei Vertreter heraussuchen und diesbezüglich tiefer einsteigen.
Danksagung
Erst durch das Paket megaTinyCore ist es möglich, die tinyAVRs der Serien 0, 1 und 2 bequem mit der Arduino IDE zu programmieren. Spence Konde hat hier großartige Arbeit geleistet, auch hinsichtlich der Dokumentation. Vielen Dank!
Der Link bei „Für Bequeme: Hier habe ich eine nette Idee gefunden, wie ihr den Arduino Nano zu einem ready-to-use UPDI Programmer umbaut.“ funktioniert nicht. Aber bei hackster gibt’s den Beitrag:
https://www.hackster.io/john-bradnam/create-your-own-updi-programmer-1e55f1
Hallo Wolfgang,
danke für deine Seite hier, und auch die anderen die mir schon eine Hilfe waren.
Eine Ergänzung zu den USB-TTL Wandlern: habe erfolgreich eine CH340N (8pol) in Betrieb, allerdings muss wie bei DrKonde erwähnt zumindest die LED auf der RX-Leitung entfernt werden, die TX-LED kann bleiben. Ob ich damit Geschwindigkeitsrekorde erzielen kann, habe ich bisher nicht probiert, für meine Sketches reichen die 230400 Baud aber allemal.
vg,
Dieter
Als Programmiergerät könnte auch dieses hier interessant sein:
https://www.reichelt.de/universal-isp-programer-avr-stm32-esp-lpc-diamex-exa-prog-p305203.html?utm_source=psuma&utm_medium=geizhals.de&PROVID=2
Vielen Dank. Sieht nach einer interessanten Alternative zum bezahlbaren Preis aus. Das werde ich mal probieren. Bestellung läuft.
VG, Wolfgang
Hallo
ich bekomme bei der Url folgende Meldung
Some indexes could not be updated.
weisst du einen Rat ?
Hi, wie es scheint, möchte der Autor des Board Paketes von http auf https umsteigen bzw. muss das tun. Und das scheint Probleme zu machen. Vielleicht hängt die Meldung damit zusammen. Ich würde es ein paar Tage beobachten. Dann besteht die Möglichkeit, das direkt auf GitHub als Issue zu melden.
VG, Wolfgang
https://github.com/SpenceKonde/ATTinyCore/issues/803
Vielen Dank für diese klasse Einführung in dieses Thema! Das Programmieren mit dem FTDI FT232 hat bei mir mit den angegebenen Werten sofort geklappt. Noch nicht mal mit der Boudrate mußte ich großartig experimentieren. Habe mir einen Kleinen Adapter (Lochrasterplatine) auf dem der FTDI, die Bauteile und drei Reihen Pfostenbuchsen platz finden. Klasse ist auch das das Pinout des Programmierpins, VCC, und GND von 1614/26 und 3224/26 gleich ist. Das erleichtert einiges 🙂
Ein schönes Osterwochenende noch…
Vielen Dank für die Rückmeldung. Schön, dass alles funktioniert. Dir auch noch ein schönes Osterwochenende!
Hi. Beim nutzen von „Der Arduino als UPDI Programmer“ benutzt du einen 4,7k Ohm Widerstand. Wo hast du den Wert her? Spence Konde selber nutzt einen 470 Ohm Widerstand.
https://github.com/SpenceKonde/AVR-Guidance/blob/master/UPDI/NanoUPDI_Recommended.png
Und Danke für deine Ausarbeitung 🙂
Hi Andre,
ich habe es den Angaben jtag2updi Bibliothek auf GitHub entnommen:
https://github.com/ElTangas/jtag2updi
Und es hat x Male zuverlässig funktioniert. Allerdings muss ich sagen, dass ich Spence Konde sehr vertraue. Deswegen werde ich die 470 Ohm übernehmen. Vielen Dank!
VG, Wolfgang
Die Diode 1N4148 ist keine Schottky-Diode, sondern eine ganz normale.
Danke für die informative Seite.
Jetzt laufen bei mir die Winzlinge trotz einiger Fallstricke auch.
Bei mir gehen die letzten megaTinyCore Versionen nicht.
Versuch mit 1.x und 2.6.1 führten über den Uno zum Erfolg. (A IDE 1.8.13 oder 1.8.18)
Nächstes Problem war Umstellung auf SerialUPDI.
Beim meinem CH340 USB TTL Programmer (6 Pin mit int. 1k5 Widerständen) war der TX LOW Pegel zu hoch. Oszi half. Veränderung des ext. Widerstandes brachte nur ein halbes Ergebnis mit endlich mal irgendwo falscher Antwort vom Tiny. Auch die Schottky Diode half nicht. Habe dann die Diode durch PNP mit C an GND, B an TX, ersetzt und es liefen alle SerialUPDI Einstellungen auf Anhieb.
L Pegel war nun OK. ( 470 ohm an E )
Den Programmer selbst wollte ich nicht verändern (interne R) daher kam diese Modifikation ans steckbare Kabel.
SG
hopfen
Danke für die Hinweise!
Danke fütr diesen aufschhlußreichen Bericht
Ich bedanke mich und wünsche ein schönes langes WE;)
Danke – ebenso!