PIC

Aus der Mikrocontroller.net Artikelsammlung, mit Beiträgen verschiedener Autoren (siehe Versionsgeschichte)
Wechseln zu: Navigation, Suche

Die Abkürzung PIC kann vieles bedeuten, häufig steht sie für „Programmierbarer Interrupt-Controller“ als Teil größerer Mikrocontroller und Mikrorechner. Im folgenden geht es um eine Serie von Mikrocontrollern der Firma Microchip.

Zu aller erst möchte ich die Aufteilung der PICs veranschaulichen. Die PIC-Familien werden fast immer wie folgt bezeichnet: als Beispiel „PIC18“ oder „18er PIC“ bedeutet, es handelt sich um ein PIC18Fxxxx Microcontroller. Alle PICs haben die Harvard-Architektur. Es können auch alle PICs mittels dem ICSP-Adapter programmiert werden. ICSP steht für In-Ciruit-Serial-Programmer, also ist mittels diesem Anschluss ein brennen möglich, wenn der PIC schon in der Schaltung eingebaut ist. Zudem haben alle PICs, wie auch Microcontroller anderer Hersteller, interne Module. Ein Modul übernimmt eine spezielle Aufgabe, die von der Software nur konfiguriert und nicht zusätzlich ausgeführt wird. Ein Beispiel ist das PWM-Modul. Man kann eine PWM mit der Software generieren (SoftPWM), aber einfacher geht es mit dem Modul, dass nur konfiguriert werden muss. Die Ausgabe der PWM erfolgt anschließend allein durch das Modul und nicht der Software. Da die PICs aber sonst sehr unterschiedlich sind, sollten sie getrennt aufgeführt werden. Grob unterteilt werden sie anhand ihrer Datenbreite.

8 Bit

Die 8-Bit-Microcontroller-Familien sind PIC10, PIC12, PIC16 und PIC18. Bei den 8-bittigen PICs gibt es einmal den Buchstaben „F“ hinter der Familienbezeichnung und den Buchstaben „C“. Der zulässige Speisespannungsbereich liegt typischerweise bei 1,8..5 V.

Die mit einem „F“ in der Bezeichnung haben einen Flash-Programmspeicher, dieser ist somit mehrmals (weit über 1000×) beschreibbar.

Das „C“ bedeutet, dass der Programmspeicher entweder ein OTP-Speicher (One-Time-Programable – Nur einmal beschreibbar), oder aber ein EPROM-Speicher ist, den man nur mit Hilfe von UV-Licht löschen kann. Aus diesem Grund sind die „C“-Varianten uninteressant für Hobby-Elektroniker, zudem die C-Varianten ziemlich alt und (mit Löschfenster) teuer sind. Ihr Einsatz lohnt sich erst bei Massenfertigung, Richtwert ab 5000 Stück.

Die Typen der Familien haben unterschiedliche Ausstattung. Je höher die Zahl vor dem "F", desto leistungsfähiger ist der Rechnerkern (CPU) und auch die Mindestausstattung mit Peripherie. Je höher die Zahl hinter dem "F", desto mehr Ausstattung mit Peripherie und Portpins ist zu erwarten. Einen Typ der PIC10-Familie gibt im 2×3 mm großen SOT23-Gehäuse, wohingegen der kleinste PIC18 ein SOIC18 (etwa 8×15 mm) ist. Zudem ist der PIC10 billiger als ein PIC18.

Die Zahl hinter PIC ist nicht gleich der Flash-Speicherbreite (und damit der Anzahl von Operationskodes)! 8-bit-PICs gibt es mit 12, 14 und 16 Bit Flash-Breite.

8-Bit-PICs können folgendes beinhalten:

  • bis zu 128k Byte ROM
  • bis zu 4k Byte RAM
  • bis zu 1024 Byte EEPROM (Richtwert: 100000× wiederbeschreibbar)
  • 6 bis 100 Pins / 4 bis 70 IOs
  • Interner Oszillator
  • 8/10/12-bit ADC
  • 5/8-bit DAC
  • SPI
  • I²C
  • UART
  • CAN
  • USB
  • PWM
  • Komparator
  • Operationsverstärker
  • Hardwaremultiplizierer 8×8
  • CTMU (Charge Time Measurement Unit, für Cap-Touch-Anwendungen)
  • Ethernet
  • rfPIC12F675: UHF-Sender/Empfänger mit ASK / FSK-Modulation für Funkanwendungen
  • PIC16HV785: (kompatibel zum PIC16F785) I/O-Spannungsbereich von 2V bis 15V, für direkten Betrieb in einem 12-V-System, zur Ansteuerung von Hochvolt-MOSFET-Gates u.a.m.

