PIC10F, un piccolo grande microcontrollore

microcontrollore PIC10F

Primo microcontrollore al mondo  ad essere presentato nel case SOT-23, il PIC10F20x offre una soluzione miniaturizzata, ma robusta ed efficace per il controllo in soli 6 pin.

Com’è chiaro agli utenti più attenti alle evoluzioni del mercato, Microchip ha negli ultimi anni spostato la strategia dei propri investimenti verso l’alta gamma (si pensi alle nuovissime famiglie a 16  bit  PIC24, dsPIC30, dsPIC33 e ai moltissimi componenti usciti nella famiglia ad 8 bit PIC18). Pur avendo effettuato una scelta strategica di questo tipo però, la casa di Chandler cerca naturalmente di mantenere il proprio primato nella vendita di microcontrollori ad 8 bit, conquistato nel 2004. In quest’ottica nasce appunto la nuova famiglia di microcontrollori  a 6 pin denominata PIC10F20x, presente nella line card con ben 6 esemplari, suddivisi per dimensione della memoria Flash e periferiche di ingresso. Ad oggi non esistono sul mercato altri microcontrollori di questo taglio, per cui Microchip si crea a tutti gli effetti un nuovo settore, quello della sostituzione dei componenti analogici e dei semplici integrati per la gestione delle funzioni logiche.

Analisi delle caratteristiche tecniche

Come consuetudine, risulta interessante l’analisi di uno dei componenti  di questa famiglia, che conta come detto 6 componenti. Il componente preso in esame è il più prestante dei sei, ossia il PIC10F222. In figura 1 una tabella riassuntiva della famiglia: si noti che sono disponibili anche modelli con convertitore AD a 8 bit.

CARATTERISTICHE DEI MICRO DELLA FAMIGLIA PIC10F
DISPOSITIVO PROGRAM FLASH
(WORDS)
DATA RAM
(BYTES)
OSCILLATORE
INTERNO
COMPARATORI CANALI ADC
(8-BIT)
PIC10F200 256 16 4MHz - -
PIC10F202 512 24 4MHz - -
PIC10F204 256 16 4MHz 1 -
PIC10F206 512 24 4MHz 1 -
PIC10F220 256 16 4/8MHz - 2
PIC10F222 512 23 4/8MHz - 2
Figura 1.   La famiglia PIC10F22x nel dettaglio

PIC10F222, il più grande fra i piccoli

Questo oggetto è disponibile sia nel package SOT-23 che nel tradizionale 8DIP. Quest’ultimo è utile soprattutto al progettista che, durante la fase di debug del prodotto, ha bisogno di rimuovere con facilità il microcontrollore per la programmazione e la sostituzione. Chiaramente in questo caso vi sono due pin non connessi, segnati in figura 3 come NC. Il case SOT-23 (figura 2), al contrario, si presta decisamente a design dalle dimensioni contenute, come ad esempio sensori, applicazioni medicali a contatto col paziente, applicazioni consumer di nuova concezione. Il PIC10F222 è equipaggiato di 768 Byte di memoria programma di tipo Standard Flash, che nel linguaggio di Microchip significa una Flash in grado di operare da 2 a 5,5 Volt, priva di pompa di carica interna e quindi non in grado di esser riscritta durante il normale funzionamento. La Program Memory  ha una larghezza di 12 bit, ragion per cui le effettive righe di programma scrivibili sono 512, come mostrato in figura 4.

Figura 2. PIC10F222 nel case SOT-23

Figura 2. PIC10F222 nel case SOT-23

Figura 3. Lo stesso componente in case DIP

Figura 3. Lo stesso componente in case DIP

Figura 4. Mappatura di memoria del PIC10F222

Figura 4. Mappatura di memoria del PIC10F222

Calcolo delle effettive righe di codice in un microcontrollore

Ogni microcontrollore viene caratterizzato dal numero di Byte di Program Memory. Questo dato, tuttavia, rischia di  essere male interpretato, perché da solo fornisce una indicazione parziale dell’effettiva quantità di codice che può esser scritta. L’altro dato fondamentale, infatti, è la larghezza di una riga di  programma in bit. Questi due dati, opportunamente combinati fra loro, danno una indicazione precisa del numero di righe programma a disposizione.

