Mikrocontroller sind auf zusätzliche Chips und Software angewiesen, um Peripheriefunktionen zu realisieren. Wenn diese Funktionen in Hardware im Controller integriert sind, wird der Code kleiner, der Energiebedarf geringer und die Systemleistung verbessert sich.
On-Chip-Hardware-Peripherieelemente können den Energiebedarf senken, die Leistung verbessern, die Gerätefunktionen erweitern und die Codegröße verringern. Diese Peripherieelemente gibt es in vielen Varianten, von Operationsverstärkern und verbesserten Analog-Digital-Wandlern (Analog to Digital Converter, ADCs) bis hin zu Pulsbreitenmodulatoren (Pulse Width Modulation, PWM) und Universal-Timern (Universal Timer, UTMR). Zu den leistungsfähigsten Typen dieser Peripheriegeräte gehören solche, die diskrete Logik implementieren oder andere Peripheriegeräte miteinander verbinden können. Dieser Fachartikel befasst sich mit den Peripheriebausteinen Configurable Logic Cell (CLC), Configurable Custom Logic (CCL), Event System (EVSYS) und Signal Routing (SR) Port und zeigt, wie diese Bausteine ein Design aufwerten können.
Die Peripheriebausteine Configurable Logic Cell (CLC) und Configurable Custom Logic (CCL) sind programmierbare Lookup Tables (LUT), wobei jeder Baustein praktisch einer einzelnen Zelle eines FPGAs (Field Programmable Gate Array) entspricht. Die in jeder Peripherieinstanz konfigurierte Logikfunktion wird zur Laufzeit definiert. Der CLC/CCL kann unabhängig von der CPU arbeiten und somit diskrete Logikchips im Design ersetzen. Der Unterschied zwischen einem CLC und einem CCL liegt in der Implementierung – der CLC ist PIC-Mikrocontroller-spezifisch, während der CCL AVR-Mikrocontroller-spezifisch ist. Die grundlegende Funktionsweise der beiden Peripherieelemente ist gleich.
Ein Beispiel, wie diese konfigurierbaren Elemente eingesetzt werden können, ist das Entprellen von Tastern und Schaltern auf Hardwareebene in Kombination mit einem Timer/Oszillator. Der Applikationsbericht 2805 (AN2805) beschreibt drei Möglichkeiten, eine Entprellung mit CLCs zu realisieren. Zwei der drei CLC-Versionen bieten einen guten Kompromiss zwischen Hardware-Ressourcennutzung und Leistung. Der Quellcode für alle drei Versionen ist auf Github verfügbar.
Für die Implementierung der Entprellung wird einer der CLCs als D-Flip-Flop konfiguriert, der den Wert des Tasters oder Schalters verriegelt. Der zweite CLC verknüpft den verriegelten Wert der vorhergehenden Stufe logisch mit dem direkten Eingang und verriegelt dann den resultierenden Wert. Als Taktquelle für beide Flipflops dient ein niederfrequenter Takt, der von einem Timer oder Oszillator auf dem Gerät erzeugt wird. Die Implementierung ist in Bild 1 dargestellt.
Bei den CCLs auf AVR-Mikrocontrollern ist es noch einfacher. Die CCLs enthalten eine Option zur Eingangsfilterung, die effektiv die gleiche Zwei-Zyklen-Filterung durchführt, wie sie in den CLCs implementiert ist. Außerdem können die CCLs von einem 1-kHz-Oszillator auf dem Baustein getaktet werden, der langsam genug ist, um die Entprellung durchzuführen.
Eine weitere Anwendung der CLCs ist die Quadraturdecodierung. Inkrementale Quadratur-Encoder erzeugen zwei Rechteckwellen, deren eine Phase der anderen um 90 Grad vorauseilt. Der Betrag der Drehung wird durch die Anzahl der Wellen bestimmt, während die Phase der Welle die Richtung angibt. Bild 2 zeigt ein Beispiel für ein quadraturcodiertes Signal.
Zur Decodierung wandeln die CLCs diese Wellenform in zwei Ausgangssignale um, die Impulse im und gegen den Uhrzeigersinn darstellen. Zwei Timer im Mikrocontroller zählen die Anzahl der empfangenen Impulse. Wenn der Mikrocontroller Informationen über die Nettopositionsänderung benötigt, kann er die Zählerstände der beiden Timer durch einfache mathematische Berechnungen ermitteln und so die Nettopositionsänderung seit dem letzten Lesen bestimmen.
Das Ereignissystem (EVSYS) ermöglicht die Auswahl eines Ausgangssignals eines anderen Peripherieelements und dessen Weiterleitung an andere Peripherieelemente innerhalb des Mikrocontrollers. Diese Interkonnektivität kann unabhängig von der CPU erfolgen, wodurch im Sleep-Modus oder im Leerlauf Strom gespart und die Leistung verbessert wird. EVSYS ist nur in AVR-Mikrocontrollern verfügbar.
Auf PIC-Mikrocontrollern gibt es ein Peripherieelement, das als Signal Routing (SR) Port bekannt ist. Der SR-Port hat eine ähnliche Struktur wie ein digitaler I/O-Ausgang, ist aber intern angeordnet. Die Bits darin können manuell per Software gesetzt oder gelöscht werden, wie bei einem Standard-E/A-Ausgangsregister, aber er unterstützt auch periphere Ausgangssignale und Schieberegisterfunktionen.
Der SR-Port unterstützt auch die bei PIC-Mikrocontrollern übliche Funktion Peripheral Pin Select (PPS). Sie bietet dem Entwickler Flexibilität bei der E/A-Zuweisung, da digitale E/A-Signale auf verschiedene Pins des Mikrocontrollers verschoben werden können. Ebenso ermöglicht PPS Peripheriegeräten die individuelle Auswahl von SR-Port-»Pins« als Eingänge. Dies ermöglicht den Aufbau und die Steuerung komplexer Zustandsmaschinen mit dieser Peripherie.
Eine mögliche Anwendung des SR-Ports und des CLCs ist die Realisierung eines internen Signalauswahl-Multiplexers. Dieser ließe sich für interne Selbsttests oder zur Auswahl von einem aus n Signalen für die Verarbeitung verwenden. Zur Implementierung dieser Funktion nutzt man einen CLC, um einen 2:1-Multiplexer zu erstellen. Ein 4:1-Multiplexer ist ebenfalls möglich, benötigt aber drei CLCs und zwei Bits des SR-Ports.
Zur Steuerung des Multiplexers wird ein Bit des SR-Ports als Select-Leitung verwendet. Die logische Implementierung ist in Bild 3 dargestellt.
Diese Implementierung hat gegenüber PPS den Vorteil, dass sie schneller und flexibler ist. PPS kann gesperrt werden, um versehentliche Änderungen zur Laufzeit zu verhindern. Zusätzlich kann ein Konfigurationsbit gesetzt werden, um sicherzustellen, dass der PPS nur einmal entsperrt werden kann.
Stattdessen erlaubt die CLC-Multiplexer-Konfiguration dem Programm, die Eingänge zu ändern, ohne jedes Mal eine Entsperrsequenz durchlaufen zu müssen. Die Morsecode-Demo von Bild 4 für die PIC18F56Q71-Familie von Microchip nutzt diesen Anwendungsfall. Die Demo erstellt einen einfachen Morsecode-Sender und -Empfänger, wobei der Multiplexer zur Auswahl zwischen dem Senderausgang und einem externen Eingangssignal für den Empfang dient.
Innerhalb des Programms (Listing 1) sind zur besseren Lesbarkeit Einzelbit-Makros zum Setzen/Löschen/Umschalten für die SR-Port-Pins definiert.
Das folgende Codefragment (Listing 2) sorgt für eine saubere Umschaltung zwischen den Eingangsquellen. Wenn Sender und Empfänger im Ruhezustand sind und der Benutzer ein »#« an das Terminal sendet, schaltet es die Eingangssignalquellen um.
Der Quellcode dieses Programms ist auf Github verfügbar.