IMAG0211Es ist fast ein ganzes Jahr her, seit meinem letzen RasPi-Projekt. In dieser Zeit habe ich mich intensiver mit Mikrocontrollern beschäftigt. Der einfache ARM-Prozessor des RasPi war ein guter Einstieg in die Protokolle mit anderen Bauelementen, wie i2c-Sensoren oder EEPROM-Speicherbausteinen. Ich wollte noch kleinere Hardware, noch effizienter im Stromverbrauch, noch näher an der Hardware programmieren. Über den Umweg Arduino habe ich mir die Atmel ATMega Mikrocontroller näher angesehen. Der kompakteste 8bit Atmel Mikrocontroller ist der ATtiny. Den ATtiny85 bekommt man etwa für 1 € und man erhält ein System mit einer 20 MHz CPU, 512 Byte RAM, 8 KB Flash und 512 Byte EEPROM auf gerade einmal 0.73 cm². Programmiert wird er in C oder Assembler. Er versteht 120 (Maschinen-Code) Befehle und unterstützt mit i2c und SPI die wichtigen Industrieprotokolle für Sensoren und andere Mikrocontroller.

Atmel Mikrocontroller programmieren

Um einen ATtiny zu programmieren braucht man ein paar Elektronik-Bauteile. Absolute Grundlagen sind ein Steckbrett (Breadboard), ein paar Klemmbrücken (Jump Wire), einen ISP-Programmierer (z.B. USBasp für weniger als 5 €) und natürlich Software. Dem Pin-out im Datenblatt (Datasheet) kann entnommen werden, an welche Beinchen der ISP zur Programmierung angeschlossen werden muss. Das kann mit ein paar Jump Wire auf dem Steckbrett provisorisch direkt verdrahtet werden und funktioniert auch ohne Lötarbeiten wie bei meinem Experimentier-Board ganz oben im Bild.

ATtiny-ISP-PINs

 

Ich verwende das Atmel Studio 7.0, dem ich die Software für den USBasp ISP Programmierer nachträglich beigebracht habe. Im Wesentlich passiert das, indem das Open Source ISP Programm AVRdude in den entsprechenden Pfad kopiert wird und das Atmel Studio einen Menü-Eintrag für die Kompilieroptionen erhält.

atmelStudio

Kein Programmieren ohne Datenblatt

Atmel stellt hervorragende Datenblätter zur Verfügung. Alle Funktionen des ATtiny werden sehr genau beschrieben und auch technische Hintergründe erläutert. Natürlich nur auf englisch. Zunächst sollte man sich unbedingt etwas Zeit nehmen und das gesamte Datenblatt des ATtiny85 durchblättern, um das Grundkonzept eines Atmel zu verstehen. Die Komponenten eines 8 bit Atmel Mikrocontrollers sind sich sehr ähnlich und viele andere MCs lassen sich vom ATtiny ableiten.

Einen Überblick gibt das Block-Diagramm im Datenblatt  des ATtiny85:

ATTiny85 Blockschaltbild

 

Demnach wird das Programm aus dem Program Flash gelesen und schrittweise ausgeführt indem der Program Counter mit jedem Befehl einen Schritt weitergeht. Dafür holt er die Adresse der nächsten Anweisung aus dem Speicher. Ein Programmschritt besteht aus einer Anweisung (der ATtiny kennt 120 verschiedene Anweisungen) und Parametern. Der Instruction Decoder holt sich die aus dem Instruction Register, in dem die Anweisung zur Ausführung abgelegt wird. Als temporäre Ablage für Parameter dienen die General Purpose Registers (GPR). Die GPR sind eine Tabelle mit 32 Einträgen, die je nach Anweisung Werte übergeben oder empfangen oder gar beides. Bei den meisten Anweisungen wird das Status Register verändert. So wird signalisiert, dass gerade als Ergebnis eine 0 vorliegt, ein Überlauf erzeugt oder ein Interrupt ausgelöst wurde. Über den Datenbus redet die Programm-Logik mit den anderen Komponenten, wie Timer, EEPROM, dem Universal Interface oder den Interrupts. Der Takt wird vom Oszillator geschlagen. Ohne Takt steht der Prozessor still. Mit 6 von 8 Beinen (PB0, PB1, PB2, PB3, PB4, PB5) des ATtiny kommuniziert der Data Register Port (2 weitere Beine sind für VCC und GND) mit der Außenwelt. Der ATtiny verfügt auch über einen Analog-Digital-Konverter (ADC). Diese elektronisch anspruchsvolle Komponente ist über den Analog Comperator an den Datenbus angeschlossen.

Grundsätzlich besteht der ATtiny aus zwei Bereichen: (1) CPU, RAM, Oszillator, GPR, Program Flash und Status Register bilden der Kern des Microcontrollers und verarbeiten die Programm-Logik. Die anderen Komponenten (2) wie Timer, Data Ports, USI, Interrupts und ADC bereichern den praktischen Einsatz des ATtiny und erlauben die Kommunikation mit der Außenwelt.

Bei der Programmierung mit C bleibt der Bereich der Programm-Logik hauptsächlich hinter den Bibliotheken verborgen. Das Datenblatt wird dann nur für die Komponenten gebraucht. Die Initialisierungsvorgänge, die Bezeichner und die Ein-/Ausgabewerte werden dann dem Datenblatt entnommen und die Programmierung für den ATtiny entsprechend angepasst.

Viel interessante ist die Programmierung mit Hilfe eines Assemblers. Denn hier wird jeder Schritt der Programm-Logik eigenhändig programmiert und es kann sehr genau (bis auf den einzelnen CPU-Takt herunter) kontrolliert werden, was die CPU tatsächlich macht. C-Code ist zwangsläufig umfangreicher, da die Logik viel allgemeiner in Maschinen-Code  übersetzt wird und daher viele Zwischenschritte enthält. Das ist aus Sicht des Programmierers sehr effizient, da er sich um Einzelheiten nicht kümmern muss. Aus Sicht des Prozessors bedeutet es eine Menge Mehrarbeit. Wie das Programmieren auf der „Bit-Ebene“ mit dem ATtiny geht, zeigt der nächste Teil.