Details findet man auf der Microchip-Seite und eine Liste aller Typen ist für jede Familie verfügbar: PIC10, PIC12, PIC16, PIC18.

16 Bit

Die Vertreter der 16 Bit Microcontroller sind PIC24E, PIC24F, PIC24H, dsPIC30F, dsPIC33E, dsPIC33F. Trotz dessen nicht überall ein „F“ in der Bezeichnung ist, haben diese Familien dennoch einen Flash-Speicher. Die dsPICs haben, wie der Name schon vermuten lässt, eine zusätzliche DSP-Einheit, die extra für komplexere Berechnungen wie FFT oder Digital-Filter benutzt werden können.

16 Bit PICs können folgendes beinhalten:

  • bis zu 70 MIPS
  • bis zu 536k Byte Rom
  • bis zu 96k Byte Ram
  • bis zu 4k Byte EEPROM
  • 14 bis 144 Pins / 12 bis 122 IOs
  • “Single Cycle” Multiplikation 16x16 und 32/16 sowie 16/16 Division
  • bis zu 32 Channel 10/12-bit ADC
  • 10/16-bit DAC
  • Digital Power, Motor Control und Audio Peripherals
  • I²C
  • SPI
  • CAN
  • PWM
  • PMP (Parallel Master Port)
  • USB-OTG
  • CTMU
  • RTCC (Real Time Clock&Calendar)
  • DMA Channels für schnelleren Datentransfer

Die Übersicht ist wieder unter der Microchip-Seite zu finden und auch hier gibt es die Typenlisten für die Familien PIC24E, PIC24F PIC24H, dsPIC30F, dsPIC33E, dsPIC33F.

32 Bit

Der 32 Bit Microcontroller hat nicht mehr viel mit den anfänglichen PICs gemeinsam. Er besitzt einen „MIPS M4K“-Kern aber ist trotzdem Pin-Kompatibel zu den 16 Bit PICs. Die Typen der PIC32-Familie unterstützen zusätzlich das JTAG-Interface. Es wurde außerdem auf PIC32-Basis eine Arduino-Alternative entwickelt, die dadurch deutlich leistungsfähiger ist. Genannt wurde dies „chipKIT“ und ist im Moment in 2 Varianten verfügbar. Die Entwicklungsumgebung für die chipKITs basiert auf der Arduino-Software und somit sollen auch alle für den Arduino programmierten Progamme auf dem chipKIT laufen. Es gibt auch PIC32er im DIP-Gehäuse. Somit kann man auch den 32bit Microcontroller von Microchip auf z.B. eine Lochrasterkarte bringen und hat nicht soviele (evtl sogar überflüssige) Pins, wie in den kleinen TQFP/N- oder BGA-Gehäusen.

32 Bit PICs können folgendes beinhalten:

Die Übersicht ist wieder unter der Microchip-Seite zu finden und auch hier gibt es eine Typenliste für die Familie: PIC32MX.

Neu hinzugekommen ist die Serie PIC32MZXXX mit u. a. folgenden wichtigen Neuerungen zu den bestehenden PIC32MX:

  • 200 MHz / 330DMIPS
  • teilweise mit FPU (FloatingPointUnit)
  • bis zu 2MB Flash
  • bis zu 512K RAM
  • EBI (External Bus Interface)
  • SQI (Serial Quad Interface)
  • crypto engine

Dokumentation

