Ob man Mikrocontroller-Dokumentationen liebt oder hasst: Man kommt als Elektroniker nicht um dieses Thema herum. Im ersten Teil dieser Artikelserie ging es darum, was in einem Mikrocontroller-Datenblatt zu finden ist. Jetzt geht es etwas mehr in die Tiefe, denn dieser Teil dreht sich um die Funktionen dieser Chips. Dabei geht die Reise um Details wie Register bis hin zu den Blockschaltungen der integrierten Peripherie.
 

Datenblatt: erste Seiten

Da Sie vom ersten Teil wissen, was typischerweise in einem Datenblatt steckt, ist es nun Zeit für die Details. Datenblätter scheinen Dinge auf eine recht seltsame Art zu beschreiben,. Hinzu kommt: Hersteller erstellen ihre Beschreibungen und Zeichnungen auf unterschiedliche Weise. Als Beispiel dient weiterhin der 8-Bit-Mikrocontroller PIC16F18877 von Microchip Technology. Sie sollten sein Datenblatt herunterladen, wenn Sie mitmachen wollen.
 
Nach dem Download des Datenblatts finden Sie auf den ersten beiden Seiten des PDFs eine kurze Beschreibung des Mikrocontrollers zusammen mit einer Liste seiner wichtigsten Eigenschaften und der integrierten Peripherie. Die Hauptmerkmale sind dabei keine eigenständigen Peripherie-Einheiten, sondern Fähigkeiten, die eng mit dem Rechenkern verknüpft sind. Es geht dabei z.B. um Brown-Out-Schaltungen, die erkennen, wenn die Versorgungsspannung unter das erforderliche Niveau fällt. Auch Watchdog-Timer gehören in diese Kategorie, da sie den Mikrocontroller notfalls resetten und häufig in sicherheitskritischen Systemen verwendet werden.
 
Ab der dritten Seite geht es mehr ums Eingemachte, denn hier wird beschrieben, wie viele welche Peripherie-Einheiten vorhanden sind und wie viel RAM, Flash und EEPROM implementiert sind. Ergänzt werden diese Angaben durch die Seiten vier bis sieben, die grundlegende Infos zu Gehäusen liefern. Hier wird auch erläutert, welche Funktionen welchen Pins zugeordnet sind.
 
Diese Tabellen mit der Zuordnung von Pins zu Funktionen sind ein zentrale für jedes Mikrocontroller-Datenblatt. Bei so viel Fähigkeiten, die in jeden Chip gestopft sind, haben Mikrocontroller heute mehr Funktionen als Pins. Daher kann jedem Pin nicht immer nur eine von mehreren Funktionen zugewiesen werden, sondern es müssen manchmal mehr als eine sein. Bei diesem Chip sieht man, dass Pin „RA2“ als ADC-Eingang, als analoge Spannungsreferenz, als Komparator-Eingang, als Digital/Analog-Wandler (DAC)-Ausgang oder als Interrupt-on-Change-Pin verwendet werden kann. Um die Flexibilität zu erhöhen, kann gelegentlich eine bestimmte Fähigkeit zwischen mehreren Pins umgeschaltet werden. Die Zuordnung von Funktionen zu Pins kann daher sehr komplex ausfallen.
 

Register-Beschreibungen

Register-Beschreibungen setzen sich aus zwei Teilen zusammen: dem Namen des Registers und den Namen der Bits (oder Bitgruppen) innerhalb des Registers. Seite 38 dieses Datenblatts beschreibt die Funktionen des STATUS-Registers als Teil des Prozessors. Dieses Register hat implementierte Bits und auch nicht implementierte Bits.

 
Bit descriptions of registers
Bit-Beschreibungen von Registern können kryptisch erscheinen.
(Bild: Mikrochip)

Die Beschreibung der Bits mit „R“ und/oder „W“ indiziert, ob sie gelesen oder geschrieben werden können. Nach dem Bindestrich folgt typischerweise eine Zahl: „0“ oder „1“. Das ist der Standardwert, der nach einem Reset anliegt. Bei den mit einem „x“ markierten Bits ist der Wert unbekannt. Der Wert einiger Bits kann davon abhängen, welche Art von Reset der Mikrocontroller zuvor durchlief. Wenn er einfach eingeschaltet wurde, gab es einen Power-On-Reset (POR). Wenn die Stromversorgung einen Brown-Out-Reset (BOR) verursachte, kann dies auch zu einem anderen Wert bei einem bestimmten Bit führen. In diesem Beispiel sind solche reset-abhängigen Bits mit „q“ gekennzeichnet.
 
Nicht implementierte Bits können unter Umständen gefährlich sein. Laut dem Datenblatt sollte beim Lesen der oberen drei Bits eine „0“ resultieren. Es ist jedoch unklar, was passiert, wenn man auf diese Bits schreibt. Das Datenblatt kann eine allgemeine Empfehlung geben. Und wenn nichts angegeben ist, sollten man sicherstellen, dass nicht implementierte Bits bei allen Schreibvorgängen auf solche Register den Wert „0“ haben. In C/C++ kann dies wie folgt durchgeführt werden:
 
myValue &= 0b00011111;     // clear 3 most-significant bits (unimplemented bits)
STATUS = myValue;          // write ‘myValue’ into STATUS register

