Microchip hat eine neue Generation von ATtinys auf den Markt gebracht. Lohnt es sich, sie für dein nächstes DIY-Projekt in Betracht zu ziehen?

Die kurze Antwort lautet: Ja, vorausgesetzt, du bist ein ATtiny-Liebhaber, brauchst mehr Speicher oder bessere Peripheriegeräte und bist ein bisschen abenteuerlustig. Die gute Nachricht ist, dass es im Arduino-Universum Unterstützung für diese Chips gibt.

Welcher MCU-Typ ist der richtige?

Wenn es um die Frage geht, welche MCU die richtige für Hobbyprojekte ist, hört man meistens, dass ESP32, RP2040 oder andere ARM MCUs die richtige Wahl sind. Und sie werden alle vom Arduino-Framework unterstützt! Manchmal hörst du auch, dass ein Raspberry Pi notwendig ist. Nun, das kommt ganz darauf an, was du erreichen willst.

Für die meisten meiner Projekte bevorzuge ich die AVR MCUs, da sie extrem energieeffizient sind. Ich habe Installationen (elektronische Geocaches) in der freien Natur, die mittlerweile 10 Jahre lang mit einer Batterie laufen. Diese MCUs haben einen Ruhestromverbrauch von etwa 100 nA (das sind 0,0001 mA!), aus dem sie innerhalb weniger Mikrosekunden wieder aufgeweckt werden können. ESP32- oder ARM-MCUs brauchen im Tiefschlaf wesentlich mehr Strom und können dann nur neu gebootet werden. Sie verbrauchen auch deutlich mehr Strom, wenn sie aktiv sind (20-100 mA statt 2-10 mA). Wenn du also keine Wi-Fi- oder Bluetooth-Konnektivität brauchst und dein Hauptziel darin besteht, so energieeffizient wie möglich zu sein, sind die AVR-Chips meiner Meinung nach die richtigen MCUs für dein Projekt. Mein Favorit für kleinere Projekte, wie den Sonnenuntergangs-Cache, ist der ATtiny1634, der 16 KB Flash-Speicher und 1 KB RAM hat.

Was ist bis jetzt passiert?

2016 brachte Microchip eine neue Familie von ATtiny-Chips mit einer leicht verbesserten AVR-Architektur auf den Markt, die jedoch einige Unterschiede in der Kommunikation mit den Chips aufweist. Im Jahr 2022 wurde der neueste Zuwachs dieser Familie vorgestellt, der ATtiny3224/6/7, den du bei der Planung deines nächsten Projekts auf jeden Fall in Betracht ziehen solltest.

Die SOIC-Version des ATtiny3226 kommt im gleichen Gehäuse wie die SOIC-Version des ATtiny1634, hat aber 32 KB Flash und 3 KB RAM (statt 16 KB/1 KB). Außerdem sind die enthaltenen Peripheriegeräte besser, die Ausführungsgeschwindigkeit einiger Befehle wurde verbessert, und ähnlich wie der ATmega328P verfügt er über Hardware-Multiplikation. Noch besser: Diese Chips sind billiger als der ATmega328P. Leider gibt es keine DIP-Versionen. Die SOIC-20-Gehäuse sind aber immer noch etwas, was ein Hobbybastler mit dem Lötkolben bewältigen kann. Sowohl der ATtiny3226 als auch der ATtiny3216 sehen auf jeden Fall interessant aus. Schauen wir sie uns also genauer an.

Aber nicht nur die Hardware ist wichtig. Die Chips müssen auch in das Arduino-Framework integriert werden. Spence Konde hat im Juni 2019 die erste Version des megaTinyCore für die neue Chipfamilie veröffentlicht, die die neuen Chips im Arduino-Framework verfügbar macht. Seitdem sind viele Verbesserungen vorgenommen worden.

Die neue Familie

