Mikrocontroller sind die nächst höhere Integrationsstufe in der Halbleitertechnik. Eine Besonderheit besteht hier darin, dass die Funktion des Bauteils nicht wie bei den "normalen" integrierten Schaltungen fest vorgegeben ist. Vielmehr kann ein Mikrocontroller programmiert werden, dass heißt, die eigentliche Funktion des Bauteils wird erst durch das Programm bestimmt, das der Programmierer in Form von Software entwerfen und als Programm-Code niederschreiben muss. Dieser Programm-Code wird dann in eine für den Mikrocontroller verständliche Form, den Binär- oder Maschinen-Code übersetzt.
Vereinfacht ausgedrückt besteht ein Mikrocontroller aus dem Prozessor (CPU) mit angeschlossener Peripherie. Das folgende Prinzipschaltbild zeigt die einzelnen Komponenten eines Mikrocontrollers.
Beim Prozessor, kurz CPU (Central Processing Unit) genannt handelt es sich um das Kernstück des Mikrocontrollers. In der CPU wird das Programm aus dem Flash-Speicher eingelesen und abgearbeitet. Neben dem Rechenwerk, kurz ALU (Arithmetic Logic Unit) genannt, verfügt die CPU außerdem über Registersätze (für Rechen- oder Vergleichsoperationen), einen Programmzeiger (zeigt auf den nächsten auszuführenden Befehl im Programmspeicher) und einen Stackzeiger (zeigt auf Rücksprungadressen von Funktionen, lokale Variablen und Registersätze, die im SRAM-Stack zwischengespeichert werden).
Programmspeicher, auch Flash-Speicher genannt, enthält das ausführbare Programm. Der Programmspeicher ist ein nicht flüchtiger Speicher, dass heißt, sein Inhalt bleibt auch nach dem Abschalten des Stroms erhalten. Flash-Speicher kann nur in Blöcken geschrieben oder gelesen werden.
Beim RAM, Random-Access-Memory (Speicher mit wahlfreiem Zugriff), handelt es sich um den Arbeitsspeicher des Prozessors. Dort werden alle Variablen abgelegt und bleiben bis zu einem Reset oder Abschalten des Stroms erhalten. Der Vorteil des RAM besteht in dem schnellen, wahlfreien Zugriff auf den Speicher.
EEPROM", Electrically Erasable Programmable Read Only Memory (elektrisch löschbarer und programmierbarer Nur-Lese-Speicher), ist ein weiterer nicht-flüchtiger Speicher. Dieser kann auch wahlfrei gelesen und beschrieben werden. Die Zugriffe sind zwar recht langsam, dafür eignet sich der EEPROM-Speicher aber für Programm-Einstellungen, die zur Laufzeit geändert werden können, nach dem Abschalten allerdings erhalten bleiben sollen.
Wie aber gelangt nun das Programm in den Programmspeicher des Prozessors? Normalerweise werden die Atmel-Prozessoren über die ISP-Schnittstelle programmiert. ISP, In System Programming, bedeutet, dass sich der Prozessor direkt auf dem Board programmieren lässt. Zu diesem Zweck wird ein ISP-Programmier-Adapter benötigt. Dies ist ein kleines Board, meist mit eigenem Prozessor, das per Kabel mit der ISP-Schnittstelle auf dem Zielboard und seriell bzw. über USB mit dem PC verbunden wird. Auf diese Weise kann dann über eine spezielle Software für ISP-Programmierung (für einen Controller vom Typ Atmel AVR z.B. avrdude) ein kompiliertes Programm in den Programmspeicher geschrieben werden.
Aber keine Angst, bei vielen Mikrocontroller-Boards wie dem Arduino ist dies nicht erforderlich und es wird gar kein ISP-Programmer benötigt - der Prozessor "gaukelt" dem PC einfach vor, dass es sich bei ihm selbst um einen solchen Programmer handelt. Ermöglicht wird dies durch ein kleines Programm, den Bootloader, der bereits vom Board-Hersteller in den Programmspeicher geschrieben wurde. Der Bootloader befindet sich am Ende des Programmspeichers in einem speziell geschützten Bereich. Der Prozessor ist so konfiguriert, dass nach jedem Prozessor-Reset zunächst das Bootloader-Programm ausgeführt wird. Der Bootloader überprüft, ob über die serielle Schnittstelle ein Programm-Upload erfolgen soll. Wenn dies der Fall ist, verhält sich der Bootloader wie ein ISP-Programmer, und das neue Programm wird in den Programmspeicher geschrieben. Anderenfalls wird einfach das letzte vorhandene Programm gestartet.
Der Vollständigkeit halber soll hier noch einen weiteren Programmier-Mode, nämlich die HV-Programmierung oder High Voltage-Programmierung, angeführt werden. HV-Programmierung erfolgt in einem speziellen HV-Programmer. Es handelt sich dabei normalerweise um das letzte Mittel, den Prozessor zu programmieren, falls man sich durch Unachtsamkeit "ausgesperrt" hat. Es besteht nämlich auch die Möglichkeit, die ISP-Schnittstelle abschalten, die Taktquelle zu ändern oder den Reset-Pin mit anderen Funktionen zu belegen. In solche Fällen lässt sich der Prozessor dann nicht mehr über ISP oder Bootloader programmieren.
Digitale Eingänge liefern beim Lesen den Logik-Pegel zurück, der aktuell an diesem Pin anliegt. Der Logik-Pegel kennt nur zwei Zustände: an oder aus, +HIGH+ oder +LOW+ bzw. +1+ oder +0+. Bei 5V Betriebsspannung gilt eine Spannung von 1,7V oder weniger als +LOW+-Pegel, eine Spannung von 3,5V oder höher als +HIGH+-Pegel. In der Praxis werden aber auch schon Spannungen von 3,3V und leicht darunter als +HIGH+ erkannt. Negative Spannungen oder Spannungen über dem Betriebsspannungspegel von 5V können zur Zerstörung des Eingangs führen. In der Praxis werden digitale Eingänge zur Abfrage von Sensoren bzw. Tastern verwendet.
Nach einem Reset bzw. nach dem Einschalten sind alle Pins zunächst als Eingang konfiguriert. Erst durch das gestartete Programm können Pins als Ausgang konfiguriert werden und liefern dann ein LOW- oder HIGH-Signal am Ausgang, je nachdem, was vom Programmablauf her vorgesehen ist. Analoge Ausgänge dienen zum Ein- bzw. Ausschalten von LEDs oder zur Ansteuerung von Transistoren. Mikrocontroller können nur kleine Lasten wie LEDs direkt schalten, der maximale Strom, den ein Ausgang liefern kann, liegt z.B. beim ATMega328 bei 40mA. Für Lasten mit größerem Strombedarf, wie Relais oder Motoren, ist eine zusätzliche Treiberstufe erforderlich, z.B ein Leistungstransistor
Da ein Mikrocontroller digital arbeitet, kann er mit analogen Signalen nicht viel anfangen. Für diese wird ein spezieller Peripherie-Baustein benötigt, der Analog-Digital-Wandler, kurz ADC (Analog Digital Converter) genannt. Analoge Eingänge liefern beim Lesen einen Digitalwert, der zur anliegenden Spannung äquivalent ist. Dazu wird eine Analog-Digital-Wandlung ausgelöst und das Ergebnis der Wandlung ist der Digitalwert. In der folgenden Abbildung wird ein Digital-Signal dargestellt, wie es der Mikrocontroller "sieht", nicht als kontinuierliches Signal, sondern als "Treppenstufen". Die Abstufung entspricht der Auflösung des A/D-Wandlers. Gängige A/D- Wandler besitzen eine Auflösung von 8 bis 16 Bits, was einer Auflösung von 256 bis 65536 Stufen entspricht.
Analoge Ausgänge geben anstelle eines +LOW+- oder +HIGH+-Pegels einen beliebigen Spannungspegel zwischen 0 und der Betriebspannung aus. Um direkt analoge Spannungen ausgeben zu können, wird ein Digital-Analog-Wandler, kurz DAC (Digital Analog Converter) genannt, benötigt. Ein D/A-Wandler ist quasi das Pendant zum A/D-Wandler.
Die meisten Mikrocontroller besitzen keinen D/A-Wandler, stattdessen wird eine quasi-analoge Spannung in Form eines PWM-Signals ausgegeben. PWM ist die Abkürzung für Pulse Width Modulation, auf deutsch Pulsweitenmodulation. Dabei wird ständig die Ausgangsspannung zwischen +HIGH+ und +LOW+-Pegel umgeschaltet, wobei die Pulsweite (die Länge der +HIGH+- bzw. +LOW+-Phasen) variiert wird. Der Mittelwert ergibt dann die analoge Ausgangsspannung. Statt Pulsweite werden auch Begriffe wie Pulslänge (die Zeit, die das Signal auf +HIGH+-Pegel bleibt) und Pausenlänge (die Zeit, die das Signal auf +LOW+-Pegel bleibt) verwendet. Das Verhältnis von Puls- zu Pausenlänge wird dann in Prozent angegeben. In der folgenden Abbildung werden drei PWM-Signale mit unterschiedlicher Puls-/Pausenlänge von 25%, 50% und 75% dargestellt.
PWM-Signale werden z.B. zum Ansteuern von Motoren verwendet, um eine stufenlose Geschwindigkeitsregelung zu ermöglichen.