megaTinyCore nutzen

Ü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

Die megaTinyCore Familie ist ziemlich groß. Hier zunächst eine Übersicht mit einigen ausgewählten Merkmalen:

megaTinyCore kompatible tinyAVR Serien 0, 1 und 2
megaTinyCore kompatible tinyAVR Serien 0, 1 und 2

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.

Beispiele megaTinyCore kompatibler Mikrocontroller: ATtiny3226, ATtiny1626 und ATtiny1614
Beispiele megaTinyCore kompatibler Mikrocontroller: ATtiny3226, ATtiny1626 und ATtiny1614

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:

Boardverwalter-URL für megaTinyCore einrichten
Boardverwalter-URL für megaTinyCore einrichten

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:

Installation des megaTinyCore Paketes
Installation des megaTinyCore Paketes

Wenn alles geklappt hat, dann findet ihr jetzt eine große Auswahl an ATtinys in eurer Arduino IDE:

Große megaTinyCore Auswahl
Große megaTinyCore Auswahl

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:

  1. Holt euch jtag2udpi hier von GitHub. Dazu folgt ihr dem Link, klickt auf den grünen Button „Code“ und dann auf „Download ZIP“.
  2. Speichert die ZIP Datei irgendwo auf eurem Rechner und entpackt sie.
  3. In dem Ordner jtag2updi-master findet ihr den Unterordner source, den ihr in jtag2updi umbennent.
  4. Verschiebt den Ordner jtag2updi in euren Arduino Sketch Ordner. Die zip Datei und den Ordner jtag2updi-master könnt ihr jetzt löschen.
  5. Ö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.
  6. Ladet den Sketch auf euren Arduino. Dabei müsst ihr als Board natürlich den Arduino eurer Wahl einstellen.
Leerer jtag2updi sketch
Leerer jtag2updi sketch

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.

Arduino Nano als UPDI Programmer
Arduino Nano als UPDI Programmer

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.

USB-zu-TTL FTDI Adapter als UPDI-Programmer
USB-zu-TTL FTDI Adapter als UPDI-Programmer

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.

Atmel-ICE Programmer
Belegung der ISP-Buchse für die UPDI-Programmierung

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.

Diamex EXA-PROG Programmer
Diamex EXA-PROG Programmer

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:

Beispiel: ATtiny1614 mit Optiboot Bootloader
Beispiel: ATtiny1614 mit Optiboot Bootloader

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.

Programmupload per Optiboot - Beispiel ATtiny1614
Programmupload per Optiboot – Beispiel ATtiny1614

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:

Optiboot Option mit einer Sekunde Wartezeit
Optiboot Option mit einer Sekunde Wartezeit

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):

Einstellung Optiboot mit Reset auf PB4, 1 Sekunde Wartezeit
Einstellung Optiboot mit Reset auf PB4, 1 Sekunde Wartezeit

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:

Programmupload per Optiboot und DTR - Beispiel ATtiny1626
Programmupload per Optiboot und DTR – Beispiel ATtiny1626

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!

14 thoughts on “megaTinyCore nutzen

    1. Vielen Dank. Sieht nach einer interessanten Alternative zum bezahlbaren Preis aus. Das werde ich mal probieren. Bestellung läuft.

      VG, Wolfgang

  1. Hallo
    ich bekomme bei der Url folgende Meldung

    Some indexes could not be updated.

    weisst du einen Rat ?

    1. 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

  2. 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…

    1. Vielen Dank für die Rückmeldung. Schön, dass alles funktioniert. Dir auch noch ein schönes Osterwochenende!

    1. 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

  3. 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

Schreibe einen Kommentar

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