Glücklicherweise hat der Zoo der verschiedenen Chips dieses Mal eine viel regelmäßigere Struktur als in der Vergangenheit. Die MCUs der neuen Familie, die tinyAVR 0/1/2 series oder megaTinyAVR genannt werden, haben ein Namensschema wie folgt. Nach dem Namen ATtiny folgt die Größe des Flash-Speichers in KB (2, 4, 8, 16, 32), dann folgt eine Ziffer für die Serie (0, 1 oder 2) und schließlich eine Ziffer für die Anzahl der Pins (2=8 Pins, 4=14 Pins, 6=20 Pins, 8=24 Pins). Der ATiny1614 hat zum Beispiel 16 KB Flash, ist ein ATtiny der Serie 1 und hat 14 Pins.

Nicht alle Kombinationen wurden implementiert, aber die meisten, die sinnvoll sind, sind jetzt auf dem Markt. Neben unterschiedlichen Speichergrößen und Pins haben sie auch unterschiedliche Arten von Peripheriegeräten. Aber auch hier ist die Art und Weise, wie die Peripheriegeräte den verschiedenen Typen zugewiesen werden, ziemlich regelmäßig. Einen guten Überblick über die verschiedenen MCU-Typen findest du im Blogbeitrag über die neue ATtiny-Familie von Technoblogy.

Was sind nun die Unterschiede zwischen den verschiedenen Serien? Die 1er-Serie kam zuerst 2016 auf den Markt. Danach wurde eine abgespeckte Version der 1er-Serie entwickelt: die 0er-Serie. Sie sind etwas billiger, haben aber nicht so viele Funktionen wie die 1er-Serie. Da der Preisunterschied vernachlässigbar ist, gibt es eigentlich keinen Grund, sie für dein Bastelprojekt in Betracht zu ziehen.

2021 brachte Microchip schließlich MCUs der 2er-Serie auf den Markt, die 2022 im ATtiny322X gipfelten. Interessanterweise handelt es sich dabei nicht um Upgrades der 1er-Serie. Es ist also sinnvoll, einen Blick auf die MCUs der 1- und 2-Serie zu werfen.

Inzwischen scheinen diese neuen Chips allgemein erhältlich zu sein. Ich habe sie bei DigiKey, RS-Online und auch bei Reichelt gefunden, wobei die Chips der 2er-Serie noch nicht im Reichelt-Katalog sind. Die Preise sind sehr günstig. Die neuen Chips sind sogar billiger als vergleichbare klassische AVR-Bauteile. Die kleineren Chips sind für 0,40 € bis 0,60 € erhältlich. Die größeren für bis zu 1,70 €. Da die Preise selbst für die größten Teile so niedrig sind, ist es wahrscheinlich sehr sinnvoll, sich auf sie zu konzentrieren.

Ein Punkt-für-Punkt-Vergleich des ATtiny32X6 mit dem ATtiny1634 und dem ATmega328P

Da der ATtiny1634 und der ATmega328P meine Lieblings-MCUs sind (und vor allem letzterer wahrscheinlich ein Allzeit-Favorit der meisten Arduino-Liebhaber ist), macht es Sinn, diese Chips Punkt für Punkt mit den High-End-Chips der 1- und 2-Serie der neuen ATtiny-Familie zu vergleichen. Ich habe mich für die 20-poligen MCUs entschieden, weil diese als SOIC-20 erhältlich sind, ähnlich wie der ATTiny1634. Die 24-Pin-MCUs dieser Serie sind nur als VQFN erhältlich, was man nicht von Hand löten kann.