Poniamo ad esempio:

  • Microcontrollore dotato di 7.168 Byte di Flash
  • Lunghezza della Word pari a 14 bit

Il  numero totale dei bit di flash sarà dato  da 7168x8, quindi 57344. Dividendo il risultato ottenuto per la lunghezza della word si ottiene:
57344/14=4096
che è l'effettivo numero di righe di codice implementabili.

Il microcontrollore, chiaramente, non può essere utilizzato con un clock esterno, dal momento che i 6 pin totali si riducono a 4 per l’imprescindibile presenza dei due pin di alimentazione Vdd e Vss. A questo scopo è stato invece implementato un oscillatore interno di precisione, funzionante a 4 o ad 8MHz e in grado di avere una precisione di ±1% operando a 3 Volt ed alla temperatura di 25 gradi. Lavorando invece nel range di temperatura industriale (0..85°C) e in tutto il range di tensione di alimentazione (2..5,5Volt) la precisione è del 2%, per arrivare fino al 5% che si ottiene lavorando in range di temperatura esteso (-40..+125°C). La tipologia di struttura architetturale rimane la consueta Harvard Modificata, quindi la memoria dati, ossia la RAM, è una regione di memoria fisicamente distinta dalla Program Memory. In particolare, la Data Memory ha larghezza di 8 bit, e così pure il Data Bus. Un’altra caratteristica dei microcontrollori basati su Architettura di Harvard consiste nell’avere un set di istruzioni ridotto  (RISC), che  nel  caso del PIC10F222 è pari a 33. Ognuna di queste istruzioni è eseguita ogni 4 cicli di  clock, ragion  per cui si esegue una istruzione ogni microsecondo nel caso di clock a 4MHz oppure ogni 500 nanosecondi nel caso di clock a 8MHz. Ognuna di queste istruzioni, però, porta un contenuto informativo a sé stante, ad esempio una operazione di ADD esegue la somma in un ciclo macchina e così via. Questa caratteristica rende i microcontrollori  RISC facilmente “controllabili” dal punto di vista dei tempi di esecuzione, dal momento che ogni istruzione esegue una ben precisa operazione logico-matematica o una azione sui registri speciali della macchina (SFR).

Calcolo del tempo di esecuzione di una istruzione

Ogni microcontrollore è in grado di eseguire una istruzione sfruttando un certo numero di cicli di clock. Nel caso dei microcontrollori Microchip della famiglia PIC10F22x ogni istruzione necessita di 4 cicli di clock per poter essere eseguita. Considerando ad esempio che il clock interno del microcontrollore funziona ad 8MHz è possibile dedurre quanto segue:

  • 8MHz x 125nsec (la durata di un ciclo di clock è l’inverso della frequenza);
  • 4x125=500nsec è il tempo di esecuzione di una istruzione.

