Zwei kleine Programme

Um den Einstieg zu erleichtern, führe ich zwei kleine Programme auf, die nur wenig zusätzlichen Schaltungsaufwand benötigen. Außerdem wird dadurch die wichtigste (Hardware)Schnittstelle erklärt: Die Ein- und Ausgabe von Informationen über die Ports.

Die Programme sind in C programmiert. Wenn man auf die Installation des Compilers zu diesem Zeitpunkt zunächst verzichten will und sofort ein Ergebnis sehen will, kann man auch direkt die unten verlinkten Compilate in den Mikrocontroller flashen.


Ports für Ein- und Ausgabe

Ein Mikrocontroller hat mindestens einen Ein-/Ausgabe-Port. Bei Atmel wird der erste Port als PORTB bezeichnet. Ein Port besteht aus maximal 8 Pins bzw. Datenbits, die mit PB0..PB7 bezeichnet werden. Hat der Mikrocontroller weitere Ports, heißen diese PORTC, PORTD usw. Ein Portpin kann zur Ausgabe oder Eingabe konfiguriert werden. Dies wird durch das Data Direction Register eingestellt. Ist ein Portpin zur Ausgabe konfiguriert, kann durch Schreiben auf den Port der Pegel am Pin auf 5V bzw. Masse geschaltet werden. Ist er als Eingangspin konfiguriert, kann der anliegende Spannungspegel (5V oder Masse für High oder Low) eingelesen werden.


Programm 1: Die blinkende LED

Das erste Programm läßt eine LED im Sekundentakt blinken. Hiermit wird die Ausgabe über einen Portpin gezeigt.

Programm

#include <io.h>
#include <wdt.h>
#include <sleep.h>
#include <Interrupt.h>
#include <inttypes.h>
#include <stdbool.h>
#include <delay.h>

static void io_init(void)
{
    // PortB
    // DDRB = Data Direction Register
    // Pin 0 = Ausgang, alle anderen Pins = Eingang
    PORTB = 0x0;
    DDRB = 0b00000001; 
    // PortC
    PORTC = 0x0;
    DDRC = 0x0;
    // PortD
    PORTD = 0x0;
    DDRD = 0x0;
}

#define LED_PORT PORTB
#define LED_PIN  0

#define CLOCK_MHZ 1
#define sleep(X) delay((X), CLOCK_MHZ * 1000)

int main(void)
{
    io_init();
	
    while(1)
    {
        sbi(LED_PORT, LED_PIN); // set bit
        sleep(1000);
        cbi(LED_PORT, LED_PIN); // clear bit
        sleep(1000);
    }
}
ledblink.c

Der bereits fertige Binärcode kann direkt in den Mikrocontroller geflasht werden (sp12 -wpfC "ledblink.hex"). Dieser steht hier zum Download bereit.

Schaltung

Die Schaltung ist einfach. Eine LED wird über einen 330 Ohm Widerstand an PB0 (Pin siehe Datenblatt) angeschlossen.


Programm 2: Tastendrücke zählen

Das zweite Programm erkennt einen Tastendruck, zählt eine interne Variable hoch und gibt den gezählten Wert nach Loslassen des Tasters durch Blinken der LED aus. Mit diesem Programm wird die Benutzung eines Portpins als Eingang gezeigt.

Programm

#include <io.h>
#include <wdt.h>
#include <sleep.h>
#include <Interrupt.h>
#include <inttypes.h>
#include <stdbool.h>
#include <delay.h>

static void io_init(void)
{
    // PortB
    // DDRB = Data Direction Register
    // Pin 0 = Ausgang, alle anderen Pins = Eingang
    PORTB = 0b00000010; // switch internal Pullup on for PB1
    DDRB = 0b00000001; 
    // PortC
    PORTC = 0x0;
    DDRC = 0x0;
    // PortD
    PORTD = 0x0;
    DDRD = 0x0;
}

#define LED_PORT PORTB
#define LED_PIN  0

#define SWITCH_PORT PINB
#define SWITCH_PIN  1

#define CLOCK_MHZ 1
#define sleep(X) delay((X), CLOCK_MHZ * 1000)

int main(void)
{
    int keys = 0;
    int i;
    
    io_init();
    
    while(1)
    {
        // wait for key press
        while (bit_is_set(SWITCH_PORT, SWITCH_PIN))
        {
            // NOP
        }

        // wait for key release
        while (!bit_is_set(SWITCH_PORT, SWITCH_PIN))
        {
            // NOP
        }

        // count key presses
        keys++;
        
        // let LED blink
        for (i = 0; i < keys; i++)
        {
            sbi(LED_PORT, LED_PIN); // set bit
            sleep(300);
            cbi(LED_PORT, LED_PIN); // clear bit
            sleep(300);
        }
    }
}
ledblink2.c

Der bereits fertige Binärcode kann direkt in den Mikrocontroller geflasht werden (sp12 -wpfC "ledblink2.hex"). Dieser steht hier zum Download bereit.

Schaltung

Die vorherige Schaltung wird um einen Taster erweitert, der an PB1 angeschlossen wird. Ein Pullup-Widerstand ist nicht erforderlich, weil der interne Pullup-Widerstand im Programm gesetzt wird. Zieht also der Taster PB1 nicht auf Masse, liegen 5V und damit High Pegel an.