Features/MCUATtiny3226ATtiny3216ATtiny1634ATmega328P
Flash32 KB32 KB16KB32 KB
RAM3 KB2 KB1 KB2 KB
EEPROM256 B256 B256 B1 kB
Pins/GPIOs20/1720/1720/1728/22 or 32/24
PackagesSOIC, SSOP, VQFNSOIC, VQFNSOIC, QFNDIP, TQFP, VQFN
Power-down @ 5V/3.3V0.1 µA/0.1 µA0.1 µA/0.1 µA0.1 µA/0.1 µA0.2 µA/0.1 µA
Active @ 5V16MHz/3.3V8MHz/3.3V1MHz7.5 mA/2.6 mA/0.3 mA8.0 mA/2.6 mA/0.3 mA-/2.3 mA/0.4 mA9.5 mA/3.0 mA/0.5 mA
Instruction setAVRxt (hardware multiplication, fast store)AVRxt (hardware multiplication, fast store)AVReAVRe+ (hardware multiplication)
Internal MHz max202088
External MHz max20201220
Accuracy internal osc.3.5 %5 %10 %10 %
Timer/Counter3x 16-bit, 1x 16-bit RTC3x 16-bit, 1x 12-bit, 1x 16-bit RTC1x 8-bit, 1x 16-bit2 x 8-bit, 1x 16-bit
ADCdifferential 12-bit with programmable gain (375 ksps)2x 10-bit (115 ksps)10-bit (15 ksps)10-bit (15 ksps)
DAC03x 8-bit (350 ksps)00
PTC0100
USART2 (one-wire, auto-baud)1 (one-wire, auto-baud)21
SPI111 (master-only)1
TWI1 (100, 400, 1000 kHz) 1 (100, 400, 1000 kHz)1 (slave-only, 100, 400 kHz)1 (100, 400 kHz)
CRC scan1100
CCL LUTs4200
Event channels6600
Interrupt levels2211
Programming interfaceUPDIUPDIHVPP, SPIHVPP, SPI
Debugging interfaceUPDIUPDIdebugWIREdebugWIRE

Speicher, Pins, Gehäuse und Stromverbrauch

Die neuen Chips haben offensichtlich genug Speicher für ernsthafte Projekte. Der ATtiny3226 ist offenbar auch der Sieger in der Kategorie RAM. Und auch die Anzahl der GPIOs sollte meist ausreichen. Das SOIC-20-Gehäuse der neuen ATtinys und des klassischen ATtiny1634 ist zwar nicht der bequeme DIP-Formfaktor, aber es lässt sich trotzdem leicht von Hand verlöten. In Bezug auf den Stromverbrauch scheint es kaum Veränderungen zu den klassischen Bauteilen zu geben.

Befehlssatz

Beim Befehlssatz fällt auf, dass dieser verbessert wurde. Es gibt jetzt eine Hardware-Multiplikation, und einige Befehle sind schneller geworden. Das sind alle Unterprogrammaufrufe(xCALL), alle indirekten Speicherbefehle(ST(D)), der PUSH-Befehl und die Befehle zum Setzen/Löschen von Bits in I/O-Registern(SBI/CBI). Interessanterweise ist eine Anweisung jetzt einen Taktzyklus langsamer. Der LDS-Befehl (Load Direct) benötigt jetzt drei statt zwei Zyklen. Diese Änderungen sind zwar nicht revolutionär, aber sie können helfen, wenn das Timing eng ist, wie z. B. bei Bit-Banging I/O. Trotzdem würde ich das nicht als starkes Argument für die Verwendung der modernen AVR-MCUs ansehen.

Taktung der MCU

Bei den klassischen AVR-Chips ist die maximale Taktfrequenz 20 MHz. Die modernen AVR-Chips haben jedoch interne Oszillatoren, die diese Frequenz liefern können (anstelle von 8 MHz). Außerdem sind diese internen Oszillatoren viel genauer als die in den klassischen Chips. Und mit dem passenden Vorteiler kannst du alle Frequenzen erhalten, die wichtig sind. Es besteht also keine Notwendigkeit, Quarzoszillatoren anzuschließen. Und es gibt tatsächlich auch keine Möglichkeit, das zu tun. Die einzige andere Möglichkeit ist, eine externe Oszillatoren zu verwenden. Ich bin der Meinung, dass diese hochgenauen internen Oszillatoren das Leben viel einfacher machen und die Verwendung externer Oszillatoren nur für Projekte notwendig ist, die sehr hohe Anforderungen an die Genauigkeit haben.

Zeitgeber