I livelli di stack disponibili sono 2, per cui si potrà eseguire una sola CALL per volta, senza la possibilità di annidare altre chiamate a procedura. Questa caratteristica non deve però esser vista come una forte limitazione, dal momento  che con sole 512 righe di programma sarà più che sufficiente l’utilizzo di una sola CALL per volta. Ogni pin di I/O, come consuetudine nei PIC, è in grado portare in uscita o di accettare in ingresso sino a 25mA di corrente ed è equipaggiato con diodi di clamp interni per la protezione della porta stessa.
Il microcontrollore è dotato di un Timer interno ad  8  bit,  fondamentalmente utilizzabile per la base dei tempi, ossia il TIMER0. Questo registro può essere anche utilizzato con il Prescaler presente a bordo micro (figura 5), per poter effettuare un conteggio ad ogni numero fissato di colpi di clock. Con questa tecnica si potranno contare tempi pari a qualche decina di millisecondi. Questo Prescaler può anche essere utilizzato dal WatchDog  di  sistema, al fine di poter impostare un tempo di refresh più lungo rispetto a quello possibile con il solo utilizzo del Watchdog timer ad 8 bit. Com’è noto, Microchip ha da sempre puntato su prodotti adatti all’utilizzo su sistemi a batteria, e quindi caratterizzati dai bassissimi consumi. Da qualche anno è stata rilasciata una tecnologia altamente innovativa, denominata  NanoWatt©, che consente di avere bassissimi consumi  in modalità sleep e di poter “modulare” la potenza assorbita dal microcontrollore accendendo o spegnendo le varie periferiche. Nel caso del PIC10F222, infatti, è possibile ridurre la corrente assorbita sino a 100nA, in modalità sleep, mentre è possibile accendere il modulo AD Converter, effettuare la lettura del segnale analogico e successivamente spegnere il modulo, ottimizzando di conseguenza il consumo. É  importante  porre in evidenza le diverse modalità con le quali il micro può esser risvegliato dallo stato di sleep: la prima è il classico trigger esterno, noto come Wake up from Pin Change. Altre modalità di risveglio sono: tramite l’intervento del Watchdog Timer, l’utilizzo del comparatore (che percepirà l’informazione sul raggiungimento di una certa soglia logica esterna), una sul pin di Master Clear (reset di sistema).

Figura 5. Utilizzo del Prescaler

Figura 5. Utilizzo del Prescaler

In figura 6 la tabella delle caratteristiche elettriche, tratta dal Data Sheet del componente. Un cenno merita infine il citato stadio comparatore, il quale è in grado di accettare all’ingresso segnali di tipo multiplexato invertente e non invertente e genera il risultato della comparazione portandolo esternamente sul pinGP2 oppure salvando internamente il risultato logico sul bit 7 del registro CMCON0.

Figura 6. Caratteristiche elettriche del PIC10F222

Figura 6. Caratteristiche elettriche del PIC10F222

In figura 7 la struttura a blocchi del comparatore. Per rendere il componente quanto più possibile compatibile con le caratteristiche dei componenti Microchip  di altre famiglie, anche la PIC10Fxxx è dotata dell’interfaccia di programmazione In Circuit Serial Programming®. Sarà quindi possibile programmare il dispositivo anche dopo il montaggio a bordo scheda, attraverso l’interfaccia standard ai dispositivi di programmazione. È pure possibile effettuare un debug avanzato del componente, facendo affidamento all’ “In Circuit Debugging Support”, che supporta anche la interessante possibilità di poter avere un Breakpoint Hardware, in cui l’ICD2 mantiene fisicamente ferma la macchina, consentendo una analisi attenta dei parametri della scheda tramite oscilloscopio.

Figura 7. schema a blocchi del comparatore

Figura 7. schema a blocchi del comparatore

I programmatori Microchip che supportano la famiglia  PIC10F sono dunque il citato ICD2, il PicStart Plus (solo per la versione Dual In Line), il ProMate 2, ormai non più vendibile, ed il nuovo Pro Mate 3, che ha sostituito il modello obsoleto. Come tool di sviluppo è poi importante menzionare il PIcKit 1, tramite il quale è possibile debuggare ed analizzare tutte le periferiche sopra citate della famiglia PIC10F. Sia il PICKit1, che l’ICD2, che il PICStart Plus possono poi esser interfacciati comodamente ai PIC10F tramite l’Universal Programmer Adapter Board AC163020 della quale si riporta una foto in Figura 8.

Figura 8. PIC10F2XX Universal Programmer Adapter

Figura 8. PIC10F2XX Universal Programmer Adapter

Per finire, dal momento che questi dispositivi si prestano a funzioni davvero fini, quali sostituzione di elementi discreti o passivi, o di integrati che potrebbero esser critici per l’applicazione, è pure possibile mantenere protetto da letture esterne tramite il “Programmable  Code Protection”.

Applicazioni tipiche

Glue Logic Universale

Le applicazioni cui la famiglia PIC10F2XX si presta sono molteplici. Ad esempio, il PIC10F2XX ben si presta ad interfacciare un ASIC ad una interfaccia esterna di cui non è noto a priori lo standard, realizzando quindi una sorta di Glue Logic universale (figura 9).

