Il continuo aumento delle applicazioni di controllo e l'emergere sempre maggiore dei cosiddetti Embedded Systems sono aspetti di rilevanza fondamentale per quanto riguarda l'aumento di importanza dei microcontrollori nelle odierne applicazioni. Tali dispositivi estendono in un certo senso il concetto di microprocessore in quanto pur costituendo come questo il cuore computazionale della elaborazione del sistema di cui fanno parte, vanno al di la del semplice concetto di dispositivo di calcolo programmabile.
La peculiarità dei microcontrollori non è soltanto quella di costituire un dispositivo general-purpose programmabile in grado di eseguire del firmware, ma anche quella di avere a disposizione una vasta gamma di periferiche che consentono appunto l'interazione con l'ambiente esterno in cui si trovano. Tipicamente, questo sposta il baricentro dell'attenzione nella valutazione di un prodotto dalla mera capacità di calcolo (che pur conserva la sua importanza) ad altre metriche di valutazione quali il numero e il tipo di periferiche presenti, il numero di pin per l'Input/Output (I/O) con l'esterno, la memoria integrata o il tipo applicazione (automotive, industrial, consumer).
Infatti per applicazioni automotive, i microcontrollori devono per esempio essere in grado di funzionare a temperature che arrivano fino a 150 °C ed avere al loro interno periferiche dedicate usate in questo settore come l’interfaccia per il CAN bus e l’interfaccia per il LIN bus. Vediamo quali sono le caratteristiche che differenziano i microcontrollori dai loro “cugini” microprocessori.
Microcontrollori:
-
Hanno al loro interno una o più memorie volatili (RAM) dove vengono immagazzinati i dati temporanei e una o più memorie non volatili (FLASH/EEPROM/ROM) dove viene memorizzato il firmware.
Sono dotati di porte ingresso/uscita (I/O) multifunzione
Sono generalmente usati in applicazioni semplici e a basso costo
Hanno integrati al loro interno diverse periferiche:
Convertitori Analogici/Digitali (A/D) e Digitali/Analogici (D/A)
Timers multifunzione: uscite PWM, Input capture/Output Compare
Periferiche di comunicazione: I2C-SPI-USART-CAN-USB …
Periferiche dedicate: Camera interface, SD-MMC interface, HDMI-CEC interface …
L’esecuzione sequenziale del codice può essere interrotta da particolari eventi (interni/esterni) detti interrupts utili in applicazioni real time (es. segnalazione allarmi)
Microprocessori:
-
Usano memorie volatili e non volatili esterne al dispositivo
Hanno una potenza di calcolo maggiore
Non hanno al loro interno particolari periferiche integrate
Non gestiscono interrupts
Esternamente un microcontrollore e’ simile ad un microprocessore, ma ha solitamente un numero di pins inferiore. Ci sono vari tipi di packages (contenitore) come quelli mostrati in figura.
Se si deve acquistare un microcontrollore, la prima cosa da domandasi è per cosa lo si deve usare e quindi sceglierlo in base alle caratteristiche riportate nei datasheets, che non sono solo caratteristiche elettriche (che hanno la loro importanza: vedi tensione di alimentazione, range di temperatura di utilizzo, frequenza di utilizzo, consumo), ma anche funzionali: numero di periferiche, numero di I/Os, dimensioni delle memorie al suo interno, velocità di processamento …
Elenchiamo di seguito le caratteristiche principali da tenere in considerazione nella scelta del microcontrollore:
-
Frequenza massima di funzionamento
Range di funzionamento (Temperaura, Tensione)
Consumo nelle varie modalità di funzionamento
Tipo di CPU (8, 16 o 32 bit oppure RISC/CISC)
Tipo di Architettura interna (Harvard, Von Neumann)
Tipo di Package (contenitori)
Numero di pin (di segnale, di alimentazione)
Numero di sorgenti di interrupt
Periferiche con DMA (Direct Memory Access)
Dimensione e caratteristiche della memoria programma non volatile (FLASH, EEPROM, ROM)
Dimensione della memoria dati interna volatile (RAM)
Numero e precisione delle sorgenti di clock (Oscillatori interni/esterni)
Numero di modalità a basso consumo
Numero di periferiche ADC, DAC, Timer, di comunicazione I2C, UART
Numero di DMIPS (Dhrystone Million Instructions Per Second)
Possibilità di proteggere il firmware da hacker
Facilità d’uso dell’interfaccia utente di programmazione e debugging
La frequenza massima di funzionamento è un parametro relativamente importante poichè non sempre i microcontrollori che lavorano a frequenza più alta siano più veloci nel processare le informazioni di quelli a frequenza più bassa poiché incidono altri fattori quali l’architettura del microcontrollore e il tipo di CPU. La frequenza massima si riferisce al segnale di sincronizzazione del microcontrollore chiamato clock, che può essere generato da qualsiasi oscillatore.
Il segnale è costituito da un livello di tensione che periodicamente in modo regolare fa una rapida transizione dal valore zero ad un valore che generalmente coincide con la tensione di alimentazione del circuito, rimane a questo livello per un certo tempo e poi in modo altrettanto rapido ritorna a livello zero, rimane a livello zero per un determinato tempo e poi il ciclo si ripete. La commutazione di tutti i circuiti logici avviene durante la transizione di questa tensione. La frequenza massima di funzionamento di un microcontrollore dipende dalla tecnologia usata per realizzarlo, da come è stato progettato (presenza o meno di lunghi percorsi combinatori), dalla temperatura e dalla tensione operativa. Nei datasheet spesso sono riportati i cossidetti shmoo plot che sono un grafico dove in ordinata abbiamo la tensione ed in ascissa la frequenza di funzionamento.
La frequenza degli IMPULSI del clock è misurata in MHz/GHz e indica quanti cicli (operazioni elementari o microistruzioni) la macchina compie in un secondo (o quanti impulsi il clock scandisce). La CPU puo’ essere di tipo:
-
CISC, acronimo dell'inglese Complex Instruction Set Computer. I microcontrollori di tipo CISC hanno un set d’instruzioni complesso, dove ogni istruzione necessità di più impulsi di clock per essere eseguita. (es. STM8)
RISC, acronimo dell'inglese Reduced Instruction Set Computer, indica una filosofia di progettazione di architetture per microprocessori formate da un set di istruzioni contenente istruzioni in grado di eseguire operazioni semplici che possono essere eseguite in tempi simili. (es. ARM Cortex M3, ATMEL AVR, MICROCHIP PIC18F)
Questo parametro spesso può risultare ininfluente nella scelta del microcontrollore poiché nei processori CISC una singola istruzione, anche se per essere eseguita necessita più di un ciclo, può svolgere vari tasks che richiederebbero un numero maggiore di istruzioni singolo ciclo di un micro RISC. Per esempio la presenza del DMA potrebbe alleggerire la CPU da vari tasks (per esempio si puo’ attivare la conversione A/D di vari ingressi del microcontrollore e la periferica stessa memorizza i dati convertiti in memoria senza l’ausilio della CPU).
L’Architettura può essere di tipo:
-
Von Neumann tradizionale (es. Cortex-M0, ST7):
-
Le istruzioni e i dati vengono letti da un’unica memoria
La velocita’ di esecuzione solitamente non supera i 2 Mips
Harvard (es. Cortex-M3, PIC18F, STM8):
-
Usa due spazi di indirizzamento separati per memoria programma e memoria dati
La velocita’ di esecuzione migliora
Si possono avere bus di indirizzamento di diversa ampiezza
Nella figura sopra si vuole enfatizzare il fatto che nei micro con architettura Harvard, la memoria programma e la memoria dati hanno bus di indirizzamento separati indipendentemente dalla loro dimensione.
Nei micro con architettura di tipo Von Neumann le istruzioni sono lette (fetch) decodificate (decode) ed eseguite (execute) sequenzialmente
Nei micro con architettura Harvard la pipeline sovrappone fetch decode ed execution, rendendo possibile l’esecuzione singolo ciclo. Quindi i microcontrollori di ultima generazione hanno solitamente architettura Harvard con diversi livelli di pipe-line.
I microcontrollori della famiglia ARM Cortex-Mx hanno bus standard chiamati AMBA bus (APB bus, e AHB bus). Per collegare le diverse tipologie di bus si usano dei Bridges. Solitamente le periferiche di sistema come il controllore della DMA e il controllore della memoria programma sono collegati al bus AHB mentre le altre periferiche sono collegate al bus APB. Altri microcontrollori proprietari non utilizzano BUS standard, ma dedicati di ampiezza pari al numero di bit della CPU con i quali comunicano con le periferiche interne al sistema.
Secondo me, uno dei parametri per scegliere le prestazioni computazionali di un microcontrollore e’ l’uso dei benchmark es. Dhrystone. Spesso comunque il “collo di bottiglia” delle prestazioni di un microcontrollore è dato dal tempo di accesso alla memoria interna contenete il programma che spesso necessita di “wait states” da parte della CPU. Inoltre esistono microcontrollori low voltage/low power che hanno consumi in stand-by dell’ordine delle centinaia di nano Ampere (TI MPS430, Renesas RL78, Microchip PIC16LF722), anche se io consiglierei sempre di guardare il consumo in RUN espresso in A/MHz che fornisce una vera idea delle tecniche low power impiegate nel design. Una volta descritte le caratteristiche generali dei microcontrollori, vediamo in dettaglio come opera un microcontrollore.
Il microcontrollore è un dispositivo elettronico programmabile, che esegue un programma per svolgere determinate funzioni. Vediamo cosa si intende per programma e dove questo viene memorizzato all’interno del microcontrollore:
Il programma e’ formato da una sequenza di istruzioni, esso viene scritto utilizzando un LINGUAGGIO DI ALTO LIVELLO (cioe’ vicino al linguaggio naturale dell’uomo).
Per essere eseguito dal computer il programma deve essere “tradotto” in linguaggio di basso livello (cioe’ vicino alla macchina), quindi dal programma in Linguaggio di alto livello : es: BASIC, C, FORTRAN, C ++, JAVA si passa al programma in Linguaggio macchina espresso con istruzioni elementari e in codifica binaria (0 e 1). Così le istruzioni vengono memorizzate sulla memoria non volatile in forma binaria e si dividono in 2 o piu’ parti:
CODICE OPERATIVO specifica l’operazione da compiere
OPERANDO/I: le locazioni delle celle di memoria cui l’operazione si riferisce.
Quindi il microcontrollore necessita di essere programmato per eseguire delle operazioni ed interfacciarsi col mondo esterno. Esistono diversi microcontrollori e diversi software per lo sviluppo e il debugging dei programmi che vengono caricati all’interno della sua memoria. Nella scelta di un microcontrollore, spesso il fatto che questi software possano essere free (cioè non avere un costo) e che possano essere utilizzabili su sistemi operativi free (tipo Linux) è stato un elemento determinante per il loro successo. Chiunque può per es. trovare in rete informazioni, tutorial, programmi, applicazioni per i micocontrollori PIC.
Il software di sviluppo e debugging sostanzialmente traduce il programma sviluppato dall’utente in Assembler o C in linguaggio macchina:
Per esempio STVD che è il software di sviluppo per STM8 usa un compilatore COSMIC (free fino a 32k di programma) per tradurre il programma C in file oggetto, che processati dal LINKER, danno il codice esadecimale o binario (HEX) da caricare in memoria.
Attraverso i tools di debugging come MPLAB della Microchip o STVD di ST è possibile o uvision 4 della Keil (che supporta vari vendors di microcontrollori con CPU Cortex-Mx):
-
Selezionare il tipo di debugger (ne possono esistere diversi per lo stesso microcontrollore)
Scaricare il codice .asm nella memoria programma del dispositivo
Resettare il processore attraverso il debugger
Iniziare il debugging del codice avvalendosi dei breakpoints e delle opzioni
Oggi esistono anche delle board di sviluppo a basso costo (es. STM8 discovery, USBSPYDER08 di Freescale, LCPXpresso di NXP per micro basati su Cortex-Mx, che hanno al loro interno il micro, dei tasti, connettori, leds e altro per lo sviluppo di programmi.
Quindi per iniziare, basta scaricare il software di sviuluppo e debugging del microcontrollore, installarlo sul PC, collegare la board di sviluppo con micro al PC ed eseguire qualche tutorial incluso nel software di sviluppo per iniziare a programmare il microcontrollore e fare apparire sul display LCD della board la scritta “Hello Word”.
Utile “rinfrescata” sui concetti principali, architetture e tipologie.
a mio avviso è stato utile sottolineare la differenza tra microcontrollori e microprocessori, troppo spesso ignorata…
(per superficialità o ignoranza, non so e non voglio indagare quando capita 🙂
ottimo lavoro! Hai fatto una bella panoramica sul mondo dei microcontrollori, abbracciando tutti i vari aspetti essenziali che spaziano dal tipo di architettura, ai parametri di scelta fino ad arrivare all’utilizzo degli stessi e quindi all’importanza che rivestono i vari tool hardware e software sia per sperimentare ( con evaluation board e simili) che per sviluppare applicazioni finali. Mi sento di sottolineare ancora una volta l’importanza della documentazione che supporta una famiglia di microcontrollori, intendendo soprattutto l’abbondanza di application notes e framework che spesso è determinante per il successo della data famiglia di micro sui dispositivi concorrenti. È stata una piacevole lettura! Complimenti! 🙂