Es gibt mehr Timer/Zähler und sie haben eine höhere Auflösung als die, die von den klassischen AVR-Chips bekannt sind. Am bemerkenswertesten ist der dedizierte Echtzeitzähler (RTC), der von einem 32-kHz-Oszillator mit extrem niedrigem Stromverbrauch betrieben werden kann. Damit kann man die Zeitmessung fortsetzen, während sich die MCU im Standby-Modus befindet. Und man kann ihn auch zum regelmäßigen Aufwachen verwenden, wie es früher mit dem Watchdog-Timer-Interrupt gemacht wurde (den es bei den neueren Teilen nicht mehr gibt). Wenn sich die RTC im Standby-Modus befindet, werden nur 1 µA verbraucht, statt bis zu 5 µA mit dem WDT im Power-Down-Modus. Ob das ein Argument für den Einsatz der neuen AVRs ist, hängt natürlich von den Anforderungen der Anwendung ab.

ADCs, DACs und PTCs

Die Analog-Digital-Wandler (ADCs) haben sich generell stark verbessert. In der 1er-Serie hast du zwei separate 10-Bit-ADCs. Außerdem gibt es drei (!) 8-Bit-Digital-Analog-Wandler (DACs) und einen peripheren Touch-Controller (PTC). Die beiden letztgenannten Funktionen findest du normalerweise nur bei den größeren AVRxxxDy MCUs. Der PTC wird allerdings nur von der binären Microchip QTouch Bibliothek unterstützt, die noch nicht in das Arduino Framework integriert wurde.

Bei den MCUs der 2er-Serie hast du statt der ADCs, der DACs und des PTCs einen differentiellen 12-Bit-ADC mit programmierbarer Verstärkung! In beiden Fällen sind die ADCs um ein Vielfaches schneller als die ADCs in den klassischen AVRs!

Obwohl dies sehr beeindruckende Peripheriegeräte sind, habe ich normalerweise keine große Verwendung für sie.

Serielle Kommunikation

Die USART(s) auf den modernen AVRs, der ATtiny3226 hat zwei davon, haben viel mehr zu bieten als die auf den klassischen Chips. Sie können mit einem Baudratengenerator eine größere Anzahl verschiedener Bitraten verarbeiten, sie können für die Ein-Draht-Kommunikation verwendet werden, ähnlich wie die, die ich in der SingleWireSerial-Bibliothek implementiert habe, und sie verfügen über eine Auto-Baud-Funktion, die die Baudrate nach einem Synchronisationsbyte einstellt, das nach einer Pause empfangen wird.

Bei den übrigen seriellen Peripheriegeräten sind TWI und SPI mindestens genauso gut wie beim ATmega328 Chip. Tatsächlich wird jetzt 1 MHz TWI unterstützt, was vorher nicht der Fall war. Und sie schlagen den ATtiny1634, der nur TWI-Slave- und SPI-Master-Funktionen hat.

Speicherintegritätsprüfungen

Werfen wir nun einen Blick auf Funktionen, die es bei klassischen AVRs noch nicht gab. Erstens ist da der CRC-Scan. Bei jedem Reset kann man das CRC-Scan-Modul anweisen, den Flash-Speicher automatisch zu überprüfen und mit einem vorberechneten und gespeicherten CRC-Wert zu vergleichen. Das ist wahrscheinlich keine Funktion, die auf meiner Prioritätenliste ganz oben steht. Für Langzeitinstallationen ist sie jedoch sinnvoll, da umgefallene Bits (durch Strahlung oder andere Ursachen) im Flash-Speicher das Leben sehr schwer machen können und zu schwer zu diagnostizierenden Fehlern führen können.

Hardware-Rekonfiguration

