PIC (microcontrollore)
PIC è una famiglia di circuiti integrati a semiconduttore con funzioni di microcontrollore.
Microchip Technology non usa il termine PIC come un acronimo; il suo nome aziendale è: "PICmicro". Anche se generalmente sta per "Programmable Interface Controller", il suo primo produttore la "General Instrument" usava l'acronimo per "Programmable Intelligent Computer".
Inizialmente sviluppato nel 1975 è in grado di svolgere un set di istruzioni ridotto (RISC), la versione più piccola ha 33 istruzioni assembly.

Versioni
Nell'arco del tempo ne è stata resa disponibile una ampia varietà di versioni, diverse sia come tecnologia costruttiva, come forma fisica (numero di piedini) che come quantità o tipo di memoria, oltre alle funzioni di ingresso uscita.
Ne esistono versioni con programma su ROM mascherata, quindi non riprogrammabili, versioni CMOS programmabili una sola volta OTP, versioni EPROM con finestra per cancellazione tramite raggi UV e versioni con memoria flash.
Le versioni CMOS hanno all'interno del nome del componente una C (es. PIC16C505), le versioni ROM hanno CR (es. PIC16CR57A) e le versioni flash hanno una F (es. PIC18F452).
La serie C è ormai obsoleta per cui le versioni più usate sono quelle con memoria di tipo FLASH, che si possono programmare tantissime volte in breve tempo.
Il PIC più conosciuto è il PIC16F84: ormai è stato soppiantato dal più completo PIC16F88, con il quale è quasi completamente compatibile (occorre solo cambiare l'inizializzazione delle periferiche e ricompilare il codice per la corretta mappatura dei registri). Il 16F88 al suo interno ospita numerosissime periferiche come l'USART, 3 temporizzatori, 2 comparatori e un A/D a 7 canali. Ha anche un oscillatore interno e quindi le porte OSC1 e OSC2 possono essere usate come ingressi o uscite (RA6, RA7); la porta di reset/programmazione (MCLR), se non serve può essere utilizzata come ingresso generico (RA5), ma non come uscita. Inoltre si puo' leggere e scrivere la memoria di programma (e non solo la EEPROM dati) direttamente da codice.
Con la stessa piedinatura del 16F84, oltre al già citato 88 (e 87, uguale all'88 ma senza A/D), ci sono i 627/628/648A, 716 e 818/819. Poi ci sono altre versioni simili, ma con maggiori piedini di ingresso e di uscita ad esempio le versione 16F876 e 16F877.
La serie PIC16, in via di abbandono da parte di Microchip, verrà presto totalmente sostituita dalla serie PIC18. Quest'ultima serie garantisce un set di periferiche molto più esteso, consumi minori e soprattutto costi minori. Il diretto equivalente del 16F84 è il 18F1220, che comprende anche una USART, una MSSP, ingressi analogici ed altro.
La serie speciale 18FJ, non disponendo di EEPROM a bordo, è la serie più economica prodotta da Microchip. Utilizzando infatti microcontrollori con più memoria di programma rispetto a quanta effettivamente necessaria, è possibile scrivere su quest'ultima riservandosi una zona ad uso simil-EEPROM.
Le versioni viste finora lavorano su dati a 8 bit ma vi sono anche versioni a 16 e 32 bit come le famiglie dsPIC30F, dsPIC33F, PIC24F e PIC24H a 16 bit e la famiglia PIC32MX a 32 bit.
Istruzioni
Il set di istruzioni del PIC ne comprende 33 nelle versioni di bassa potenza e fino a 77 in quelli con prestazioni più elevate. Ogni istruzione per essere eseguita impiega 4 cicli di clock. Tranne le istruzioni che comportano un salto all'interno della memoria (GOTO, CALL, RETLW) che impiegano 8 cicli, nelle versioni recenti vi sono altre istruzioni che impiegano 8 cicli come quelle di trasferimento dati tra memoria e memoria (MOVFF).
Architettura interna
L'architettura è di tipo Harvard a bus separati; i bus dati e controllo sono a 8 bit le istruzioni hanno un formato a 12, 14, 16 o 32 bit.
Nelle ultime versioni è stata implementata un'architettura a 16 bit o 32 bit. Esiste anche il bus dello stack a partire da 9 bit in su.
Memorie
A causa dell'architettura RISC, dove nell'istruzione oltre al significato è compreso anche l'indirizzo di memorizzazione o di salto, la memoria viene segmentata. Per cambiare segmento in uso occorre agire su appositi registri, fatto questo che complica la programmazione dei PIC tramite linguaggio assembly, ma non quella con linguaggi di alto livello.
RAM
La RAM ha una larghezza di 8 bit e una profondità che varia da pochi byte (25 nei PIC16C5x) fino a qualche kilobyte.
Di programma
La larghezza della parola di programma varia da 12 bit (ad esempio, nel PIC16C54) a 14 bit (ad esempio, nel PIC16F628) a 16 bit (ad esempio, nel PIC18F4520).
La sua profondità varia da 512 byte a 128 kibibyte (KiB).
Stack
Lo stack è un tipo di memoria, separata da quella principale, caratterizzata da un particolare metodo di accesso (LIFO). È dotato di un suo bus la cui profondità va da 2 posizioni a 8 posizioni e giunge alle 31 nei PIC della serie 18. La sua larghezza parte da 9 bit.
EEPROM
Nelle versioni con memoria flash può essere presente una memoria interna di tipo EEPROM accessibile come fosse una periferica per potervi memorizzare dei dati che, se non esplicitamente cancellati, si conservano per almeno 40 anni. La sua capienza varia da 64 a 1024 byte.
Periferiche
La presenza di periferiche a bordo del chip è quella che fa la differenza tra un microprocessore ed un microcontrollore. Nei PIC si parte da dei semplici I/O digitali per arrivare a funzioni complesse passando attraverso una notevole varietà di altre funzioni.
I/O paralleli
La funzione di ingresso e uscita di dati digitali è stata la prima funzione implementata. Nei PIC è divisa in porte da 8 o meno bit ognuna. È possibile programmare ogni bit come ingresso o come uscita singolarmente.
In alcune versioni è possibile avere degli ingressi con conversione analogico digitale (ADC) da 10 o 12 bit. In altre gli ingressi analogici vengono diretti a dei comparatori. In alcuni casi è possibile attivare dei resistori interni (weak pull-up ) per facilitare il collegamento con pulsanti ed interruttori.
I/O seriali
Può essere presente una grande varietà di porte seriali: I²C, USART, SPI, CAN, USB.
PWM
Si arriva fino a 5 canali PWM a 10 bit.
Timer
Su tutte le versioni è implementato almeno un temporizzatore da 8 bit. Si arriva fino a 5 temporizzatori con larghezze a 8 o 16 bit. Su tutte è inoltre implementato un temporizzatore speciale chiamato WDT (Watch Dog Timer), serve (se utilizzato) a far ripartire il microcontrollore in caso di blocco del programma. Il timer funziona in base alla frequenza di lavoro del PIC e/o può esserne data, tramite un apposito piedino, una diversa da quella di lavoro tramite un oscillatore esterno. La funzione timer ha inoltre, la possibilità di avere un divisore di frequenza integrato chiamato PRESCALER, esso divide la frequenza di lavoro di: 2, 4, 8, 16, 32, 64, 128, 256 volte.
Particolarità
La RAM è trattata totalmente come fosse un registro ed ogni suo membro è chiamato file register o più semplicemente file.
Non esiste un accumulatore vero e proprio ma un registro chiamato W (Working register) e i risultati di tutte le operazioni logico aritmetiche possono essere messi indifferentemente nel file operando o in W.
Compilatori con linguaggi evoluti
Il linguaggio di programmazione dei PICmicro è l'assembly, ma sono stati implementati alcuni compilatori per semplificarne la programmazione. Sono disponibili infatti molti compilatori di linguaggi con sintassi simili al BASIC oppure compilatori di C o Pascal. Esistono anche linguaggi gratuiti come Jal e SDCC.
L'utilizzo di linguaggi di programmazione ad alto livello come C, Basic e Pascal permette di riutilizzare codice sorgente sviluppato per altre architetture e garantisce una maggiore leggibilità, nonché una gestione più organizzata delle sezioni di programma. La maggior parte dei compilatori, comunque, permette di inserire sezioni di programma scritte direttamente in assembly, per minimizzare i tempi di esecuzione. I compilatori più conosciuti sono quelli di MikroElektronika ed il compilatore PICC di CCS, tra l'altro riconosciuto come compilatore di terze parti direttamente da Microchip. Microchip mette a disposizione i compilatori C per le famiglie più avanzate: C18, C24, C30 (16bit) e PIC32 (32bit), e una libreria di codice open source per una grande varietà di applicazioni.
Voci correlate
Altri progetti
- Wikimedia Commons contiene immagini o altri file su PIC
Collegamenti esterni
- (EN) Sito ufficiale Microchip Technology Inc.
- (EN) PIC Portal with huge project database
- (EN) Principi fondamentali di PIC 16x84 Guida per principianti per PIC 16x84 ed elettronica.
- (EN) Microchip direct Microchip's direct outlet.
- Robot controllato da PIC16F877A: http://www.calogerolombardo.altervista.org/index.php?option=com_content&view=article&id=50&Itemid=54
- (EN) Database con numerosi codici sorgente in C per PICMicro
- Programmatore per i PICMicro
- Semplice corso di programmazione in C per PICMicro
- Elenco di linguaggi di programmazione disponibili per PICMicro