Come funziona il microcontrollore PIC16F887

Il PIC16F887 è un microcontrollore a 8 bit prodotto da Microchip, appartenente alla famiglia PIC16, molto diffuso in ambito didattico e hobbistico ma anche in applicazioni industriali semplici. È disponibile in package DIP a 40 pin (come quello in foto sotto), caratteristica che lo rende facile da usare su breadboard e schede di sviluppo. Il suo funzionamento si basa sull’integrazione, in un singolo chip, di una CPU, memoria di programma, memoria dati e numerose periferiche hardware che permettono di realizzare sistemi di controllo completi con pochi componenti esterni.

Il cuore del PIC16F887 è una CPU RISC a 8 bit che utilizza un set di istruzioni ridotto, composto da 35 istruzioni. Questo approccio semplifica l’architettura interna e consente tempi di esecuzione prevedibili: la maggior parte delle istruzioni viene eseguita in un singolo ciclo di clock, mentre salti e chiamate di subroutine richiedono più cicli.

Il microcontrollore utilizza un’architettura Harvard, cioè separa fisicamente la memoria di programma dalla memoria dati, migliorando l’efficienza dell’accesso alle istruzioni e ai dati.
La memoria di programma del PIC16F887 è di tipo Flash e ha una capacità di 8K word da 14 bit. Questo significa che il codice può essere scritto, cancellato e riscritto più volte, rendendo il dispositivo adatto allo sviluppo e al debug.

La memoria dati è organizzata in RAM statica e ha una dimensione di circa 368 byte, suddivisa in banchi. A questa si affianca una memoria EEPROM interna da 256 byte, utile per memorizzare dati che devono essere conservati anche in assenza di alimentazione, come parametri di configurazione o contatori.

Il microcontrollore dispone di 40 pin, molti dei quali sono configurabili come ingressi o uscite digitali. Le porte di I/O sono organizzate in gruppi. Ogni pin può essere configurato tramite registri specifici come ingresso o uscita, e in molti casi può svolgere funzioni alternative legate alle periferiche interne. Ad esempio, alcuni pin possono essere utilizzati come ingressi analogici per il convertitore A/D, come linee di comunicazione seriale o come ingressi per i timer.

Una delle periferiche più importanti del PIC16F887 è il convertitore analogico-digitale (ADC) a 10 bit. Questo modulo permette di leggere segnali analogici, come la tensione proveniente da un sensore, e convertirli in valori digitali elaborabili dal software. Il microcontrollore offre fino a 14 canali ADC, a seconda della configurazione dei pin, e consente di selezionare il riferimento di tensione e la velocità di conversione in base alle esigenze dell’applicazione.

Il PIC16F887 integra diversi timer hardware che funzionano in modo indipendente dalla CPU. Il Timer0 è un timer a 8 bit con prescaler, spesso utilizzato per generare ritardi o interrupt periodici. Il Timer1 è un timer a 16 bit, adatto a misure di tempo più precise o al conteggio di eventi esterni. Il Timer2 è un timer a 8 bit con postscaler, spesso usato in combinazione con i moduli PWM. Questi timer permettono di realizzare funzioni temporali senza impegnare costantemente il processore.

Per quanto riguarda la comunicazione, il PIC16F887 dispone di moduli hardware dedicati. Il modulo USART consente la comunicazione seriale asincrona e sincrona, tipicamente utilizzata per dialogare con PC, moduli Bluetooth o altri microcontrollori. È presente anche un modulo MSSP che supporta i protocolli SPI e I2C, molto diffusi per la comunicazione con memorie esterne, display e sensori digitali. L’uso di moduli hardware riduce il carico software e aumenta l’affidabilità delle comunicazioni.

Un’altra caratteristica rilevante è la presenza di moduli CCP (Capture, Compare, PWM). Questi moduli permettono di catturare istanti temporali, confrontare valori di timer o generare segnali PWM. La modulazione PWM è particolarmente utile per il controllo della velocità dei motori, della luminosità dei LED o della potenza erogata a un carico. Nel PIC16F887 sono disponibili due moduli CCP, sufficienti per molte applicazioni di controllo.

Il microcontrollore può funzionare con diverse sorgenti di clock, tra cui oscillatori esterni al quarzo, risonatori ceramici o oscillatori interni. L’oscillatore interno può arrivare fino a 8 MHz e semplifica il circuito riducendo il numero di componenti esterni.

Sono poi disponibili funzioni di risparmio energetico come la modalità Sleep, che riduce drasticamente il consumo quando il microcontrollore non deve eseguire operazioni.
Il funzionamento complessivo del PIC16F887 è governato dal firmware scritto dall’utente, tipicamente in linguaggio C o Assembly, e caricato nella memoria Flash tramite un programmatore ICSP. Una volta alimentato e resettato, il microcontrollore inizia l’esecuzione del programma dalla prima istruzione, interagendo con l’ambiente esterno attraverso i pin e le periferiche interne.