Bei den PICs gibt es zu jedem Mikrocontroller ein Datenblatt. Bei den Familien 10F, 12F, 16F und 18F wird in diesem Datenblatt jeweils der ganze Controller incl. seiner Peripherie ausführlich beschrieben. Bei den 16 & 32 Bit Familien (PIC24F und aufwärts) gibt es hingegen zu jedem Controller ein Kurzdatenblatt das die genauen Leistungsmerkmale sowie die wichtigsten Informationen für den alltäglichen Gebrauch enthält. Da bestimmte Peripherie (bspw. I2C, SPI, ... ) aber sehr komplex ist und innerhalb einer Familie (PIC24/dSPic/32) sich identisch verhält, gibt es bei diesen Familien zu jeder Familie die sogenannten Family-Datasheets, welche alle Module im Detail beschreiben.

Compiler und IDE

MPLAB X

MPLAB X ist die aktuelle Entwicklungsumgebung von Microchip. Es beinhaltet alle Funktionen von MPLAB (s.u.), jedoch wurde die Software komplett neu gestaltet. Vom Simulator bis zum Projektmanagement ist alles modernisiert worden. Syntaxhervorhebung und Symbolverfolgung funktionieren hinreichend gut. MPLAB X ist für alle gängigen Betriebssysteme erhältlich (Windows, Linux und OS X). Größe ca. 1 GB. Benötigt Java-Runtime, wird ggf. bei der Installation heruntergeladen. Weitere Informationen findet man auf der Produktseite von MPLAB X.

Mit der Installation von MPLAB X kann ein Programmiertool installiert werden, der C-Compiler muss jedoch danach extra installiert werden. Sonst kann man damit kaum etwas anfangen. Größe ca. 100 MB.

MPLAB

MPLAB ist die (inzwischen veraltete) IDE von Microchip und unterstützt von vornherein alle Brenner, Debugger, Emulatoren von Microchip. Zudem kann das Programm in der IDE per Software emuliert werden. Um Programme in C zu schreiben, können C-Compiler, sofern die Software das unterstützt, in die IDE eingebettet werden, wie z.B. der HI-TECH C-Compiler. Genaueres kann man auf der Microchip-Seite anschauen.

C-Compiler

Microchip bietet direkt C-Compiler an. Aktuell mit MPLAB X sind die XC-Compiler von Microchip verfügbar: XC8 für 8-Bit-PICs, XC16 für PIC24 und dsPICs und XC32 für PIC32-Mikrocontroller. Die freie Version kann nur sehr beschränkt optimieren. Etwa kein Inlining von einmal aufgerufenen static-Funktionen. Mit dem XC8 können erstmalig kleinere PICs in C mit den Bordmitteln von Microchip programmiert werden. C++ oder C99 wird vom XC8 nicht unterstützt. Die XC-Compiler scheinen vom (bereits früher erhältlichen) HI-TECH-Compiler abzustammen, darauf deutet der typische Anfang #include <htc.h>.

Vor der XC-Serie anzusiedeln sind die Compiler C18 (für PIC18-Typen), C30 (für 16-bit-Typen) und C32 (für 32-bit-Typen). Diese Compiler können als nicht-kommerzielle Freeware-Version heruntergeladen werden. Dabei wird nach einer gewissen Zeit die Optimierung eingeschränkt. Diese ist für Hobby-Bastler allerdings nicht unbedingt kritisch. Da die C-Compiler C30 und C32 von Microchip auf Open-Source aufbauen, sollte der Sourcecode direkt von deren Seite heruntergeladen und die Aufhebung entfernt werden können (sofern man die Möglichkeit hat, die Software danach wieder zu kompilieren). Andere wären noch CC5X oder Compiler der Firma mikroElektronika. Letzterer unterstützt nicht nur alle PICs, sondern ist auch für AVRs, 8051er und ARM Microcontroller, sowie jeweils auch in Basic und Pascal erhältlich. MikroE-Compiler, sowie der CC5X sind in der Freeware-Version allerdings Codegrößenbegrenzt, was gerade bei 16bit oder 32bit PICs schnell eng werden kann.

Alle diese C-Compiler haben z.T. erhebliche Unterschiede in ihrer Syntax und in ihrem Verhalten. Daher ist es nur sehr schwer möglich, portablen Quellkode zu schreiben.

Ein Vergleich einiger C-Compiler ist in diesem Artikel zu sehen: PIC C-Compilervergleich

BASIC-Compiler

Great Cow BASIC Compiler: Open Source Basic Compiler für PIC und AVR Controller. Verfügbar für Windows, Linux und Apple

