
Sind Sie ein 8-Bit- oder 32-Bit-Programmierer? Wir bei OMZLO haben uns auf die neuen 32-Bit-ARM-Cortex-Chips (STM32 und SAMD) konzentriert, die normalerweise mehr RAM und eine bessere Leistung bieten als ältere 8-Bit-Mikrocontroller-Einheiten (MCUs). Unterstützung für mehr Peripheriegeräte. Und das alles - zum gleichen oder zu einem günstigeren Preis. 8-Bit-MCUs haben ihre Relevanz jedoch noch nicht verloren. Insbesondere hat Microchip eine neue Serie von Chips herausgebracht, die "tinyAVR 0-Serie", die im Vergleich zu früher veröffentlichten AVR-Chips die Arbeit mit moderneren Peripheriegeräten ermöglicht. Gleichzeitig zeichnen sich die neuen Chips durch einen sehr attraktiven Preis aus. Es scheint, dass diese Chips perfekt für die Entwicklung einfacher Geräte geeignet sind, die diese Funktionen nicht benötigenWas bieten neuere 32-Bit-MCUs? Darüber hinaus sind 8-Bit-Mikrocontroller viel einfacher zu programmieren, was zu einer höheren Entwicklungsgeschwindigkeit des Softwareteils von Geräten führt, die auf ihrer Basis erstellt wurden.
Dank des Erfolgs der Arduino UNO gibt es im Internet viele Tutorials, in denen die Programmierfunktionen der 8-Bit-ATmega328-Mikrocontroller und ihrer Gegenstücke wie der ATtiny85 erläutert werden. Wir sprechen über den direkten Zugriff auf Register ohne Verwendung der für Arduino verwendeten Programmiersprache und ohne Verwendung von IDEs, die von Chipherstellern wie Atmel Studio erstellt wurden. Um dies zu überprüfen, suchen Sie einfach bei Google nach "atmega328 blinky". Zum Programmieren von Mikrocontrollern benötigen Sie nur einen C-Compiler für AVR, einen Texteditor, avrdude und einen AVR-Programmierer. Auf einigen RessourcenEs gibt sogar Anleitungen, wie Sie den ATmega328 mit universellen Steckbrettern zum Laufen bringen können. Wenn wir über die neueren winzigen Chips der AVR 0-Serie sprechen, ist es nicht einfach, Informationen dieser Art darüber zu finden.
Natürlich bietet Microchip alle Tools, die Sie zum Programmieren des neuen tinyAVR in einer exklusiv für Windows entwickelten IDE benötigen. Für einige der neueren Chips gibt es "Arduino-Kerne". Dank dessen können solche Chips mit der Arduino IDE programmiert werden. Wenn man jedoch lieber Mikrocontroller-Code in einem "Low-Level" -Stil mit seinem bevorzugten Texteditor
Makefileund C-Compiler schreibt , findet man nur sehr wenige Informationen über diesen Ansatz für die Arbeit mit tinyAVR.
In diesem Artikel erfahren Sie, wie Sie mit den einfachsten Tools von Grund auf eine blinkende Firmware erstellenfür ATtiny406. Das meiste, was besprochen wird, gilt auch für andere winzige AVR-MCUs. Dieses Tutorial ist für Benutzer von MacOS und Linux gedacht. Mit geringfügigen Änderungen ist unser Rat jedoch auch für Benutzer von Windows hilfreich.
Hardware-Teil des Projekts
▍Forschung ATtiny406
Wir haben uns entschlossen, mit dem ATtiny406 zu experimentieren , in der Hoffnung, dass dieser Mikrocontroller in Zukunft den ATtiny45 ersetzen wird, der derzeit in PiWatcher verwendet wird - in unserer Entwicklung, die es ermöglicht, den Raspberry Pi bei Bedarf vollständig auszuschalten oder neu zu starten. Der ATtiny406 verfügt über 4 KB Flash-Speicher, 256 Byte RAM, der Mikrochip kann ohne externe Taktquelle mit 20 MHz betrieben werden.
Einer der Hauptunterschiede zwischen den neuen tinyAVR-MCUs und älteren, bekannten Chips wie dem ATtiny85 besteht darin, dass die neueren Chips das UPDI-Programmierprotokoll verwenden. Es werden nur 3 Pins benötigt, um zu funktionieren, und 6 Pins werden für das ISP-Protokoll benötigt, das von alten Chips verwendet wird.
Nach einer kurzen Untersuchung der Frage haben wir erfahren, dass Sie tinyAVR mit UPDI mithilfe eines einfachen USB-zu-Seriell-Kabels und eines Widerstands programmieren können. Wir haben dies dank des pyupdi Python-Tools herausgefunden , das den folgenden Schaltplan zum Hochladen der Firmware auf einen Mikrocontroller vorschlug.

