b'\n_START_ARTICLE_\nPIC (microcontrollore)\n_START_PARAGRAPH_\nPIC \xc3\xa8 una famiglia di circuiti integrati a semiconduttore con funzioni di microcontrollore._NEWLINE_Microchip Technology non usa il termine PIC come un acronimo: il suo nome aziendale \xc3\xa8 "PICmicro". Anche se generalmente sta per "Programmable Interface Controller", il suo primo produttore (la "General Instrument") usava l\'acronimo per "Programmable Intelligent Computer"._NEWLINE_Inizialmente sviluppato nel 1975, \xc3\xa8 in grado di svolgere un set di istruzioni ridotto (RISC): la versione pi\xc3\xb9 piccola ha 33 istruzioni assembly._NEWLINE_Ad oggi, sono disponibili microcontroller PIC a 8 bit (serie PIC10, PIC12, PIC16 e PIC18), a 16 bit (serie PIC24 e dsPIC) e a 32 bit (PIC32), quest\'ultimi di architettura radicalmente diversa, poich\xc3\xa9 basati su un core MIPS32 M4K.\n_START_SECTION_\nVersioni a 8 bit\n_START_PARAGRAPH_\nNell\'arco del tempo, ne \xc3\xa8 stata resa disponibile una ampia variet\xc3\xa0 di versioni dei PIC a 8 bit, diverse per tecnologia costruttiva, forma fisica (numero di piedini), quantit\xc3\xa0 o tipo di memoria, oltre alle funzioni di ingresso e uscita._NEWLINE_Per quanto riguarda la memoria di programma, 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._NEWLINE_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). Si noti che la serie C \xc3\xa8 ormai obsoleta, per cui le versioni pi\xc3\xb9 usate sono quelle con memoria di tipo FLASH, che si possono programmare tantissime volte in breve tempo per mezzo di un programmatore ICSP (In-Circuit Serial Programming)._NEWLINE_Il PIC pi\xc3\xb9 conosciuto \xc3\xa8 il PIC16F84: ormai \xc3\xa8 stato soppiantato dal pi\xc3\xb9 completo PIC16F88, con il quale \xc3\xa8 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 numerose 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\xc3\xb2 essere utilizzata come ingresso generico (RA5), ma non come uscita. Inoltre si pu\xc3\xb2 leggere e scrivere la memoria di programma (e non solo la EEPROM dati) direttamente da codice._NEWLINE_Con la stessa piedinatura del 16F84, oltre al gi\xc3\xa0 citato 88 (e 87, uguale all\'88 ma senza A/D), ci sono i 627/628/648A, 716 e 818/819. Esistono poi altre versioni simili, ma con maggiori piedini di ingresso e di uscita (ad esempio le versioni 16F876 e 16F877). Quest\'ultima serie garantisce un set di periferiche molto pi\xc3\xb9 esteso, consumi minori e soprattutto costi minori. Il diretto equivalente del 16F84 \xc3\xa8 il 18F1220, che comprende anche una USART, una MSSP, ingressi analogici ed altro._NEWLINE_La serie speciale 18FJ, non disponendo di EEPROM a bordo, \xc3\xa8 la serie pi\xc3\xb9 economica prodotta da Microchip. Utilizzando infatti microcontrollori con pi\xc3\xb9 memoria di programma rispetto a quanta effettivamente necessaria, \xc3\xa8 possibile scrivere su quest\'ultima riservandosi una zona ad uso simil-EEPROM._NEWLINE_Vi sono poi microcontroller PIC che spiccano per l\'impiego in una specifica applicazione: ad esempio, i 16F1455 e i 18F2550 hanno supporto hardware allo stack USB 2.0, cos\xc3\xac come i PIC18F67J60 integrano un controller Ethernet mentre i 16F1933 sono spesso utilizzati nel controllo di display fino a 60 segmenti grazie ad un driver integrato._NEWLINE_Le serie pi\xc3\xb9 recenti, le cosiddette "Enhanced" e "Enhanced Mid-Range" (12F1xxx, 16F1xxx, 18F1xxx) aumentano ancor di pi\xc3\xb9 il numero di periferiche a disposizione: il PIC 16F1769, ad esempio, aggiunge DAC, celle logiche programmabili, amplificatori operazionali integrati sul DIE, rivelatori di zero-crossing e capacit\xc3\xa0 di erogare maggior corrente sugli I/O, tutto al fine di ridurre il part count e quindi il costo totale del progetto.\n_START_SECTION_\nIstruzioni\n_START_PARAGRAPH_\nIl set di istruzioni del PIC ne comprende 33 nelle versioni di bassa potenza e fino a 77 in quelli con prestazioni pi\xc3\xb9 elevate._NEWLINE_Per essere eseguita, ogni istruzione 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 di dati tra memoria e memoria (MOVFF).\n_START_SECTION_\nArchitettura interna\n_START_PARAGRAPH_\nL\'architettura \xc3\xa8 di tipo Harvard a bus separati; i bus dati e controllo sono a 8 bit, mentre le istruzioni hanno un formato a 12, 14, 16 o 32 bit._NEWLINE_Nelle ultime versioni \xc3\xa8 stata implementata un\'architettura a 16 bit o 32 bit. Esiste anche il bus dello stack a partire da 9 bit in su.\n_START_SECTION_\nMemorie\n_START_PARAGRAPH_\nA causa dell\'architettura RISC, dove nell\'istruzione oltre al significato \xc3\xa8 compreso anche l\'indirizzo di memorizzazione o di salto, la memoria viene segmentata. Per cambiare segmento in uso occorre agire su appositi registri, fatto che complica la programmazione dei PIC tramite linguaggio assembly, ma non quella con linguaggi di alto livello.\n_START_SECTION_\nRAM\n_START_PARAGRAPH_\nLa RAM ha una larghezza di 8 bit e una profondit\xc3\xa0 che varia da pochi byte (25 nei PIC16C5x) fino a qualche kilobyte.\n_START_SECTION_\nDi programma\n_START_PARAGRAPH_\nLa 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\xc3\xa0 varia da 512 byte a 128 kibibyte (KiB).\n_START_SECTION_\nStack\n_START_PARAGRAPH_\nLo stack \xc3\xa8 un tipo di memoria, separata da quella principale, caratterizzata da un particolare metodo di accesso (LIFO). \xc3\x88 dotato di un suo bus la cui profondit\xc3\xa0 va da 2 posizioni a 8 posizioni e giunge alle 31 nei PIC della serie 18. La sua larghezza parte da 9 bit.\n_START_SECTION_\nEEPROM\n_START_PARAGRAPH_\nNelle versioni con memoria flash pu\xc3\xb2 essere presente una memoria interna di tipo EEPROM accessibile come se 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.\n_START_SECTION_\nPeriferiche\n_START_PARAGRAPH_\nLa presenza di periferiche a bordo del chip \xc3\xa8 uno degli aspetti che fanno 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\xc3\xa0 di altre funzioni.\n_START_SECTION_\nI/O paralleli\n_START_PARAGRAPH_\nLa funzione di ingresso e uscita di dati digitali \xc3\xa8 stata la prima funzione implementata. Nei PIC \xc3\xa8 divisa in porte da 8 o meno bit ognuna. \xc3\x88 possibile programmare ogni bit come ingresso o come uscita singolarmente._NEWLINE_In alcuni casi \xc3\xa8 possibile attivare dei resistori interni (weak pull-up) per facilitare il collegamento con pulsanti ed interruttori._NEWLINE_I PIC pi\xc3\xb9 recenti dispongono inoltre di celle logiche programmabili alla stregua di un CPLD di dimensioni ridotte.\n_START_SECTION_\nI/O seriali\n_START_PARAGRAPH_\nPu\xc3\xb2 essere presente una grande variet\xc3\xa0 di porte seriali: I\xc2\xb2C, USART, SPI, CAN/LIN, USB ed Ethernet.\n_START_SECTION_\nI/O analogici\n_START_PARAGRAPH_\nVi sono PIC con comparatori, ADC, DAC, generatori di rampa (PRG), rivelatori di zero-crossing (ZCD), generatori di forma d\'onda complementare (CWG/COG), amplificatori operazionali integrati e altro ancora.\n_START_SECTION_\nPWM\n_START_PARAGRAPH_\nVi possono essere multipli canali PWM solitamente a 10 o 12 bit.\n_START_SECTION_\nTimer\n_START_PARAGRAPH_\nSu tutte le versioni \xc3\xa8 implementato almeno un temporizzatore da 8 bit. Si arriva fino a 5 temporizzatori con larghezze a 8 o 16 bit. Su tutte \xc3\xa8 inoltre implementato un temporizzatore speciale chiamato WDT (Watch Dog Timer), che serve (se utilizzato) a far ripartire il microcontrollore in caso di blocco del programma._NEWLINE_Il timer funziona in base alla frequenza di lavoro del PIC e/o pu\xc3\xb2 utilizzarne, tramite un apposito piedino, una diversa da quella di lavoro tramite un oscillatore esterno._NEWLINE_Ad ogni timer, inoltre, pu\xc3\xb2 essere associato un divisore di frequenza integrato chiamato PRESCALER, che divide la frequenza di lavoro di: 2, 4, 8, 16, 32, 64, 128, 256 volte.\n_START_SECTION_\nParticolarit\xc3\xa0 dell\'architettura\n_START_PARAGRAPH_\nLa RAM \xc3\xa8 trattata totalmente come fosse un registro ed ogni suo membro \xc3\xa8 chiamato file register o pi\xc3\xb9 semplicemente file._NEWLINE__NEWLINE_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.\n_START_SECTION_\nCompilatori con linguaggi evoluti\n_START_PARAGRAPH_\nI PIC vengono programmati generalmente in C o in Assembly, quest\'ultimo comune soprattutto con i PIC di vecchia generazione o, pi\xc3\xb9 in generale, con versioni aventi una ridotta memoria o profondit\xc3\xa0 di stack._NEWLINE_Microchip offre compilatori ufficiali per entrambi i linguaggi: MPASM, XC8, XC16, XC32, integrati con l\'IDE MPLAB X. L\'ambiente di sviluppo, i compilatori e i driver dei programmatori sono oggi disponibili per Windows, MacOS e Linux._NEWLINE_In ogni caso, PIC ha una lunga tradizione di compilatori di terze parti sia per il C (MikroElektronica, CCS) sia per linguaggi meno "canonici" dal punto di vista della programmazione embedded, quali BASIC o Pascal._NEWLINE_Esistono anche compilatori open source: SDCC e Jal, oltre allo stesso XC32 di Microchip.'