PICmicro
Bei PICmicro handelt es sich um einen 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 Instruments (GI) entwickelt wurde. Die Bezeichnung PIC wird von Microchip nicht mehr als Abkürzung verwendet, beim PIC1650 stand es für Peripheral Interface Controller. 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 einer 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 diverseste Erweiterungen und Variationen sowohl betreffend interner Peripherie also auch Bauteilform und Geschwindigkeit entstand eine sehr große Produktfamilie, die passende Mikrocontroller für viele unterschiedliche Anwendungsbereiche bereit stellt.
Grundsätzliches
PICs sind durchwegs 8 Bit RISC Mikrocontroller die ursprünglich mit Fokus auf kleines Instruction Set 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 (es ist auch ein interner Oszillator verfügbar).
Extrembeispiel: Der 6-Pin PIC10F200
Die PICmicro Controller teilen sich in 5 Unterfamilien:
- PIC12CXXX – Base line – die 8 Pin Familie
- PIC16C5X – Base line
- PIC16CXXX – Mid range – 14Bit Instruction Set. Diese Controller gehören zur mittleren Leistungsklasse
- PIC17CXXX – Die High Performance Familie
- PIC18CXXX – High Performance Enhanced Architecture
Die drei Leisungsklassen sind:
- Base line: Standard Features, 33 Befehle, 12 Bit Befehlsbreite, 5MIPS
- Mid range: Standard Features + Interrupt Support, 35 Befehle, 14 Bit Befehlsbreite, 5MIPS
- High performance: Lineare Speicheradressierung, 79 Befehle, 8x8 Hardware-Multiplizierer, 16 Bit Befehlsbreite, 10MIPS
Weiters stellt die Firma Microchip mittlerweile auch 16Bit-Signalprozessoren nach dem PIC-Vorbild her, diese tragen die Bezeichnung „dsPIC“. 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) logisch.
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 64 Bytes unterteilt. Er enthält alle GPRs und SFRs. Die Bankumschaltung erfolgt durch die Bits RP0 und RP1 im STATUS Register.
Der Stack ist im nur als Speicher für den Befehlszähler verwendbar. 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. Weiters erfolgt von der Hardware selber aus 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 blokiert 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)
- ANDWF f,d (logisches UND)
- 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 von einer Konstanten zu W)
- ANDLW k (UND-Verknüpfung einer Konstanten mit W)
- MOVLW k (eine Konstante ins W Register schreiben)
- 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 Timers 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
- CapCom-Units
- Kommunikationsschnittstellen (seriell, z.B. RS232, USB, I²C, ...)
- Watchdog Timer
- LCD driver
Diese werden über SFRs angesprochen und lösen je nach Funktion Interrupts aus.
Der Oszillator
Bei Mid-range PICs können 8 verschiedene Oszillatormodi eingestellt werdern. Die Auswahl geschieht bei der Programmierung. Ein besonderer Modus ist der interne RC-Oszillator, der auf 4MHz läuft.