Winzig

Nach dem ATmega328 (steckt im Arduino) und dem ARM Cortex M0 (im Simblee) möchte ich einen neuen Mikrocontroller kennenlernen, den ATtiny45. Wieder ein AVR-Prozessor, sehr ähnlich wie sein grosser Bruder ATmega328, nur kleiner und leichter: Er hat 256 Byte RAM, 4 KB Flash-Speicher, 8 Füsschen und – was schmerzt – von Haus aus kein einfaches, serielles Interface, nur SPI. Und I2C, ok, vielleicht kann ich das irgendwie nutzten? Oder soll ich das serielle Interface mit Software nachbilden? geht das mit nur 4KB? Dazu später mehr.

Trotz seiner Grösse ist der ATtiny ein vollständiger kleiner Mikroprozessor: hat 2 Timer, Analog/Digital-Wandler, einen Stromsparmodus, und ist robust bezüglich der Stromversorgung (2 bis 5.5V). Er kostet etwa 1 EUR/CHF.

Mit diesem Projekt möchte ich weg von der Arduino IDE: es gibt zum Glück eine ausgezeichnetes Paket, das für AVR-Mikrocontroller alles nötige enthält, den C-Compiler und avrdude, um die eigene Software auf den Prozessor zu schreiben. Daneben nutzte ich jetzt den Editor Atom.

So sieht die Hardware aus:

Oben rechts: Der UBSTinyISP um den Chip via SPI zu programmieren, wird von avrdude sehr gut unterstützt. Um den Programmer einfacher mit dem Breadboard zu verbinden, habe ich mir dafür einen Stecker zusammengelötet.

Unten rechts: Ein FTDI-Adapter, der aus einem USB-Ausgang einen seriellen Port macht. Noch nicht im Einsatz.

Links: Das Breadboard mit dem ATtiny45 selbst (winzig, oder?) Zudem eine LED zum Testen und die Verkabelung zum UBSTinyISP, der auch die Stromversorgung übernimmt. Die Taktung erfolgt über den Chip selbst, ich habe noch kein Gefühl dafür, ob diese genau genug ist, oder es einen externen Oszillator braucht.

Die ersten Versuche haben gut geklappt.

  1. Verbindung prüfen
avrdude -p t45 -c usbtiny

avrdude: AVR device initialized and ready to accept instructions
Reading | ################################ | 100% 0.00s
avrdude: Device signature = 0x1e9206
[...]
avrdude done. Thank you.
  1. Die Einstellungen (sogenannte Fuses) des ATtiny richtig setzten, damit er mit 8MHz läuft, ab Werk sind es nur 1Mhz.
avrdude -p t45 -c usbtiny -U lfuse:w:0xe2:m -U hfuse:w:0xdf:m
[...]
  1. Ein kleines Programm schreiben, welches die LED – sie ist an Pin PB4 angeschlossen – ein- und ausschaltet.
#include <avr/io.h>
#include <util/delay.h>

int main(void) {
    DDRB = (1<<4);
    for(;;) {
        _delay_ms(1000);
        PORTB ^= (1<<4);
    }
    return 0;
}
  1. Und dieses kompilieren (umwandeln in eine hex-Datei) und auf den Chip hochladen (hier das Makefile).
make flash

avr-gcc -Wall -Os -DF_CPU=8000000 -mmcu=attiny45 -c main.c -o main.o
avr-gcc -Wall -Os -DF_CPU=8000000 -mmcu=attiny45 -o main.elf main.o
rm -f main.hex
avr-objcopy -j .text -j .data -O ihex main.elf main.hex
avr-size --format=avr --mcu=attiny45 main.elf

AVR Memory Usage
----------------
Program: 84 bytes (2.1% Full)
Data: 0 bytes (0.0% Full)

avrdude -p t45 -c usbtiny -U flash:w:main.hex:i
[...]
avrdude: erasing chip
avrdude: reading input file "main.hex"
avrdude: writing flash (84 bytes):
Writing | ######################################## | 100% 0.19s
avrdude: 84 bytes of flash written
avrdude: verifying flash memory against main.hex:
[...]
avrdude done. Thank you.

Soweit so gut.