Programmierung mit Microchip-Studio (4/10)

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);
        
    }
}

Angerer Harald - Donnerstag, 3. März 2022 (Zuletzt geändert: Montag, 7. März 2022)

Kategorie: Microcontroller

Kommentieren Sie diesen Beitrag

Ihr Kommentar

Captcha