Seconda e ultima puntata della serie "La famiglia dei micro PIC16LF1705-09: potenza ad 8 bit con bassi consumi" per la Rubrica Firmware Reload, all'interno della quale sono presenti gli articoli tecnici della passata rivista cartacea Firmware. Nonostante la presenza sempre più massiccia dei microcontrollori a 32 bit ad alte prestazioni, i “classici e sempreverdi” micro ad 8 bit continuano a riscuotere il favore dell’industria. Questo, per diverse ragioni, tra le quali le dimensioni estremamente contenute ma soprattutto, in periodi di risparmio energetico, per il loro bassissimo assorbimento rispetto ad altri componenti più prestazionali ed ingombranti.
LE ALTRE PERIFERICHE
Fin qui sono state presentate le novità portate dai microcontrollori PIC16(L) F105/09 rispetto ai loro simili un pò più datati, tuttavia, nella presentazione di un microcontrollore non può mancare una carrellata più o meno veloce delle caratteristiche e delle periferiche più significative che quest’ultimo offre. Per quanto riguarda le caratteristiche principali, si tratta di microcontrollori con una architettura RISC con sole 49 istruzioni, capaci di lavorare con frequenze da 0 a 32 MHz, e con un tempo minimo di esecuzione di una istruzione di 125ns.
I microcontrollori presentati portano a bordo numerose periferiche analogiche e digitali, di seguito una breve descrizione di quelle più comunemente usate:
Il Watchdog Timer: È un timer di sistema che genera un segnale di reset per il microcontrollore nel caso in cui il firmware non esegue un'istruzione CLRWDT, entro un determinato time out, ovvero, se per qualche problema dovuto all’hardware/software il firmware non provvede a riazzerare il clock del Watchdog Timer, quest’ultimo provvede a generare un segnale di reset per il microcontrollore. Questo timer viene pertanto usato per il ripristino del sistema in seguito ad eventi inaspettati. Il Watchdog Timer può lavorare anche durante la modalità di sleep e può generare una interruzione capace di risvegliare il microcontrollore, ha un proprio clock e diverse modalità di funzionamento, con un time-out regolabile da 1 a 256 ms.
Timer: I timer sono periferiche utilizzate dal microcontrollore per la generazione di interrupt ad istanti prefissati di tempo. Ogni periferica ha un registro interno di conteggio che viene incrementato ad istanti precisi di tempo, quando questo registro va in overflow, il timer genera un interrupt. Settando in modo opportuno le modalità ed i tempi di incremento del registro di conteggio, è quindi possibile generare segnali di interrupt in modo preciso e costante. Per il settaggio dei timer spesso si utilizzano due appositi registri: il prescaler e il postscaler. Il prescaler viene utilizzato da quasi tutti i timer e si occupa di settare il valore del divisore per il clock del microcontrollore in modo da generare il clock interno per il timer. Il postscaler, invece, si trova a valle del timer e fissa il moltiplicatore per la generazione dell’interrupt, ovvero, quanti overflow del timer sono necessari a creare un interrupt. Gli interrupt verranno poi utilizzati dal microcontrollore per comandare altre periferiche o per svolgere operazioni che richiedono un preciso campionamento. I microcontrollori presentati in questo articolo portano a bordo cinque periferiche di questo tipo, ovvero il Timer0, Timer1, Timer2, Timer4 e Timer6. Il Timer0 è un periferica ad 8 bit utilizzabile come timer, ovvero se non è impostato il prescaler, il registro del contatore viene incrementato dopo ogni istruzione, oppure come contatore in cui il registro del contatore viene incrementato ad ogni fronte di salita o discesa del clock. Il Timer0 supporta un registro di prescaler ad 8 bit, è possibile settare per il timer un clock interno o esterno o utilizzare il timer stesso come una sorgente di clock per altre periferiche. Il Timer0 durante la modalità sleep si congela conservando i valori presenti nei propri registri. Il Timer1 a differenza del Timer0 lavora su 16 bit con un prescaler di 2 bit, se connesso ad un clock interno lavora come timer incrementando ad ogni istruzione il registro del contatore di quattro. Quando viene connesso ad un clock esterno, invece, lavora come contatore incrementando di uno il proprio contatore ad ogni fronte di salita del clock. Inoltre, se collegato ad un clock esterno, il Timer1 può lavorare anche durante la modalità di sleep, generando nel caso un interrupt di risveglio per il microcontrollore. I Timer2, Timer4 e Timer6 sono tre timer uguali per costruzione e prestazioni, sono timer ad 8 bit che per motivi di compatibilità con i firmware scritti per microcontrollori più datati hanno mantenuto nel tempo i vecchi nomi. Hanno un prescaler a 4 bit ed un postscaler a 8 bit, e come il Timer0 non lavorano durante la modalità di sleep.
Comunicazioni Seriali: Facendo un brevissimo riepilogo sulle periferiche per la comunicazione seriale a bordo del microcontrollore (per una trattazione più dettagliata si rimanda al datasheet o a testi specifici), quest’ultimo supporta i più comuni protocolli seriali sincroni (SPI e I2C) e asincroni (RS232, RS485). Per quanto riguarda la comunicazione SPI ed I2C può lavorare sia da master che da slave, inoltre per la modalità I2C è possibile utilizzare per il settaggio dell’indirizzo del dispositivo da 7 a 10 bit collegando, teoricamente, fino a 1024 dispositivi sullo stesso bus. Inoltre, è possibile mantenere attiva la comunicazione durante la modalità di sleep, nel caso di comunicazione I2C e di dispositivo in modalità sleep, l’arrivo di un eventuale pacchetto provvede a generare il segnale di risveglio per il microcontrollore. Per quanto riguarda le comunicazioni asincrone in funzione del clock del microcontrollore e mediante i registri SPBRGL e SPBRGH è possibile impostare il valore desiderato di baud-rate per un massimo di 115200 bit/s, o utilizzare per quest’ultimo l’apposita funzione di auto-detect.
PWM: Pulse-Width Modulation è un segnale digitale di cui è possibile settare il duty cycle, il periodo e la risoluzione. Il microcontrollore porta a bordo 4 periferiche PWM, ognuna della quali connessa al proprio pin d’uscita. Variando il registro PR2 è possibile variare il periodo e la risoluzione (max 10 bit) del segnale, mentre i registri PWMxDCH e PWMxDCL vengono usati per settare il duty cycle. La frequenza di lavoro del PWM è funzione della frequenza del microcontrollore, inoltre, la periferica si congela nel caso in cui sia attiva la modalità sleep.
Modulo Temperatura: I microcontrollori portano a bordo un modulo per la misura della temperatura interna, questo ha un campo di funzionamento da -40°C a +85°C e genera una tensione d’uscita proporzionale alla temperatura che è collegata internamente con l’ADC. In questo modo, è possibile implementare un rilevatore di soglia per temperatura, o semplicemente un termometro in funzione della calibrazione interna del microcontrollore. Il tempo minimo di aggiornamento per la misura della temperatura è di 200 micro secondi, ovvero il tempo di conversione dell’ADC.
Amplificatori Operazionali: I microcontrollori montano a bordo due amplificatori operazionali, con un bassa dispersione sui pin d’ingresso e un offset d’ingresso calibrato, per i quali è possibile settare il prodotto banda-guadagno. Rispettando alcune condizioni in termini di tensioni di modo comune, dispersione della corrente in ingresso, tensioni di offset, guadagno in anello aperto e prodotto banda-guadagno, è possibile migliorare le prestazioni degli operazionali. Per la tensione di modo comune, ovvero la tensione tra i pin d’ingresso, per un corretto funzionamento del dispositivo questa deve variare all’interno di un range tra Vss e Vdd. Per quanto riguarda la possibile dispersione di corrente sui pin d’ingresso, questa può essere ridotta diminuendo l’impedenza equivalente vista dai pin ed assicurandosi che i due pin vedano rispetto a massa due impedenze più simili possibile. L’offset in ingresso è una tensione presente tra i piedini dell’operazionale, quando quest’ultimo lavora in retroazione, tale tensione viene amplificata e riportata sulla propria uscita dal dispositivo, pertanto è chiaro che anche piccole tensioni di offset possono portare grandi variazioni sull’uscita, come già detto i microcontrollori sono calibrati in maniera tale da ridurre il più possibile gli offset. Il guadagno ad anello aperto rappresenta il guadagno di tensione tra la tensione d’uscita e quella presente sui pin d’ingresso del dispositivo, è un parametro elevato nel caso di tensioni continue e decresce al crescere della frequenza delle tensioni d’ingresso. Infine, il prodotto banda-guadagno GBWP, rappresenta la frequenza alla quale la curva di guadagno ad anello aperto dell’operazionale raggiunge 0 dB, un basso GBWP si presta bene nel caso di applicazioni che lavorano a basse frequenze e richiedono bassi consumi d’energia.
Comparatori: Si tratta di normalissimi comparatori, ovvero circuiti usati per interfacciare segnali analogici con segnali digitali, connettendo due segnali analogici sui piedini del comparatore; questo genererà un segnale digitale che avrà un livello alto se la tensione sul pin positivo del comparatore è maggiore della tensione sul pin negativo, e avrà un livello basso in caso contrario. I microcontrollori portano al loro interno due comparatori, controllabili indipendentemente, in cui è possibile selezionare l’input, scegliere se ottimizzare velocità o consumo di energia durante il confronto, e fissare eventuali tensioni di riferimento per gli ingressi del comparatore. È altresì possibile selezionare se invertire o meno l’uscita del comparatore o permettere a quest’ultimo di generare un interrupt da utilizzare poi con altre periferiche o per risvegliare il microcontrollore nel caso in sui sia in modalità sleep.
ADC: Si tratta del classico convertitore analogico-digitale, i microcontrollori in questione ne portano a bordo 8 con una risoluzione di 10 bit. È possibile configurare per questa periferica le tensioni di riferimento (Vref, Vdd, FVR 2,048V, Vss) e il clock da usare per le operazioni di conversione (Fosc/2, Fosc/4, Fosc/8, Fosc/16, Fosc/32, Fosc/64, Oscillatore RC). Il risultato della conversione viene salvato in due registri a 8 bit e può essere giustificato a sinistra o a destra. La periferica lavora anche durante la modalità di sleep e nel caso può generare un segnale di interrupt per risvegliare il microcontrollore.
Zero-Cross Detector: Questa periferica si occupa di individuare se un segnale tempo variante raggiunge o meno una certa soglia. Tale soglia idealmente è di 0 Volt ma in realtà è la soglia di crossing della Vref che tipicamente ha un valore di 0,75 Volt. La periferica è connessa al segnale da controllare attraverso una serie di resistori e si occupa di mantenere una tensione costante pari alla tensione di riferimento sul pin a cui è connesso il segnale. Se il segnale ha una tensione propria minore della tensione di riferimento, la periferica si comporta da generatore, mentre se il segnale ha una tensione propria maggiore della tensione di riferimento, la periferica si comporta da carico. Al variare del comportamento della periferica viene settato un opportuno registro sul microcontrollore, che permette all’utente di individuare gli istanti in cui il segnale tempo variante scende sotto la soglia. Questa periferica viene usata, pertanto, per individuare il periodo di un segnale periodico o in caso di lunghe campagne di misurazione di un segnale.
DAC: È il convertitore digitale-analogico che fornisce in uscita tensioni in funzione dell’input digitale a 8 bit, con una risoluzione quindi di 256, l’uscita di questo può essere usata come tensione di riferimento o come alimentazione per dispositivi esterni. Inoltre, è possibile utilizzarla con altre periferiche del microcontrollore come segnale d’ingresso per i comparatori o come ingresso dell’ADC. Questa periferica continua a funzionare anche durante la modalità sleep.
In questa serie di articoli, abbiamo presentato una nuova gamma di microcontrollori economici e studiati per applicazioni che richiedano bassi consumi, abbiamo dato una, seppur appetibile, brevissima descrizione delle caratteristiche di questi dispositivi, per ulteriori dettagli si rimanda al ben più esaustivo datasheet.