Die Syntax von Great Cow BASIC basiert auf der von QBASIC/FreeBASIC, jedoch mit einigen Anpassungen, um dem sehr unterschiedlichen System, für das es kompiliert wurde, gerecht zu werden - einem Mikrocontroller.

Great Cow BASIC ermöglicht die Programmierung der meisten 8-Bit-PIC-Mikrocontroller (10F, 12C, 12F, 16C, 16F, 18C und 18F Chips) und der meisten AVR-Mikrocontroller (Classic AVR, Tiny AVR und Mega AVR).

Programmiergeräte

Um das Programm auf einen PIC zu bekommen, muss dieses per Gerät auf den PIC „gebrannt“ werden. Microchip bietet dazu das PICKIT2 und PICKIT3 an. Das PICKIT3 ist das aktuellere, was bedeutet, dass Firmwareupdates hauptsächlich für diese Version entwickelt werden. Spürbar ist das jetzt schon bei den PIC32MX, die nur vom PICKIT3 unterstützt werden. Wenn man aber kein PIC32 benutzen möchte, kann man bis jetzt aber auch noch zum PICKIT2 greifen, das zusätzlich noch als kleiner Logik-Analyzer dienen kann. Das nächst bessere, was Microchip bietet, ist ein ICD (In-Circuit-Debugger), das eine erweiterte Debuggermöglichkeit bietet. Das „Flagschiff“ ist der REAL-ICE (In-Circuit-Emulator), der zusätzlich noch in der Hardware emulieren kann. Eine Übersicht ist hier zu sehen.

Wie für andere Microcontroller, gibt es auch für den PIC Selbstbaubrenner. Der wohl Bekannteste ist der Brenner8 von der Sprut-Seite. Doch allgemein gilt für Third-Party-Brenner: Es werden neue Microcontroller-Typen, wenn überhaupt, erst später unterstützt, als bei einem originalen Brenner und es führt zu zusätzlichen, möglichen Fehlerquellen durch den Bau. Denn wer kommt schon auf die Idee den Fehler im Brenner zu suchen und nicht in der Schaltung. Hier im Forum sind schon mehrere solcher Fälle vorgekommen. Außerdem bekommt man das "Henne oder Ei"-Problem zu spüren, denn für den Brenner8 muss man einen PIC18 brennen, d.h. man muss sich irgendwo seinen PIC brennen lassen, bevor man es selbst tun kann. Zudem wird nicht jeder bzw. kaum ein Selbst-Bau-Brenner von der IDE unterstützt, was bedeutet, dass man mindestens 2 Programme braucht - Eine zum brennen und eine zum programmieren. Der Brenner8 unterstützt auch kein Debugging, wie es das PICKIT3 jedoch tut. Die Hilfestellung bei einem verbreitetem Programmiergerät ist selbstverständlich besser als bei einem opensource Selbsbau-Brenner. Zudem wird so ein Brenner und die Software meist von einer Einzelperson gepflegt. Dies bedeutet aber auch, dass die Updates usw von dieser Person abhängig ist. Fällt dieser aus (Krankheit oder persönliche Gründe), geht erstmal nichts weiter voran. Es muss also jeder selbst abwägen, ob einem das die ca. 10€ weniger Wert ist. Wenn es jemanden darum geht, den Brenner selbst zu bauen, der kann auch das PICKIT2 nachbauen, denn Schaltplan (Seite 77+78) und Firmware sind offen auf der Herstellerseite verfügbar. Hier ist zwar immer noch die mögliche Fehlerquelle beim Zusammenbau vorhanden, jedoch hat man damit einen besseren Brenner. Wenn einem der originale Brenner zu teuer ist, kann man sich bei Ebay auch nach einem Clone vom PICKIT2 oder PICKIT3 umsehen. Diese kosten im Moment zwischen 15€ und 25€.

Hardware