Was sind nun die in der obigen Vergleichstabelle erwähnten CCL LUTs ? CCL steht für „configurable custom logic„. Die Idee dahinter ist, dass man kombinatorische Logikschaltungen konfigurieren kann. Die Eingänge solcher Schaltungen können von GPIOs, Peripheriegeräten und dem Ereignissystem stammen, über das wir gleich noch sprechen werden. Ausgänge können GPIOs oder das Ereignissystem sein, und die Ausgänge können sogar Interrupts auslösen (bei den Chips der 2er-Serie). Die einzelnen Schaltkreise, die 3 Eingänge haben können, werden mit Hilfe von Look-up-Tables (LUTs) spezifiziert, d. h. im Wesentlichen mit Wahrheitstabellen, die die boolesche Funktion angeben, die der Schaltkreis implementieren soll. Das bedeutet, dass CCL bei den zeitkritischsten Teilen eines Systems helfen kann und als Ersatz für diskrete Logikschaltungen angesehen werden kann.

Das Ereignissystem verbindet verschiedene Peripheriegeräte miteinander, ohne den Umweg über die CPU zu nehmen. So kann z. B. ein Überlaufereignis in einem Timer über einen Ereigniskanal mit dem ADC verbunden werden, um eine Umwandlung zu starten. Normalerweise wird dies über Interrupts realisiert, was ein paar Zyklen kostet. Mit dem Ereignissystem geschieht dies sofort.

In meinen bisherigen Projekten gab es nie direkte Verbindungen zwischen Peripheriegeräten, die vielleicht durch logische Schaltungen vermittelt werden. Das heißt aber natürlich nicht, dass das auch in Zukunft so bleiben wird.

Interrupts

Interrupts haben bei den klassischen AVRs nur eine Ebene. Wenn ein Interrupt bedient wird, kann ein anderer nur dann übernehmen, wenn die Interruptroutine des ersten Interrupts das Interruptbit wieder freigibt. Die Interrupts sind soweit priorisiert, dass, wenn viele verschiedene Interrupts anstehen, die Interrupt-Priorität entscheidet, welcher als Nächstes bearbeitet wird.

Bei den modernen AVRs sind die Dinge viel flexibler. Erstens gibt es einen nicht-maskierbaren Interrupt, den CRC-Scan-Fehler-Interrupt. Dieser wird ausgelöst, wenn er aktiviert ist, auch wenn die Interrupts global blockiert sind. Zweitens haben wir zwei Ebenen von Interrupts. Man kann einen IRQ als Level 1 deklarieren, der alle Level 0 Interrupt-Routinen unterbricht. Die Level 0 Interrupts haben immer noch Prioritäten. Sie können jedoch geändert werden. Außerdem kann man die Interrupts nach dem Round-Robin-Prinzip bedienen und so sicherstellen, dass jeder Interrupt irgendwann bedient wird.

Zwei Ebenen von Interrupts zu haben, kann das Leben manchmal viel einfacher machen. Ich hätte mir zum Beispiel so etwas gewünscht, als ich den DebugWIRE-Debugger dw-link implementiert habe, um die Kommunikation mit debugWIRE zu priorisieren.

Programmieren und Debuggen

Der Hauptunterschied zwischen den modernen und den klassischen AVR-Chips ist die Hardware-Schnittstelle zum Programmieren der Chips. Man braucht neue Hardware (und Software), um die eigentliche Hardwareprogrammierung durchzuführen. Das werden wir im nächsten Abschnitt besprechen.

UPDI: Einheitliche Programmier- und Debugging-Schnittstelle

Die klassischen AVR-Chips können alle über das ISP/SPI-Protokoll programmiert werden. Das Debugging erfolgt entweder über debugWIRE oder JTAG.

Bei den modernen AVR-Chips, ob Tiny oder Mega, hat sich das geändert. UPDI ist jetzt das Protokoll zum Programmieren und Debuggen. Dieses Protokoll verwendet nur eine (asynchrone serielle) Open-Drain, halb-duplex, bidirektionale UART-Leitung mit der Auto-Baud-Funktion. Mit anderen Worten: Zum Programmieren und Debuggen wird nur eine Leitung zusätzlich zu GND verwendet! Das SWD-Protokoll für ARM MCUs verwendet zwei zusätzliche Leitungen, eine Datenleitung und eine Taktleitung. Das JTAG-Protokoll benötigt sogar noch mehr Leitungen.