Hinweis: Es ist sinnvoll, solche Zeilen mit einem erläuternden Kommentar zu versehen, damit niemand der Versuchung erliegt, diese Vorsicht zu einem späteren Zeitpunkt „weg zu optimieren“!
 
Ein Überstrich über einem Bit-Namen indiziert, dass sein Wert invertiert ist. Dies gilt z.B. für das Time Out-Bit „TO“. Wenn ein Time-Out auftritt, wird man hier eben keinen Wert „1“, sondern den invertierten Wert „0“ bekommen. Solche negierten Bits ergeben für ´Programmierer wenig Sinn. Doch da sie durch die Hardware bedingt sind, muss man einfach damit leben und dies Code berücksichtigen.
 
Manchmal braucht es zur Konfiguration eine ganze Gruppe von Bits. Ein Beispiel ist der Vorteiler für eine Taktquelle oder die Baudrate für eine serielle Schnittstelle. Solche Bit-Gruppen werden dann „BIT_GROUP<X:Y>“ genannt, wobei X das höchstwertige Bit und Y das niedrigstwertige Bit der Gruppe bezeichnet. Vorsicht: Manchmal können ein oder mehrere Bits, die zur gleichen Gruppe gehören, auf verschiedene Regionen im gleichen Register oder sogar auf mehrere Register aufgeteilt sein!
 

Zeit für „Clock“

Ein sehr wichtiger Teil eines Mikrocontrollers ist die Elektronik zur Takterzeugung. Sie entscheidet, welche Taktquelle für den Prozessor und die On-Chip-Peripherie verwendet wird. Es ist sinnvoll, sich Zeit für das Verständnis dieses Teils zu nehmen (hier auf Seite 110). Normalerweise wird diese Peripherie einmal zu Beginn des Anwendungsprogramms konfiguriert und im weiteren Verlauf nicht geändert. Doch wenn es geändert wird, kann sich dies auf alle Peripherie auswirken, von der Abtastrate des ADC bis zur Baudrate der seriellen UART- und CAN-Schnittstellen.
 
In diesem Beispiel haben wir einige externe Quellen (Quarze oder Keramikresonatoren) und einige interne Quellen. Die internen Quellen sind möglicherweise nicht genau genug (insbesondere bei Temperaturänderungen), um einen zuverlässigen Takt für einige Schnittstellen, wie z.B. den UART, zu dienen. Dies sollte im Datenblatt erwähnt werden. Andernfalls müssen Sie die Genauigkeit im Abschnitt „Electrical Characteristics“ überprüfen.
 
Clock peripheral block diagram PIC16F18877
Blockschaltung für die Takt-Peripherie. Der Multiplexer zur Taktauswahl
und die Taktsteuerung sind hervorgehoben. (Bild: Mikrochip)

Die Gruppe der rot markierten drei Register-Bits „COSC<2:0>“ hängt mit dem Oszillator zusammen und dient zur Auswahl zwischen den verfügbaren Taktquellen mit Hilfe eines Multiplexers. Aus unbekannten Gründen wird in solchen Diagrammen nur die Gruppe von Bits genannt und (leider) nicht das Register, zu dem sie gehören. Um herauszufinden, zu welchem Register sie gehören, ist eine Suche im Datenblatt erforderlich. Unter Umständen können diese Bits sogar zu einem Register einer nicht verwandten Peripherie gehören! Multiplexer tauchen häufig in Blockschaltungen auf, in denen Signale geschaltet werden.
 
Der Ausgang dieses Blocks liefert einen „System Clock“ für den Prozessor und einen „Peripheral Clock“ für die Peripherie. Das Datenblatt kann im weiteren Verlauf des Dokuments auf diese beiden Begriffe verweisen, insbesondere bei der Diskussion von Low-Power-States oder Sleep-Modi. Aus den grün markierten Abschnitten kann man ableiten, dass es einen „Idle“-Modus gibt, der nur den Takt der Peripherie abschaltet, und einen „Sleep“-Modus, bei dem der Takt von Peripherie und Prozessor abgeschaltet wird.
 
Wenn ein Quarz- oder Keramikresonator verwendet werden kann, gibt es wahrscheinlich zusätzliche Hinweise für den Aufbau der Schaltung und das Layout der Platine gegeben wird. Dies ist hier auf Seite 112 der Fall. Hierzu braucht es zwei zusätzliche Kondensatoren zusammen mit einem optionalen Serienwiderstand. Dass dieser Blockschaltung vier Hinweise zum Oszillatordesign beigefügt sind, sollte klar machen, dass die Implementierung von Quarzoszillatoren eine gewisse Sorgfalt erfordert.
 
Oscillator for PIC16F18877
Empfohlene Schaltung für quarzkristallbasierte Oszillatoren.
(Bild: Mikrochip)

Jenseits von Registern und Blockschaltungen

Bisher wurden die Prinzipien der Registerbeschreibung und die Blockschaltung der Taktperipherie behandelt. Es ging auch um Oszillatoren und eine Beispielschaltung für einen Quarzoszillator. Im nächsten Teil dieser Serie geht es um eine weitere wichtige Peripherie, die ebenfalls gut verstanden sein sollte: die Reset-Elektronik. Außerdem werden Aspekte beleuchtet, die das Datenblatt nicht abdeckt. Wenn Sie auf der Suche nach Ressourcen sind, die Ihnen den Einstieg in die Welt der Mikrocontroller erleichtern, sollten Sie einige unserer einführenden Artikel und Bücher lesen.