Anschlussplan des Mikrocontrollers
▍Board Design für ATtiny406
Für den ATtiny406 haben wir ein minimalistisches Breakout-Board erstellt. Diese Karte kann mit 5 V über USB betrieben werden. Alternativ können Sie mit den dedizierten VCC / GND-Pins eine niedrigere Spannung von 3,3 V anlegen. Auf der Platine ist Platz für einen Knopf und eine LED. Um Experimente durchzuführen, haben wir beschlossen, einen 4,7-kOhm-Widerstand in die Platine einzubauen, der für die Verwendung des UPDI-Protokolls erforderlich ist (dies ist der Widerstand R2). Als Ergebnis haben wir das folgende Board-Layout erhalten.

Platinenlayout
▍ Fertige Platte
Das fertige Breakout Board erwies sich als recht kompakt und passt gut in ein kleines Steckbrett. Die Schaltpläne finden Sie hier .

Auf der Prototyp-
Karte montierte Rückwandplatine Zum Programmieren des ATtiny406 wird ein USB-zu-Seriell-Kabel über die darauf befindlichen Stifte mit der Karte verbunden.

Kabelanschlussplan
Der Software-Teil des Projekts
▍pyupdi
Wir haben pyupdi gemäß den Anweisungen aus dem Projekt- Repository installiert .
Das USB-zu-Seriell-Kabel wurde über vier UPDI-Pins mit der Karte verbunden. Unser USB-zu-Seriell-Konverter wurde in macOS als
/dev/tty.usbserial-FTF5HUAV.
Um sicherzustellen, dass der Programmierer den ATtiny406 erkennt, können Sie einen Befehl ähnlich dem folgenden ausführen, indem Sie den Dateipfad bearbeiten:
pyupdi -d tiny406 -c /dev/tty.usbserial-FTF5HUAV -i
Wenn alles richtig konfiguriert ist, sollte die Ausführung eines solchen Befehls zur Ausgabe von Folgendes führen:
Device info: {'family': 'tinyAVR', 'nvm': 'P:0', 'ocd': 'D:0', 'osc': '3', 'device_id': '1E9225', 'device_rev': '0.1'}
▍C Compiler
Es stellte sich heraus, dass der übliche avr-gcc-Compiler, der mit Homebrew unter macOS installiert werden kann, es nicht erlaubt, ATtiny406 als Kompilierungsziel festzulegen. Aus diesem Grund haben wir uns entschlossen, avr-gcc von Microchip zu installieren . Um den Compiler herunterzuladen, müssen Sie ein Konto auf der Microchip-Website erstellen, was etwas ärgerlich ist.

Herunterladen des Compilers
Nach dem Herunterladen der erforderlichen Materialien in Form eines Archivs haben wir dieses Archiv in einen separaten Ordner entpackt. Der Pfad zu dem Verzeichnis
bin, das sich in diesem Ordner befindet, muss hinzugefügt werdenPATH. Dies wird in Zukunft die Arbeit erleichtern. Angenommen, der Compiler ist in einem Ordner gespeichert$HOME/Src/avr8-gnu-toolchain-darwin_x86_64, können SiePATHihnbearbeiten, indem Sie der Datei den folgenden Befehl hinzufügen.bash_profile:
export PATH=$PATH:$HOME/Src/avr8-gnu-toolchain-darwin_x86_64/bin/
Die neuesten ATtiny-MCUs werden vom avr-gcc-Compiler von Microchip ohne zusätzliche Konfiguration nicht unterstützt. Um sie zu unterstützen, müssen Sie das ATtiny Device Pack herunterladen .

