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[1]. Die Originalausführung des PIC war als ROM-basierte, externe Erweiterung der 16-Bit-CPU CP1600 (ebenfalls von GI) gedacht, um deren eher mäßige I/O-Performance zu verbessern. Als Befehlsformat kam ein simpler Mikrocode zum Einsatz, der in einem ROM abgelegt war.
1989 verkaufte GI die Mikroelektronikabteilung, und die neuen Besitzer beendeten beinahe alle Produktlinien. Der PIC hingegen wurde mit einem EPROM ausgestattet, um einen vom Anwender programmierbaren 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.
PIC sind 8, 16 oder 32 Bit RISC-Mikrocontroller, die ursprünglich mit Fokus auf einen kleinen Befehlssatz und einfache Handhabung entwickelt wurden. Der Befehlssatz umfasst von etwa 33 (bei der Baseline-Familie) bis über 70 (bei der Enhanced-Familie) Befehle. Durch die große Vielfalt an verschiedenen Typen lässt sich für praktisch jede Anwendung ein passender PIC finden. Die Mikrocontroller sind so ausgelegt, dass sie je nach Bedarf mit sehr wenig Beschaltung auskommen (bei vielen PIC ist auch ein interner RC-Oszillator verfügbar).
Neu ist die Familie der PIC32, hier hat Microchip auf einen Controllerkern der Firma MIPS Technologies zurückgegriffen. Bei der aktuellen Produktvorstellung und Bekanntmachung im November 2007 stehen bereits erste Muster, Hardwareentwicklungstools, C-Compiler und umfangreiche Literatur zur Verfügung. Auch können die bekannten Entwicklungstools ICD2, Real-ICE und MPLAB-IDE ab der Versionsnummer 8.0 weiterhin genutzt werden, da diese auch die neue Produktfamilie unterstützen.
Bei den PICmicros werden oft auch die ‚Familien‘ PIC10Fxx, PIC12F(C)xx und PIC16F(C)xxx voneinander unterschieden. Genau genommen sind dies aber keine eigenständigen Familien, sondern nur durch die Anzahl ihrer Pins voneinander abweichende Gehäusevarianten der Familien Baseline und MidRange. Dabei steht PIC10 stets für die 6 Pin-Varianten, PIC12 für jene mit 8 Pins und PIC16 für alle PIC mit 14 oder mehr (bis zu 64) Pins.
Die verschiedenen Familien oder auch Leistungsklassen sind dabei
PIC sind vielfältig bei Hobbyelektronikern im Einsatz. Durch verhältnismäßig preiswerte Produkte und auch günstige Entwicklungstools Anfang der 1990er Jahre wurde der Einsatz der PIC in diesem Bereich besonders attraktiv. Die ersten PIC, die hier besonders gern verwendet wurden, waren der PIC16C83 und seine Nachfolger PIC16F83 bzw. PIC16F84 durch ihren bereits vorhandenen Flashspeicher. Die Entwicklung ist jedoch nicht stehen geblieben und wenn auch diese PIC heute noch angeboten (aber verhältnismäßig teuer) und auch noch vielfach verwendet werden, sollte sich der engagierte Hobbyelektroniker nach Alternativen in den Familien der PIC umschauen.
Empfehlenswert für etwas umfangreichere Aufgaben sind hier die Produkte der Enhanced-Familie (PIC18Fxx), insbesondere durch den linearen Adressraum (siehe nachstehend) ist es für den Entwickler einfacher, ein funktionsfähiges Programm zu entwickeln, ferner ist der durch Microchip angebotene, kostenlose C18-Compiler in der Student-Edition hier sicherlich ein gewichtiges Argument. Ein kleines und preiswertes Programmiergerät stellt das PICkit2 dar, welches die meisten aktuellen 8 und 16 Bit PIC programmieren kann.
Dieser kleine Absatz soll eine kleine Auswahl gängiger und moderner Produkte vorstellen, wobei alle Produkte für 5 Volt Versorgungsspannung geeignet, in DIL-Gehäuse lieferbar und mit gleicher Pinzahl zueinander pinkompatibel sind.
Derzeit am häufigsten werden in freien Selbstbau-Projekten folgende PICs eingesetzt: PIC12F675, PIC12F683, PIC16F84A, PIC16F628A, PIC16F876A
Um die Verwendung des teureren PIC16F84 zu vermeiden, kann bereits bestehender Assembler-Code durch eine hinzugefügte Patch-Routine (welche auf dem 16F84 nicht vorhandene analoge Peripherie abschaltet und dann zum Hauptprogramm zurückspringt) und dem verschieben von RAM-Variablen zum mit doppelt soviel Speicher ausgestatteten PIC16F628A kompatibel gemacht werden
Die Verwendung der kostenlosen C-Compiler von Microchip bietet sich für den Hobbyanwender an.
Es existieren im Internet zahlreiche Schaltungen für den Selbstbau von einfachen PIC-Programmiergeräten, welche oft aus wenigen Bauteilen bestehen und damit günstig im Selbstbau herzustellen sind. Viele Hobby-Programmiergeräte funktionieren nicht mit jedem PC und jedem PIC zuverlässig.
PIC Derivate:
Microchip-PIC gibt es von 6 bis 100 Pin, davon 8 bis 40 Pin neben verschiedenen SMD-Varianten auch in „Dual-In-Line“. Das kleinste Gehäuse ist in SOT-23, alle Gehäuse ab 44 Pin aufwärts sind in TQFP. Für besonders platzkritische Anwendungen gibt es neben den SO und SSOP (beide von 8 bis 28 Pin) auch noch die sogenannten MLF- oder QFN-Gehäuse von 8 bis 44 Pin. Nicht selbstverständlich ist, dass nahezu alle PICmicro in gleichen Gehäusen auch ein vergleichbares „Pinout“ besitzen. Kleine Unterschiede gibt es allerdings beim Umstieg von 8bit- auf 16bit-Controller. Also passt ein PIC18F4620 z. B. auch auf ein Layout eines PIC16C74 und umgekehrt. Eine darüber hinausgehende Kompatibilität gibt es dabei noch bei den kleinen Controllern, auf einen Sockel bzw. ein Layout für einen 20 Pin passen auch die Varianten in 14 oder 8 Pin, so kann der Entwickler zunächst mit 20 Pin beginnen und bei Bedarf eine kostengünstigere Alternative mit nur 14 oder 8 Pin ohne Layoutänderung einsetzen, wenn ihm die kleinere Anzahl von Pin ausreicht.
Die Speicheraufteilung ist bei allen 8 und 16 Bit Familien der PICmicros nach der Harvard-Architektur ausgeführt, d. h. Programm- und Datenspeicher werden über getrennte Busse angesprochen.
Die Programmspeicher der PIC sind unterschiedlich organisiert, bei der Baseline-Familie gibt es bis zu 4 Seiten (Pages) zu je 512 × 12 Bits d. h. je nach Typ bis maximal 2048 Worte (dies entspricht 3KB[2] oder auch 2048 mögliche Befehle). Bei der MidRange-Familie gibt es ebenfalls bis zu 4 Seiten, diese enthalten aber jeweils 2 K × 14 Bits d. h. je nach Typ bis maximal 8192 Worte (entspricht 14KB oder auch 8192 mögliche Befehle).
Bei der Enhanced Architektur, auch PIC18 genannt, sowie den 16 Bit Familien PIC24 und dsPIC gibt es diese Speicheraufteilung nicht mehr, der Programmspeicher ist linear adressierbar. Bei PIC18 liegt die auf dem Chip befindliche Obergrenze bei 128KB (64 K Befehlsworte á 16 Bit) und kann bei einigen sehr großen Varianten auf extern bis zu 2MB[2] erweitert werden. Bei den 16bit-Familien liegt die Obergrenze derzeit bei circa 256KB Flash (ca. 86 K Befehlsworte mit jeweils 24 Bit), externer Speicher ist hier zur Zeit nicht möglich, aber sowohl größerer Speicher bis 512KB, als auch extern anschließbarer Speicher sind in Planung.
Der Datenspeicher ist bei den PICs der Baseline-Familie in 1 bis 8 Bänke zu je 32 Bytes unterteilt. Er enthält alle Spezialregister, genannt SFR (Special Function Register) und Standard RAM-register, genannt GPR (General Purpose Register); maximal sind hier 134 Byte RAM möglich. Die MidRange Familie verwendet das gleiche Prinzip, jedoch bis maximal 4 Bänke mit jeweils 128 Bytes SFR und GPR; hier sind maximal 368 Byte RAM möglich.
Bei der Enhanced Architektur gibt es die Bank Architektur zwar noch, mit bis zu 16 Bänken á 256 Byte, jedoch kann mit bestimmten Befehlen der Speicher auch direkt bzw. linear angesprochen werden; maximal bis circa 3,9 KB RAM. Bei den 16 Bit-Familien ist der Speicher bis maximal 64KB linear ausbaubar, maximal werden jetzt jedoch nur 30KB (inklusive 2KB Dual-Port-RAM für den teilweise vorhandenen DMA-Controller) genutzt, dazu kommt ein 2KB großer Speicherbereich für die SFR. Ein Bereich von 32KB kann genutzt werden, um sehr schnelle Lesezugriffe auf den Flash-Speicher zu ermöglichen.
Der Stack kann bei der Baseline- und bei der MidRange-Familie nur von der CPU und auch nur als Speicher für den Befehlszähler verwendet werden. Er nimmt bei Unterprogrammaufrufen oder bei einem Interrupt (gilt nur für MidRange) die Rücksprungadresse einschließlich der Seiteninformation auf und ist nur 2 (Baseline-Familie) oder 8 (MidRange-Familie) Elemente tief in besonderen Stackregistern, die nicht im RAM-Bereich liegen. Bei der Enhanced-Familie ist der Stack 32 Elemente tief und kann auch vom Programm mit Ladebefehlen (z. B. PUSH und POP) genutzt werden, er liegt aber ebenfalls noch in gesonderten Speicherzellen. Erst bei den 16 Bit-Familien liegt der Stack frei im RAM.
Wie schon oben erwähnt, handelt es sich bei PIC um RISC-Prozessoren, sie verfügen also über einen sehr kleinen, aber effektiven Befehlssatz. Ein Befehl bzw. ein Befehlswort im Programmspeicher, dies sind zwischen 12 und 24 Bit (siehe oben), entspricht einem kompletten Befehl inklusive Argumenten, jeder Befehl außer den Befehlen zur Programmverzweigung wird innerhalb eines Zyklus abgearbeitet. Ausnahmen davon gibt es nur bei der Enhanced-Familie mit 5 möglichen Befehlen, die aus zwei Wörtern bestehen können und bei den 16bit-Controllern, welche aber auch nur wenige 2-Wort-Befehle haben. Die ALU bei den 8 Bit PIC ist eine Ein-Adress-Maschine. Bei Befehlen, die zwei Argumente benötigen, ist eines immer das W (Work)-Register. Aber keine Regel ohne Ausnahme(n), die Enhanced PIC können auch Datentransfer von einer Speicherzelle zu einer anderen Speicherzelle (MOVFF adr1,adr2 ; adrx=RAM oder SFR, benötigt 2 Worte und 2 Zyklen).
Bei den 16bit-Controllern gibt es einen Satz von 16 × 16 Bit Registern, die alle für die meisten Befehle zur Verfügung stehen, jedoch haben einige Register davon auch Sonderaufgaben, z. B. für den Stack oder für DSP-Befehle.
Im Gegensatz zu vielen anderen Controllern besitzen die 8 Bit PIC keinen (Baseline), einen (MidRange) oder zwei (Enhanced) Interruptvektoren, der bei Auslösung eines beliebigen Interrupts angesprungen wird. Seine Adresse ist bei den MidRange PIC 0004h, bei den byteadressierten Enhanced PIC bei 0008h (dies entspricht der Wort-Adresse 0004h bei den MidRange PIC) und 0010h. Nur bei den Enhanced PIC ist somit eine eingeschränkte Prioritätssteuerung möglich, diese muss sonst durch die Interruptroutine selbst übernommen werden. Bei den 16 Bit Familien gibt es für nahezu jede Peripherie oder Sonderfunktion eigene, insgesamt bis zu 118 Interruptvektoren, diesen kann einer von 8 verschiedenen Prioritätsleveln frei zugeordnet werden.
Es existiert eine große Vielfalt an verschiedenen Ausführungen von PICs. Diese enthalten viele unterschiedliche interne Peripherieeinheiten. Die gebräuchlichsten sind
Diese Peripherien werden über SFRs (special function register) angesprochen und können je nach Funktion verschiedene Interrupts auslösen.
Die Optionen für den oder die Oszillatoren sind so mannigfaltig, wie die PICmicros und ihre Produktfamilien selbst. Die ältesten PICmicros hatten im Allgemeinen gar keinen eigenen Oszillator auf dem Chip. Später bekamen die 8 Pin PIC12 als erste einen eigenen 4 MHz RC-Oszillator auf den Chip. Dann wurden neue Konzepte mit mehr Flexibilität auch für PIC mit mehr Pins hinzugefügt. Heute verfügen die meisten aktuellen PIC und dsPIC über sehr weitreichende onChip-Oszillatoroptionen. Nur auf den besonders kleinen oder preiswerten Typen, PIC10F2xx oder auch PIC18FxxJxx, befindet sich zum Teil nur ein eingeschränkter onChip-Oszillator mit 32 kHz oder 4 MHz. Jedoch haben diese RC-Oszillatoren in der Regel eine eingeschränkte Genauigkeit von nur ca. 1 % bis 5 %. Für genauere Anwendungen, zum Beispiel mit asynchroner Kommunikation (RS232, USB, CAN), ist das nicht ausreichend und es muss extern ein Quarz oder Oszillator angeschlossen werden.
Um den Microcontroller in einer Anwendung einsetzen zu können, muss zuerst vom Entwickler ein Programm entwickelt werden. Die Programmentwicklung kann mittels Assembler oder einer Hochsprache, z. B. C, BASIC oder anderer Compiler geschehen. Für die kleineren Mikrocontroller ist heute noch oft Assembler üblich, um den Code möglichst effizient und klein zu halten, was unter Umständen den Einsatz von kleineren, preiswerteren Mikros ermöglicht. Bei den Mikros mit größerem Speicher bzw. für anspruchsvollere Aufgaben kommt in der Industrie heute zumeist C zum Einsatz, da damit der Programmcode später besser zu pflegen ist.
Kostenlose und freie C-Compiler auf Basis des GNU C Compilers (gcc) werden ausschließlich von Microchip selbst zum Download auf ihrer Homepage angeboten.
Es handelt sich bei zweien um die sogenannten Studentenversionen[13] der drei professionellen und kostenpflichtigen, C30 (für alle PIC24 und dsPIC) sowie C32 (für alle PIC32). Diese Studentenversionen haben gegenüber der professionellen Version lediglich solche Einschränkungen, die für den Heimanwender kaum ins Gewicht fallen. Sie dürfen nicht nur von Studenten, sondern von jeder Person genutzt werden. Die Compiler lassen sich alleinstehend verwenden oder in die kostenlose Entwicklungsumgebung MPLAB integrieren.
Die umfangreichen über den C-Standard hinausgehenden Libraries sind allerdings nur halbfrei, da sie nicht für kommerzielle Zwecke genutzt werden dürfen. Darin unterscheiden sie sich von freier Software.
Der PIC18 Compiler basiert auf einer anderen Codebasis[13][14]. Bei der kostenlosen Studentenversion ist als Einschränkung gegenüber der Vollversion die vorhandene Codeoptimierung nicht frei konfigurierbar sondern wird nach dem Defaultschema durchgeführt, das einen Kompromiss zwischen Codegröße und Schnelligkeit darstellt[15].
OTP-basierende PICmicro-Mikrokontroller sind nicht ausreichend gegen nicht-invasive und invasive Attacken gesichert, da hier oftmals die Ausleseschutzsicherungen durch gezieltes Bestrahlen bestimmter Bereiche des Chip-Die mit UV-Licht zurückgesetzt werden können. Jedoch ist dieses Phänomen auch bei einigen OTP-basierten Mikrokontrollern anderer Hersteller anzutreffen. Die PICmicro-Familie ist nicht für Hochsicherheits-Anwendungen wie sichere Smartcards geeignet.
Zum Zurücksetzen der Ausleseschutzsicherungen wird zuerst das Plastik-Gehäuse durch Abschleifen und Zersetzen mittels Säure oberhalb des Halbleiterchips entfernt. Anschließend werden unter einem Mikroskop der Ort der Ausleseschutzsicherungen am Chip lokalisiert und der restliche Teil des Halbleiters mit einem lichtundurchlässigem Material abgedeckt. Danach wird die Ausleseschutzsicherung durch Ultraviolettstrahlung zurückgesetzt. Solche Angriffe sind sehr leicht und billig durchzuführen.
Beim PIC16C71 konnte nicht-invasiv, und ohne ihn ausserhalb der Spezifikationen zu betreiben, durch eine kryptographische Schwachstelle, welche von Dejan Kaljević gefunden wurde, Rückschlüsse auf den Inhalt der Programmspeichers gemacht werden. Bestimmte Befehle müssen allerdings erraten bzw. nach dem Kontext bestimmt werden.
Angriffe auf Flash-basierte Modelle der PICmicro-Reihe können mitunter durch beabsichtigte Schwankungen der Versorgungsspannung, der Programmierspannung und des Taktes und durch invasive Aktionen (Mircoprobing, FIB-Editieren) durchgeführt werden.
Der EEPROM-basierte PIC16C84 ist durch nicht-invasive Angriffe, wie die Schwankungen der Versorgungsspannung, besonders leicht auszulesen. Es existieren viele Hobby-Programmiergeräte die das Auslesen von kopiergeschützten PIC16C84 standardmässig vorsehen. Die Nachfolger, der Flash-basierte PIC16F84(A), hat dieses Problem jedoch behoben.
Der Hersteller Microchip baut bei einigen neueren Modellen und Revisionen Vorkehrungen wie Metall-Schutzschilder oder Metall-Netze ein. Ein Schutzschild verhindert das zurücksetzen oder verfälschen von Ausleseschutzsicherungen mittels UV-Licht, während ein Metall-Netz das Microprobing verhindern oder erschweren soll. Allerdings kann ein erfahrener Angreifer das Metall-Netz in der obersten Schicht mittels Laser zerschneiden oder mittels FIB „anbohren“.
Text und Bilder der Lexikonartikel stammen aus der freien Enzyklopädie Wikipedia und stehen unter der GNU Free Documentation License.