Allen PICs ist ein einfaches serielles ISP-Interface mit nur 3 Signalleitungen (ISPCLK, ISPDAT und RESET/UPP) gemeinsam. Dazu kommt, dass PICs häufig ein derartiges Anschlussschema haben, dass verschiedene DIL-PICs (auch größere) in einer 8-poligen Fassung gebrannt werden können. Die Programmierspannung an UPP beträgt meist 12 V, aber auch mal nur 8 V. Daher müssen hinreichend moderne Programmiergeräte eine einstellbare Programmierspannung haben. Neuere PICs können auch mit Low-Voltage-ISP programmiert werden, mit UPP = 0 V. Dieses einfache Interface lässt den nahezu direkten Betrieb an einem Parallel- oder seriellen Port eines PCs zu, und deshalb gibt es eine Fülle von Bauplänen für einfachste PIC-Programmiergeräte. Sie alle funktionieren, nur sind sie nicht sonderlich performant. PICs geben sich aus Brenner-Sicht in einer von-Neumann-Architektur aus: Flash, EEPROM und Konfigurationsbits haben eigene Adressbereiche.

Im Unterschied zu AVRs gibt es keine getrennten Low-Voltage- und High-Voltage-Programmieralgorithmen und -Beschaltungen. Wer von PIC zu AVR wechselt kann beim Thema Programmieren beinahe Haarausfall bekommen, so einfach sind PICs in dieser Hinsicht.

Missverständnisse und Eigenheiten

Es gibt einiges, was einen PIC-Neuling abschrecken oder verwirren könnte. (Davon ausgehen, dass der Neuling mit 8 Bit anfängt.) Ein Argument ist, dass kaum oder schlechte Peripherie verbaut wurde. Das trifft — wie auch bei AVR — nur auf sehr alte (um 1995) oder winzig kleine Controller zu. Neue PICs haben oft mehr oder bessere Peripherie als ATmegas.

Historisch gesehen liegt das (etwas) daran, dass PIC der erste flashprogrammierbare (also bastelfreundliche) Mikrocontroller war (PIC16F84), aber Microchip lange Zeit nichts nachgeschoben hatte (alle übrigen Controller wurden weiterhin für Jahre als einmalprogrammierbare "C"-Typen hergestellt). Der Konkurrent Atmel stellte daraufhin seine gesamte Controller-Palette auf Flash um und zog so den Bastler weg vom PIC16F84 hin zu AVR, etwa den heute veralteten AT90S4433, der pinkompatible Vorläufer des ATmega8 und später ATmega328, das Arbeitspferd des Arduino Uno. Inzwischen hat Microchip schon längst nachgezogen und eine unwahrscheinlich riesige Palette von 8-Bit-Controllern mit Flash-Speicher im Angebot.

Andere 8-bit-Mikrocontroller-Familien, wie Hitachi HC8, 8051- und Z80-basierte sind preislich nie so recht in Bastelregionen angekommen und blieben bis heute uninteressant.

Es wird oft bemängelt, dass der Quarz-Takt bei 8-bit-PICs durch 4 und bei 16-bit-PICs durch 2 geteilt wird. Das muss vor allem bei Warteschleifen beachtet werden. Schade, dass der Hersteller MHz und nicht ehrlichere MIPS angab. Historisch bedingt. Fingerzeig auf Marktstrategen. Dafür werden so gut wie alle Befehle in einem System-Takt ausgeführt, wo andere mehr brauchen, besonders beim RAM-Zugriff. 8-bit-PICs gibt es heutzutage mit bis zu 16 MIPS entsprechend 64 MHz.

Böse Fallstricke für Neulinge gibt es nur wenige und unkritische (im Vergleich zum „Verfusen“ eines AVRs). Es muss zum Beispiel bedacht werden, dass, um auf manche Register zugreifen zu können, die Bank gewechselt werden muss — dies macht ein C-Compiler zum Glück automatisch. Verwirrend für Umsteiger vom AVR ist, dass das Richtungsregister zum Konfigurieren der IOs eine 1 für einen Eingang braucht, und keine 0. Doch merken kann man sich, dass die 1 wie ein großes I aussieht und für Input -> Eingang steht. Andersrum steht die 0 für ein großes O wie Output -> Ausgang. Das ist historisch gewachsen und auch bei früherer Intel/Z80-Peripherie so.

Wer sich hier im Forum schon mal rumgetrieben hat, kann eventuell auch den „kleinen Krieg“ zwischen AVR und PIC mitbekommen haben. Jeder Microcontroller hat seine Daseinsberechtigung.

  • Viele 8-Bit-Probleme lassen sich gleichermaßen günstig mit AVR oder PIC lösen. Dann nimmt man den, den man besser kennt.
  • Einige Probleme lassen sich besser mit PIC bzw. AVR lösen. Dann ist es Zeit die Seite zu wechseln.