Herunterladen des ATtiny-Gerätepakets
Als Ergebnis haben wir das Paket heruntergeladen
Atmel.ATtiny_DFP.1.6.326.atpack(diese Datei kann anders aufgerufen werden, ihr Name kann eine andere Versionsnummer enthalten). Obwohl die Dateierweiterung ist. atpackDies ist eigentlich ein reguläres.zipArchiv. Wir haben die Erweiterung in geändert.zipund den Inhalt des Pakets in einen Ordner extrahiert, dh$HOME/Src/Atmel.ATtiny_DFP.1.6.326an dieselbe Stelle, an der sich die Compilerdateien bereits befanden.
▍Schreiben eines C-Programms
Wir haben das folgende Programm geschrieben, das bei einer Frequenz von 1 Hz die an den B5-Pin unserer ATtiny-Platine angeschlossene LED blinkt.
#include <avr/io.h>
#include <util/delay.h>
int main() {
_PROTECTED_WRITE(CLKCTRL.MCLKCTRLB, 0); // 20 (, 0x02 2)
PORTB.DIRSET = (1<<5);
for (;;) {
PORTB.OUTSET = (1<<5);
_delay_ms(500);
PORTB.OUTCLR = (1<<5);
_delay_ms(500);
}
}
Dieser Code ist dem LED-Blinkprogramm für bekannte AVR-Mikrocontroller sehr ähnlich. Die erste bemerkenswerte Änderung ist die Verwendung von Strukturen für den Zugriff auf MCU-Register. Anstatt sich auf zu beziehen,
PORTBwird beispielsweise ein Anruf an getätigt PORTB.DIRSET.
Eine weitere Änderung wird durch den Frequenzeinstellungscode dargestellt
(_PROTECTED_WRITE(CLKCTRL.MCLKCTRLB, 0). Der neue ATtiny406 läuft nach einem Neustart mit 3,33 MHz, was dem Basistakt von 20 MHz entspricht, der durch 6 geteilt wird. Damit der Chip mit voller Geschwindigkeit von 20 MHz arbeitet, löschen wir das Register CLKCTRL.MCLKCTRLB. Da dieses Register vor versehentlichen Änderungen geschützt werden muss, muss beim ATtiny406 eine spezielle Softwarekonstruktion angewendet werden, um es zu ändern. Glücklicherweise erleichtern Makros dies _PROTECTED_WRITE. Sie können mehr darüber lesen.hier .
Wenn Sie diesen Code mit dem für STM32 oder SAMD21 geschriebenen vergleichen, stellt sich heraus, dass er viel einfacher ist.
▍ Makefile
Hier verwenden wir die folgende Verzeichnisstruktur:
src/Atmel.ATtiny_DFP.1.6.326/- Pfad zum Microchip Device Pack.src/attiny406-test/- der Ordner, in demmain.cder obige Code in der Datei gespeichert ist.
Das Kompilieren des Codes aus dem Verzeichnis
attiny406-test/kann mit dem folgenden Befehl durchgeführt werden:
avr-gcc -mmcu=attiny406 -B ../Atmel.ATtiny_DFP.1.6.326/gcc/dev/attiny406/ -O3 -I ../Atmel.ATtiny_DFP.1.6.326/include/ -DF_CPU=20000000L -o attiny406-test.elf main.c
Mit dem Flag
-Okönnen Sie die Optimierungen durchführen, die erforderlich sind, damit die Funktionsaufrufe erfolgreich funktionieren _delay_ms(). Gleiches gilt für die Variable -DF_CPU, deren Inhalt die erwartete Frequenz des Chips widerspiegelt. Die restlichen Parameter enthalten Informationen zum Speicherort der Dateien für den ATtiny406, die wir zuvor heruntergeladen und aus dem Device Pack-Archiv extrahiert haben.
Um die Firmware auf die MCU herunterzuladen, müssen Sie das, was passiert ist, in das Intel HEX-Format konvertieren. Danach müssen Sie pyupdi verwenden. Wir haben eine einfache
Makefile, automatisierte Lösung für diese Aufgaben erstellt:
OBJS=main.o
ELF=$(notdir $(CURDIR)).elf
HEX=$(notdir $(CURDIR)).hex
F_CPU=20000000L
CFLAGS=-mmcu=attiny406 -B ../Atmel.ATtiny_DFP.1.6.326/gcc/dev/attiny406/ -O3
CFLAGS+=-I ../Atmel.ATtiny_DFP.1.6.326/include/ -DF_CPU=$(F_CPU)
LDFLAGS=-mmcu=attiny406 -B ../Atmel.ATtiny_DFP.1.6.326/gcc/dev/attiny406/
CC=avr-gcc
LD=avr-gcc
all: $(HEX)
$(ELF): $(OBJS)
$(LD) $(LDFLAGS) -o $@ $(OBJS) $(LDLIBS)
$(HEX): $(ELF)
avr-objcopy -O ihex -R .eeprom $< $@
flash: $(HEX)
pyupdi -d tiny406 -c /dev/tty.usbserial-FTF5HUAV -f attiny406-test.hex
read-fuses:
pyupdi -d tiny406 -c /dev/tty.usbserial-FTF5HUAV -fr
clean:
rm -rf $(OBJS) $(ELF) $(HEX)
Um den Code zu kompilieren, führen Sie einfach den Befehl aus
make. Das Herunterladen des Codes auf den Mikrocontroller erfolgt über den Befehl make flash. Von uns eingereichte Makefilekönnen bei Bedarf überarbeitet werden.
Ergebnis
Die neuen TinyAVRs sind so einfach zu programmieren wie die vorherigen Generationen von MCUs. Der Schlüssel ist, die richtigen Werkzeuge zu finden. Wenn Sie Tipps zum Programmieren von AVRTiny haben, teilen Sie uns diese bitte auf Twitter oder in den Kommentaren unten mit.
Planen Sie, den neuen TinyAVR in Ihren Projekten einzusetzen?