Das Konzept von UPDI scheint sehr schlank und sauber zu sein. Allerdings musst du ein neues Programmiergerät finden oder bauen. Natürlich könnte man die Microchip-Programmierer/Debugger wie Atmel ICE oder Snap verwenden. Aber die sind ziemlich teuer. Stattdessen ist die SerialUPDI-Lösung wahrscheinlich die billigste und einfachste Lösung. Du nimmst einfach einen USB-UART-Konverter und verbindest die RX- und TX-Leitung mithilfe eines Widerstands und/oder einer Diode. Spence Konde behandelt die Möglichkeiten in seinem SerialUPDI-Leitfaden.

In diesem Leitfaden erfährst du auch, dass FT232-Konverter nicht ideal sind, weil sie standardmäßig eine hohe Latenzzeit haben, wenn sie die E/A-Richtung ändern. Das kann unter Windows und Linux umkonfiguriert werden, aber nicht unter macOS. CH340- und CP2102-Chips sind eine viel bessere Wahl. PL2303 und HT42B435 sind Chips, die du auf jeden Fall vermeiden solltest. Wenn du 3,3-V- und 5-V-Systeme programmieren willst, solltest du ein Board wählen, bei dem du die Versorgungsspannung ändern kannst. Achte außerdem darauf, dass die Signalspannung nicht auf 3,3 V festgelegt ist, wie es bei einigen Konvertern der Fall ist. Bei den älteren AVRs funktioniert das, aber die neue Generation benötigt 0,7 Vcc als Mindestspannung, um einen hohen Pegel zu erkennen, was bei einem 5-V-System 3,5 V entspricht.

Verwendung eines CP2102 USB-UART-Konverters

Die ersten Versuche mit einem CP2102-Board haben perfekt funktioniert, wie oben gezeigt. Unter macOS musste ich SerialUPDI ... w/write delay auswählen. Aber sonst hat es gut funktioniert, nicht nur mit dem Blink-Sketch, sondern auch mit größeren Sketchen. Mit einem CH340-Wandler funktionierte es auch, aber ich musste den 470-Ω-Widerstand entfernen.

Wenn du keinen USB-UART-Konverter herumliegen hast, aber einen Arduino Nano oder UNO, den du nicht mehr brauchst, dann kannst du den Konverter auf dem Board verwenden. Verbinde einfach GND und RESET auf dem Board, wodurch alle ATmega328P-Pins hochohmig werden, und benutze dann die TX- und RX-Pins. Diese sind im Vergleich zu normalen seriellen Konvertern falsch herum benannt, weil die Pins aus der Perspektive des ATmega-Chips beschriftet sind. Das funktioniert allerdings nur bei 5-V-Systemen.

Ein Nano-Board als USB-UART-Brücke missbrauchen

Ich habe das mit den Nano-Boards, die ich habe, ausprobiert. Obwohl der ursprüngliche Arduino Nano, den du auf dem Foto siehst, einen FTDI 232RL verwendet, funktionierte er ohne Probleme. Er war vielleicht ein bisschen langsamer. Ein Klon, der einen CH340 verwendete, funktionierte dagegen nicht. Ich habe keine Ahnung, warum.

Zusammenfassend lässt sich sagen, dass SerialUPDI zu funktionieren scheint. Vielleicht ist ein bisschen Experimentieren nötig, um die beste Konfiguration zu finden.

Fazit und Ausblick

Die neue Familie der megaTinys sieht ziemlich vielversprechend aus. Und dank Spence Kondes megaTinyCore und SerialUPDI ist sie auch leicht zu programmieren. Ich werde sie also auf jeden Fall für eines meiner nächsten Projekte verwenden.

Da es keine Open-Source-Debugging-Lösung gibt, werde ich mich in naher Zukunft auch damit befassen. Mit anderen Worten: Ich plane, einen gdbserver für die megaTinys zu schreiben, entweder als Python-Skript oder als Arduino-Sketch für z.B. den Nano Every.

Views: 338