Figura 9. La Glue Logic universale con PIC10F

Figura 9. La Glue Logic universale con PIC10F

Sarà quindi possibile avere continui update di questa interfaccia, vista la riprogrammabilità del PIC, ed avere la necessaria duttilità al ricevere e trasmettere i dati nei diversi formati possibili (Manchester, PWM, e non; PPM etc…). Fatto certamente importante, il risparmio economico derivante dall’utilizzo di un ASIC privo di queste interfacce è notevolmente maggiore del costo del  PIC, per cui anche dal punto di vista commerciale l’applicazione avrà un notevole valore aggiunto.

Generazione di sinusoidi

Un’altra applicazione certamente interessante è la generazione di una forma d’onda  sinusoidale tramite PIC10F. Certamente, chi opera con la manipolazione dei segnali ben conosce le difficoltà  ed il costo nella realizzazione di un buon Phase Shift Oscillator, non ultimo per la necessità di scegliere un ottimo operazionale a 4 stadi. Oggi, con un PIC10F200 e un RC esterno è possibile ottimizzare e semplificare la realizzazione di un circuito oscillante, oltre ad avere la possibilità di generare una ampiezza variabile cambiando il duty cycle dell’uscita. Nella figura 10 sono riportate le soluzioni classiche ad amplificatori  operazionali e la soluzione con PIC10.

Figura 10. Generazione di forme d’onda sinusoidali: soluzioni classiche e soluzione con PIC10

Figura 10. Generazione di forme d’onda sinusoidali: soluzioni classiche e soluzione con PIC10

Un esempio di codice

Per completezza, si lascia ai lettori una base di lavoro, realizzata in Assembly in grado di porre il microcontrollore in un loop infinito, protetto da Watchdog (procedura chiamata “Loop Principale”). Non viene realizzata alcuna funzione, ma il semplice firmware può esser preso quale base di partenza per le numerosissime applicazioni cui il PIC10F222 si presta.

Inizio:
     list p=10f222
     #include   <p10f222.inc>
     __CONFIG   _WDT_ON
     ERRORLEVEL -302
;********************************
;*   Definizione Variabili
;********************************
FLAG0     EQU   0X09  ; Variabile per la creazione di FLAGS

;********************************
;*   Definizione Flags
;********************************

#define    time  FLAG0,0      ; Gestione dei Flags


;************************************************
;*   Vettore di Reset INIZIO DELLA PROGRAM MEMORY
;************************************************
     ORG              0x000
     NOP
     GOTO       START



;****************************************
;*   Tabelle
;****************************************
     ORG 0x006
     TABLE_AD
     ADDWF PCL,F
     RETLW B'00000100'             ; Scegli quale AD di PORTB leggere
     RETLW B'00001000'
     RETLW B'00010000'

     ORG 0x00B
TABLE_LED
     ADDWF PCL,F           ; Scegli quali LED accendere contemporaneamente!
     RETLW .0
     RETLW .12
     RETLW .24
     RETLW .32




;****************************************************************
;****************************************************************
;*                   INIZIO DEL PROGRAMMA
;****************************************************************
;****************************************************************

START
     CALL INIT_PORT
     CALL INIT_TMR0
     CALL INIT_VARIABILI


;************************************************
;          LOOP Principale
;************************************************
LOOP
     CLRWDT
     GOTO LOOP


;************************************************
;          Procedure chiamate
;************************************************

INIT_PORT
     CLRF GPIO
     TRIS GPIO
     RETURN


INIT_TMR0
     MOVLW .131
     MOVWF TMR0
     RETURN

INIT_VARIABILI
     CLRF FLAG0
     RETURN


     END

 

5 Commenti

  1. Maurizio Di Paolo Emilio Maurizio 3 febbraio 2016
  2. testato 3 febbraio 2016
    • Emanuele Bonanni Emanuele 4 febbraio 2016
  3. testato 4 febbraio 2016
  4. Michele Mirabella Mchele Mirabella 24 febbraio 2016

Scrivi un commento