Bei PICmicro handelt es sich um eine Mikrocontrollerfamilie, die von der Firma Microchip Technology Inc. hergestellt wird.

Abgeleitet wurde sie von dem PIC1650, der ursprünglich von der Mikroelektronik-Abteilung bei General Instrument (GI) entwickelt wurde. Die Bezeichnung PIC wird von Microchip nicht mehr als Abkürzung verwendet, beim PIC1650 stand es für Programmable Intelligent Computer. Die Originalausführung des PIC war als externe Erweiterung der 16-Bit-CPU CP1600 (ebenfalls von GI) gedacht, um die eher mäßige I/O-Performance dieser zu verbessern. Als Befehlsformat kam ein simpler Mikrocode zum Einsatz, der in einem ROM abgelegt war.
1985 verkaufte GI die Mikroelektronikabteilung, und die neuen Besitzer beendeten beinahe alle Produktlinien. Der PIC hingegen wurde mit einem EPROM ausgestattet, um einen Mikrocontroller daraus zu machen. Durch diverse Erweiterungen und Variationen, die interne Peripherie, Bauteilform und Geschwindigkeit betreffend, entstand eine sehr große Produktfamilie, die passende Mikrocontroller für viele unterschiedliche Anwendungsbereiche bereitstellt.
Grundsätzliches
PICs sind größtenteils 8-Bit-RISC-Mikrocontroller, die ursprünglich mit Fokus auf einen kleinen Befehlssatz und einfache Handhabung entwickelt wurden. Der Befehlssatz umfasst etwa 35 (bei den Basistypen) bis 70 (bei den erweiterten) Befehle. Durch die große Vielfalt an verschiedenen Typen lässt sich für praktisch jede Anwendung ein passender PIC finden. Die Chips sind so ausgelegt, dass sie je nach Bedarf mit sehr wenig Beschaltung auskommen (bei vielen PICs ist auch ein interner Oszillator verfügbar).
Extrembeispiel: Der 6-Pin PIC10F200
Die PICmicro Controller teilen sich in folgende Unterfamilien:
- PIC10F2XX – Base line – die 6-Pin-Familie
- PIC12F(C)XXX – Base line (PIC12F(C)5xx) oder Mid range (PIC12F(C)6xx) – die 8-Pin-Familie
- PIC16F(C)5X – Base line
- PIC16F(C)XXX – Mid range – 14-Bit Befehlssatz. Diese Controller gehören zur mittleren Leistungsklasse
- PIC17CXXX – Die High-Performance-Familie (sollte für neue Designs nicht mehr verwendet werden)
- PIC18F(C)XXX – High Performance Enhanced Architecture (16-Bit Befehlssatz mit 8-Bit Hardware-Multiplizierer)
- PIC24FXXX – Neu erschienene, im Vergleich zu den PIC24H sehr kostengünstige, 16-Bit Controller
- PIC24HXXX – Neu erschienene 16-Bit Controller mit der Rechengeschwindigkeit eines Signalcontrollers
- dsPIC30F – x16-Bit Signalcontroller
- dsPIC33F – 3,3Volt x16-Bit Signalcontroller
Die drei Leistungsklassen sind:
- Base line: Standardfeatures, 33 Befehle, 12 Bit Befehlsbreite, 5MIPS
- Mid range: Standardfeatures, Interrupt Support, 35 Befehle, 14 Bit Befehlsbreite, 5MIPS
- High performance: 16-Bit Befehlsbreite, Lineare Befehls- und Daten- Speicheradressierung, 79 Befehle, 8x8 Hardware-Multiplizierer, Rechenwerk eines Signalcontrollers, 10MIPS. Die Befehle der Programmiersprache C (z. B. Schleifenbefehle) werden zum großen Teil direkt von der Hardware ausgeführt.
Je nach Ausführung des Programmspeichers werden drei Typen unterschieden:
- Flash-Typ (EEPROM- Programmspeicher; Kennbuchstabe F)
- Dies sind die am häufigsten eingesetzten Bausteine, da sie leicht zu löschen und wiederbeschreiben sind. Das umständliche Entnehmen aus der Schaltung und Einsetzen in ein Programmiergerät entfällt. So können also auch fest eingelötete Bausteine (SMD) programmiert werden.
- Ebenso lassen sich diese Bausteine ohne Entnahme aus der Schaltung debuggen. Das heißt, dass das im Controller laufende Programm an jeder Stelle unterbrochen oder im Einzelschrittmodus laufen kann. Dabei kann jedes interne Register und der interne Speicher auf einem angeschlossenen PC-Bildschirm beobachtet werden. Dazu werden fünf PINs des PICs über eine Elektronik (über die der PIC auch programmiert werden kann) und dann über USB oder RS232 mit dem PC verbunden. Diese fünf PINs sind zunächst die positive und die negative Spannung, sowie der Reset Eingang des Controllers. Dazu kommen noch zwei Funktionspins (PGC und PGD), die (, um es einfach zu machen) nur für den Programmer/ Debugger reserviert sind. Dies funktioniert bei größeren Controllern ab dem PIC16F818/819 (18 Pins). Jeder einzelne dieser Controller kann so debugged werden, wie er ist. Für kleinere Controller gibt es spezielle Testversionen, bei denen diese beiden Pins zusätzlich vorhanden sind.
- OTP-Typ (One Time Programmable; Kennbuchstabe C)
- Diese können nur einmal programmiert werden und eignen sich nur für Massenproduktionen, wo es auf den letzten Cent ankommt. Sie können ebenso wie die JW Typen nicht in der Schaltung programmiert werden.
- JW- Typ (UV-löschbares EPROM; mit Fenster)
- Die JW Typen stellen das teure Entwicklungswerkzeug für die OTP-Typen dar. Sie sind wie EPROMS nur durch UV Bestrahlung zu löschen.
Die am weitesten verbreitete Leistungsklasse ist mid range, daher wird in diesem Dokument auch auf diese eingegangen.
Speicheraufteilung
Die Speicheraufteilung ist nach der Harvard-Architektur ausgeführt, d. h. Programm- und Datenspeicher werden über einen getrennten Bus angesprochen. Dies ist alleine schon durch die unterschiedliche Wortbreite (Programm 14Bit, Daten 8Bit) nötig.
Der Programmspeicher ist in Pages (Seiten) organisiert, jede Page enthält 2Kx14Bits. Die Umschaltung der Pages geschieht durch die Änderung des 4. und 5. Bits im Special Function Register PCLATH.
Der Datenspeicher ist in 4 Bänke zu je 128 Bytes unterteilt. Er enthält alle GPRs und SFRs. Die Bankumschaltung erfolgt durch die Bits RP0 und RP1 im STATUS Register.
Der Stack kann nur von der CPU und auch nur als Speicher für den Befehlszähler verwendet werden. Er ist 13 Bit breit (11 Bit um die 2048 Adressen pro Seite anzusprechen plus 2 Bit zur Seitenumschaltung) und bei Mid-range PICs 8 Stufen tief. Nach 8 Unterprogramm- /Interruptaufrufen wird wieder die erste Stufe des Stacks beschrieben, was zum Verlust der ersten Rücksprungadresse führt.
Interruptbehandlung
Im Gegensatz zu vielen anderen Controllern besitzen PICs nur einen Interruptvektor, der bei Auslösung eines beliebigen Interrupts angesprungen wird. Seine Adresse ist 0004h. Durch die Hardware erfolgt keine Prioritätssteuerung, diese muss durch die Interruptroutine selbst übernommen werden. Jeder Interrupt kommuniziert mit der Software über zwei Bits, von denen eines verwendet wird, um den Interrupt zu aktivieren (z. B. T0IE für Timer 0 – Interrupt Enable). Das andere Bit wird von der Hardware auf 1 gesetzt, wenn der Interrupt ausgelöst wurde (z. B. T0IF – Interrupt Flag). Es muss rückgesetzt werden, bevor der Rücksprung aus der Interruptroutine erfolgt. Die Bits für die Standard-Interrupts liegen im Register INTCON. Die Aktivierungsbits für erweiterte Interrupts liegen SFR PIE (Peripheral Interrupt Enable), die Flag-Bits in PIR. Weitere wichtige Bits sind GIE (Global Interrupt Enable) und PEIE (Peripheral Interrupt Enable), wobei ersteres wenn rückgesetzt alle Interrupts blockiert und letzteres nur die erweiterten.
Wird ein Interrupt ausgelöst, dann wird zunächst GIE rückgesetzt, damit kein zweiter Interrupt die Interruptroutine unterbricht. Danach springt das Programm auf den Interruptvektor. Nun kann die Software durch abfragen der einzelnen Flag-Bits herausfinden, welcher Interrupt ausgelöst wurde (wobei z. B. durch die Abfolge der Abfrage eine Prioritätssteuerung realisiert werden kann) und entsprechend reagieren. Durch den Rücksprungbefehl RETFIE wird GIE wieder gesetzt. Ist nun noch ein Flag gesetzt, dann wird der Interruptvektor wieder angesprungen.
Befehlssatz
Wie schon oben erwähnt handelt es sich bei PICs um RISC-Prozessoren, sie verfügen also über einen sehr kleinen, aber effektiven Befehlssatz. Ein Word (=12-16Bit, siehe oben) im Programmspeicher entspricht einem kompletten Befehl inklusive Argumenten, jeder Befehl außer Sprungbefehle wird innerhalb eines Zyklus abgearbeitet. Die ALU ist eine Ein-Adress-Maschine. Bei Befehlen, die zwei Argumente benötigen, ist eines immer das W (Work)-Register. Letzteres kann als Pendant zum Akkumulator von Intel-Prozessoren gesehen werden.
Das Befehlsformat lässt sich nach den Argumenten in drei Gruppen einteilen.
Befehle für Byte-orientierte Register
Es handelt sich hier um Befehle, die Werte des Datenspeichers ver- oder bearbeiten. Sie erhalten als Argumente eine 7-Bit-Zahl f, die die Adresse des Registers angibt, und ein Bit d, das angibt, wo das Resultat der Operation hingespeichert werden soll. d=0 bedeutet hier, das Ergebnis soll in das W-Register gespeichert werden, bei d=1 wird das Ergebnis in das durch f adressierte Register geschrieben. Beispiele:
- ADDWF f,d (Addition von f und W)
- SUBWF f,d (Subtraktion W von f)
- ANDWF f,d (logisches UND)
- IORWF f,d (logisches ODER)
- MOVF f,d (Move-Befehl kopiert f entweder auf W oder auf sich selbst)
- MOVWF f (kopiert den Inhalt von W auf f)
Der Sinn von MOVF f,1 besteht darin, dass MOVF das Zero-Bit setzt. Siehe später.
Befehle für Bit-orientierte Register
Diese Befehle sprechen gezielt einzelne Bits an. Sie sind auf den gesamten Datenspeicher anwendbar. Als Argumente werden die 7-Bit-Adresse des Registers f im Datenspeicher und die Stelle des Bits b (3 Bit) in diesem.
- BCF f,b (Bit Clear File ... Bit löschen)
- BSF f,b (Bit Set File ... Bit setzen)
- BTFSC f,b (Bit Test File and Skip if Clear)
- BTFSS f,b (Bit Test File and Skip if Set)
Bei den letzten beiden Befehlen handelt es sich um die hauptsächlich verwendeten Verzweigungsbefehle. Skip bedeutet, dass wenn die Bedingung erfüllt ist, der nächste Befehl übersprungen werden soll. Die anderen Verzweigungsbefehle des PIC sind DECFSZ (decrement file and skip if zero) und INCFSZ (increment file and skip if zero). Beide sind für Zählschleifen gedacht.
Befehle für literale Werte
Diese Befehle sind durch ein L im Namen gekennzeichnet. Sie benötigen als Argument nur den konstanten Wert, der zweite Operand ist das W-Register. Beispiele:
- ADDLW k (Addition einer Konstanten zu W)
- SUBLW k (Subtraktion von W von einer Konstanten)
- ANDLW k (UND-Verknüpfung einer Konstanten mit W)
- MOVLW k (eine Konstante ins W Register schreiben)
- XORLW k (EXOR-Verknüpfung von W mit einer Konstanten)
- RETLW k (RETurn with literal in W)
Kontrollbefehle
Hier noch ein paar Befehle, die den Programmfluss koordinieren bzw. andere Features der CPU bedienen.
- CALL k
- GOTO k
Dies sind der Unterprogrammaufruf bzw. der Jump-Befehl. Die übergebene Konstante ist die 11-Bit Zieladresse in der Page.
- RETFIE
- RETURN
- RETLW k
Hierbei handelt es sich um die Rückkehrbefehle für Interrupt und Unterprogramme.
- SLEEP ... Schaltet den Prozessor in den Schlafmodus. Hierbei wird der Stromverbrauch auf ein Minimum reduziert. Er wird durch einen Interrupt wieder erweckt.
- CLRWDT ... Setzt den Watchdog-Timer zurück.
Interne Peripherie
Es existiert eine große Mannigfaltigkeit von verschiedenen Ausführungen von PICs. Diese enthalten viele unterschiedliche interne Peripherieeinheiten. Folgend die gebräuchlichsten:
- Timer
- A/D-Wandler
- Analogkomparatoren
- Capture/Compare-Einheiten
- Kommunikationsschnittstellen (seriell, z. B. RS232, USB, I²C, ...)
- Watchdog-Timer
- LCD-Treiber
Diese werden über SFRs (special function register) angesprochen und lösen je nach Funktion Interrupts aus.
Der Oszillator
Bei Mid-range PICs können 8 verschiedene Oszillatormodi eingestellt werden. Die Auswahl geschieht bei der Programmierung. Ein besonderer Modus ist der interne Oszillator, der mit Hilfe eines eingebauten RC-Glieds auf 4 MHz läuft.
Programmierung
Um den Microcontroller in einer Anwendung einsetzen zu können, muss dieser zuerst vom Entwickler programmiert werden. Dieser Vorgang wird auch als Brennen bezeichnet. Dies bedeutet, dass Informationen (z. B. ein compilierte Programm, auch Firmware genannt) auf dem internen EPROM oder Flash-Speicher des Bausteins gespeichert werden. Hierzu bieten die meisten PIC-Microcontroller eine sogenannte ICSP-Schnittstelle, die auch noch zur Übertragung des Maschinencode benutzt werden kann, wenn der Chip bereits in die Schaltung eingebaut wurde. Dieser Vorgang kann etwa mit dem ICD2 von Microchip durchgeführt werden, mit dem sich außerdem der Programmablauf debuggen lässt.
Programmierung in Assembler
Die PICs können mit der kostenlosen Software MPLAB von Microchip in Assembler programmiert werden. Diese Software stellt zugleich einen Simulator zum Testen des Codes zur Verfügung.
kostenlose C-Compiler
Von Microchip sind kostenlose C-Compiler in einer sogenannten Students-Edition erhältlich. Diese enthalten gegenüber den Vollversionen nur geringe Einschränkungen, die für den Bastler nicht ins Gewicht fallen. Einige der Highlights dieser Compiler:
- Zu jedem C-Befehl werden die zugehörigen Assembler Befehle aufgelistet. Einzelschritte beim Debuggen können C-Befehle oder Assemblerbefehle sein.
- In Watch Windows kann jedes interne Register und der Speicherinhalt beobachtet werden.
- Im Programmtext hält man den Mauszeiger über eine Variable und schon wird deren Wert angezeigt.
Sicherheit und Kopierschutz
Kritiker behaupten oft, PICmicro-Mikrokontroller seien nicht ausreichend gegen nicht-invasive und invasive Attacken gesichert. Das mag teilweise auf die OTP-basierten Modelle zutreffen, da hier oftmals die Kopierschutz-Fuses durch gezieltes Bestrahlen bestimmter Bereiche des Chip-Die mit UV-Licht zurückgesetzt werden können, jedoch ist dieses Phänomen bei einigen OTP-basierten Mikrokontrollern anderer Hersteller ebenso anzutreffen. Dabei wird zuerst das Plastik-Gehäuse durch Abschleifen und Zersetzen mittels Säure oberhalb des Chip-Dies entfernt um diesen freizulegen. Anschließend wird unter einem Mikroskop die Kopierschutz-Fuse lokalisiert und der restliche Teil des Chip-Dies mit lichtundurchlässigem Material abgedeckt und die Fuse durch UV-Licht zürückgesetzt. Solche Angriffe sind sehr leicht und billig durchzuführen.
Angriffe auf Flash-basierte Modelle der PICmicro-Reihe können durch beabsichtigte Schwankungen der Versorgungsspannung, der Programmierspannung und des Taktes durchgeführt werden.
Der EEPROM-basierte PIC16C84 war besonders leicht auszulesen. Sein Nachfolger, der PIC16F84(A), hat dieses Problem jedoch behoben.
PICmicro-Mikrokontroller sind nicht weniger sicher als andere vergleichbare Produktfamilien, jedoch sollte immer abgewogen werden, wie hoch der Aufwand und die Kosten eines Reverse Engineering und der Wert der möglicherweise gefährdeten Programme ist. Die PICmicro-Familie ist nicht für Hochsicherheits-Anwendungen (Verschlüsselung, Smartcards, ...) geeignet.
Weblinks
- Homepage von Microchip Technology
- Kommerzielle C Compiler
- Open Source C Compiler
- Kommerzieller Pascal Compiler+Zubehör
- PIC-Assembler Befehle
- Informationen rund um den PIC (Tutorials, Projekte, Datenblätter usw.)
- PIC Portal mit vielen Informationen und Selbstbau-Projekten
- Spruts PIC-Page
- Zahlreiche Selbstbau-Projekte
- PIC 16x84 Grundlagen Anfänger führen für PIC 16x84 und Elektronik. (Englisch)
- Sicherheit des Kopierschutzes von PICs und anderen Mikrokontrollern