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.
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.
#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.

Die Schaltung ist einfach. Eine LED wird über einen 330 Ohm Widerstand an PB0 (Pin siehe Datenblatt) angeschlossen.
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.
#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.

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.