Programm zum Einschalten einer LED
Nach dem Einschalten des ATtiny Mikrocontroller (oder einem Reset nach der Datenübertragung) beginnt dieser beginnend bei der Programm Speicheradresse 0 den dort enthaltenen Programmcode auszuführen. Anschließend wird Adresse 1 ausgeführt, dann Adresse 2, dann Adresse 3, usw.
Der Mikrocontroller kann nur ganz spezifische Befehle ausführen. Diese sind für jeden Typ in den Datenblättern enthalten. Der ATtiny13A kennt zum Beispiel genau 120 solcher unterschiedlicher Instructions. Jeder dieser Instructions ist 16 bit lang und passt genau in eine Speicheradresse (In den 16 bit sind neben dem eigentlichen Befehl auch Adressen und Zahlenwerte enthalten).
Assemblercode
Zur besseren Lesbarkeit können die binären Instructions (Machinecode) in Assembler dargestellt werden. Für jeden der 120 Instructions gibt es einen spezifischen AssemblerBefehl. Assembler und Machinecode sind also 1zu1 übersetzbar.
Um eine LED an Pin 2 des Mikrocontrollers anzuschalten muss der I/O PortB an Bit 3 zunächst als Ausgang
definiert werden und in einem zweiten Schritt der Ausgang dann auf HIGH gesetzt werden. Dies passiert im
Hintergrund auch bei den beiden Arduino Funktionen pinMode(2, OUTPUT) und
digitalWrite(2, HIGH).
| Arduino | Assember |
|---|---|
| pinMode(2, OUTPUT) | SBI DDRB, 3 |
| digitalWrite(2, HIGH) | SBI PORTB, 3 |
Dem Tabellenblatt kann man die Namen der involvierten Register und auch die Assembler-Instructions entnehmen. Die Einstellung ob es sich um einen Eingang oder Ausgang handel wird im Register mit dem Namen DDRB vorgenommen. Wird das Bit an Position 3 auf '1' gesetzt ist Pin2 anschließend ein Ausgangspin. Im Register PORTB kann man dann den Ausgang mit '1' einschalten und mit '0' ausschalten.
Der Assember-Befehle oben in der Tabelle bedeuten Set Bit in I/O Register DDRB und PORTB an Bitposition 3 auf '1'.
Machinecode
Welcher Machinecode welchem Assember-Befehl entspricht kann man dem AVR Instruction Set entnehmen.
Der Assembler-Befehl SBI entspricht dem rechts abgebildeten 16 bit Opcode (Machinecode).
A
ist hier die Adresse vom I/O Register DDRB (lt. Datenblatt Adresse 0x17) und PORTB (lt. Datenblatt Adresse
0x18) und b ist die Bitposition die auf '1' gesetzt werden soll.
| Arduino | Assember | Machinecode |
|---|---|---|
| pinMode(2, OUTPUT) | SBI DDRB, 3 | 1001 1010 1011 1011 |
| digitalWrite(2, HIGH) | SBI PORTB, 3 | 1001 1010 1100 0011 |
Programmieren des ATtiny
Mit der vorher erstellten SPI Übertragung können die zwei Zeilen Programmcode nun auf den Mikrocontroller in die Flash Speicheradresse 0 und Adresse 1 übertragen werden.
Dargestellt ist hier nur der Code der ausgetauscht werden muss.
// Programmcode der übertragen wird
loadWordToBuffer(0, 0b1001101010111011);
loadWordToBuffer(1, 0b1001101011000011);
writeBufferToFlash(0);
Im folgenden Kapitel wird ein etwas umfangreicheres Programm entwickel. Der Blink Sketch.