Bei höherer Anforderung an CPU-Leistung nimmt man 16 oder 32 Bit. Das Problem für Anfänger liegt darin, dass dabei der Umfang an Peripherie, Portpins und des Datenblatts deutlich zunimmt. Auch sinkt die maximale I/O-Spannung auf 3 V, und die Gehäuse sind kaum mehr bastelfreundlich. Daher bleiben die meisten bei 8 Bit solange es geht.

Ob PIC oder AVR, ob 8 Bit oder 32 Bit. Man sollte einfach die Microcontroller ausprobieren und selbst entscheiden. Wenn jemand sich einen, meiner Meinung nach guten Vergleich zwischen AVR und PIC angucken will, kann sich das ->EEVBlog #63<- Video auf Youtube angucken. Da wird auch erläutert, warum es keinen Grund gibt, einen der beiden Microcontroller zu meiden. Zudem ist es auch etwas unprofessionell, ohne selbst eigene Erfahrung gesammelt zu haben, eine Familie oder sogar einen ganzen Hersteller abzuschreiben. Inzwischen kommen sowohl PIC als auch AVR von Microchip.

Alte und neue PICs

Microchip stellt schon seit Anfang der 90er Microcontroller her. Damals war die Technik logischerweise noch nicht auf dem Stand wie heute. Es wird immer kleiner und dennoch schneller und stromsparender. Doch da manche wohl einfach nicht von den alten PICs loskommen, werden diese Heutzutage auch noch teilweilse eingesetzt. Außerdem gibt es mehrere (oft alte) fertige Projekte, die eben so einen alten PIC verwenden und da viele die Projekte nachbauen und nichts neu programmieren (wollen), sind diese PICs immer wieder oft zu finden. Die neuen PICs sind nicht nur Stromsparender und haben mehr Platz, sondern sind auch noch billiger. Ich hab mal zwei alte/ältere und oft zu findende PICs rausgesucht (PIC16F84A und PIC16F887) und einfach mal mit neuen PICs der selben Pinzahl und Bauform(DIP) verglichen:

PIC16F84A vs. PIC16F1827
PIC16F84A PIC16F1827
ROM/Flash 1k Word 4k Word
SRAM 68 Byte 384 Byte
EEPROM 64 Byte 256 Byte
Pins/IOs 18/13 18/16
Max. Frequenz 20MHz 32MHz
Internal Oscillator - 32MHz, 32kHz
Comparators 0 2
ADC-Channels 0 12
Communication - 1xUART, 2xI²C/SPI
CCP - 2xECCP, 2xCCP
Timer 1x8bit 4x8bit, 1x16bit
Preis Reichelt (30.03.2012) 3,15€ 1,60€
PIC16F887 vs. PIC16F1939
PIC16F887 PIC16F1939
ROM/Flash 8k Word 16k Word
SRAM 368 Byte 1024 Byte
EEPROM 256 Byte 256 Byte
Pins/IOs 40/36 40/36
Max. Frequenz 20MHz 32MHz
Internal Oscillator 8MHz, 32kHz 32MHz, 32kHz
Comparators 2 2
ADC-Channels 14 14
Communication 1xUART, 1xI²C/SPI 1xUART, 1xI²C/SPI
CCP 1xECCP, 1xCCP 3xECCP, 2xCCP
Timer 2x8bit, 1x16bit 4x8bit, 1x16bit
Preis Reichelt (30.03.2012) 2,65€ 2,15€

Hier sieht man gerade bei dem verbreitetem PIC16F84A, dass dieser aus heutiger Sicht total klein, schlecht und dafür überteuert ist und man für das gleiche Geld 2 bessere bekommt. Der einzige Grund, der für ältere PICs spricht, ist der, dass man eine vorhandene Software benutzen und nicht umschreiben will. Sollte es aber ein neues, eigenes Projekt werden, tut euch einen Gefallen, spart Geld und kauf neue PICs ;)

Bezugsquellen

Controller

Versandhäuser für Privatpersonen

Evaluation Boards

Links und Literatur