Microchip Studio ist eine integrierte Entwicklungsumgebung mit einem sehr guten Fehlersuchsystem (Debugger) und der Möglichkeit, den Programmablauf zu simulieren.
Das Programmpaket ist kostenlos, aber sehr umfangreich, weshalb für die Installation einige Zeit veranschlagt werden muss.
Es erlaubt die Programmierung von AVR-Prozessoren (zu denen auch der ATTiny 13 gehört) in Assembler (manchmal auch "Maschinensprache" genannt), in C und C++.
Assembler-Beispiel
Ein einfaches Blink-Programm in Assembler kann so aussehen:
/* * Das Programm lässt zwei Leuchtdioden abwechselnd blinken */ /* * Die .INCLUDE-Anweisung importiert die Namen der Register */ .INCLUDE "tn13def.inc" /* * Der Befehl legt ganz am Beginn des Programmspeichers einen Sprungbefehl * zum eigentlichen Programm. Die ersten zehn Speicheradressen bilden die * sogenanten Interrupt-Vektoren. Das sind Sprungbefehle, die aufgerufen werden, * wenn ein Interrupt auftritt. Auf Platz 0x0000 befindet sich der RESET-Vektor, * der beim Start oder Neustart des Microcontrollers aufgerufen wird. * Streng genommen ist das für das simple Programm hier nicht notwendig, da es * keine weiteren Interrupts aufruft. Es könnte also genausogut gleich auf 0x0000 * beginnen. */ rjmp Anfang /* * Die Direktive .ORG teilt dem Assembler mit, dass die nächsten Befehle ab der * hier angegeben Adresse abgelegt werden sollen. SRAM_START zeigt auf * Speicherplatz 0x0010, gleich hinter die Interrupt-Vektor-Tabelle. */ .ORG SRAM_START /* * Hier beginnt das Programm. Das Label "Anfang" markiert die Einsprungadresse * für den Sprungbefehl im RESET-Vektor */ Anfang: ldi r16,0b00011000 ; PB3 und PB4 als output out ddrb,r16 ;Datenrichtung /* * Blinkschleife mit zwei LEDs: Die LEDs werden abwechselnd ein und ausgeschaltet, der rcall-Befehl * ruft ein Unterprogramm auf, das nichts tut außer einige Zeit zu warten. */ Blinken: ldi r16,0x08 ;8 = 0x08 out portb,r16 ;PB3 = 1, PB4 = 0 rcall Warten ;Unterprogrammaufruf ldi r16,16 ;16 = 0x10 out portb,r16 ;PB3 = 0, PB4 = 1 rcall Warten ;Unterprogrammaufruf rjmp Blinken /* * Warteroutine: normalerweise sollte hier mit Hilfe der eingebauten Timer und Interrupts eine * präzisere Pausenfunktion realisiert werden - vor allem aber eine, die den Microcontroller hier * nicht mit Nichtstun aufhält. */ Warten: Ldi r18,2 Warten1: ;äußere Schleife1 Ldi r17,250 Warten2: ;äußere Schleife2 ldi r16,250 Warten3: ;innere Schleife dec r16 brne Warten3 dec r17 brne Warten2 dec r18 brne Warten1 ret ;Rücksprung
C-Beispiel
/* * Auch dieses Beispiel lässt die beiden LEDs der ATTiny-Experimentierboards als "Lauflicht" blinken. */ /* * Die Variable F_CPU wird von einigen Bibliotheken, darunter der hier verwendeten delay-Bibliothek * benötigt, um die Wartezeiten zu berechnen. Damit die Resultate stimmig sind, sollte die Variable * an die tatsächlich verwendeten Einstellungen angepasst werden. * Der ATTiny 13 wird mit einer voreingestellten internen Frequenz von 9,6 MHz und einem Prescaler * (teilt die Taktfrequenz herunter) von 8 ausgeliefert, das macht 1,2 MHz. */ #define F_CPU 1200000UL /* * Die Standardbibliotheken werden eingebunden */ #include <avr/io.h> #include "avr/iotn13.h" #include "util/delay.h" /* * Das Hauptprogramm: Nach der Setup-phase, in der das Port-Richtungs-Register für PB3 und PB4 * gesetzt werden geht das Programm in eine Endlosschleife (while(1)). */ int main(void) { unsigned int i; // PORTB als Ausgang DDRB = 0b00011000; while(1) { // Led sukzessive einschalten for (i=3;i<5;i++) { PORTB = (1<<i); _delay_ms(500); } // alle wieder ausschalten PORTB = 0b00000000; _delay_ms(500); } }
Kommentieren Sie diesen Beitrag