Home » Programmare i microcontrollori: dagli strumenti alla strategia

microcontrollori

I microcontrollori sono uno dei componenti fondamentali di numerosi dispositivi elettronici, dal comune forno a microonde al personal computer. In un periodo storico in cui l’industria 4.0 e l’IoT (Internet delle Cose) continuano a svilupparsi in modo costante e repentino, i microcontrollori rappresentano una soluzione sicura e ben collaudata nel campo dell’elettronica per il supporto di una vasta gamma di opzioni di connettività. Ma di cosa si tratta esattamente? Scopriamolo in questo articolo. 

Cos’è un microcontrollore?

Un microcontrollore è un dispositivo elettronico integrato impiegato come soluzione alternativa al microprocessore e utilizzato soprattutto nei sistemi embedded per applicazioni specifiche di controllo digitale. 

Un microcontrollore può essere considerato come un piccolo computer a cui è possibile collegare, ad esempio, un display, dei pulsanti o altri sensori appositamente programmati affinché siano in grado di eseguire specifiche funzioni. 

Un microcontrollore racchiudere in un piccolo “pacchetto” (da cui la connotazione di integrato) vari componenti come la CPU e la memoria di archiviazione. Per poter collegare le periferiche ed interagire con l’esterno è dotato di diversi pin di ingresso e uscita. Ovviamente affinché il microcontrollore sia concretamente utilizzabile deve essere programmato attraverso un insieme di istruzioni che vanno a “costruire” il firmware del sistema installato nella memoria del dispositivo. 

Qual è la differenza tra microcontrollore e microprocessore?

I microcontrollori sono impiegati in alternativa ai microprocessori, ma quali sono le differenze tra questi due dispositivi? I microprocessori vengono utilizzati in tutte quelle applicazioni in cui non vi è un’attività predefinita, ma è l’utente a scegliere come utilizzarlo; vengono utilizzati in tutti quei contesti in cui serve un’elevata potenza di calcolo. Per queste ragioni, un microprocessore contiene solitamente solo la CPU, ossia l’unità centrale di elaborazione, mentre tutti gli altri componenti vengono collegati esternamente.

Un microcontrollore, invece, viene impiegato soltanto per attività specifiche. Questo dispositivo esegue delle elaborazioni e fornisce dei risultati in base all’input di ingresso; è un esempio del suo impiego quello della gestione dei programmi di una lavatrice, o dei programmi di cottura di un microonde. Vista la limitata applicazione dei microcontrollori, questi ultimi contengono al loro interno sia l’unità di memoria che le porte di I/O, motivo per cui sono più grandi rispetto ai microprocessori. 

Altre differenze sostanziali tra microprocessori e microcontrollori riguardano:

  • Velocità del clock: un microprocessore ha un clock molto più elevato perché più elevate sono le velocità a cui deve lavorare. La velocità di clock di un microprocessore si aggira in un ordine di misura di qualche gigahertz, mentre in un microcontrollore si rientra nell’intervallo dei megahertz. 
  • Capacità di memoria: la quantità di memoria RAM e ROM richiesta da un microprocessore è nettamente più elevata per via del sistema operativo che deve riuscire ad eseguire. Poiché i microcontrollori, invece, vengono impiegati in alcune attività specifiche, la loro memoria varia da pochissimi kilobyte a qualche megabyte. 
  • Interfacce per le periferiche: le interfacce comuni in un microprocessore sono l’USB, l’Ethernet e la seriale UART. Le periferiche comuni che si trovano all’interno dei microcontrollori sono I2C, SPI e UART, quest’ultime sono sostanzialmente delle interfacce seriali.
  • Dimensione dei registri: di solito la quantità di dati che può essere gestita da un microprocessore in un singolo ciclo è superiore a quella dei microcontrollori.
  • Costo e consumo energetico: i microprocessori sono generalmente più costosi e energivori rispetto ai microcontrollori; ma esistono anche dei microcontrollori di fascia molto alta i cui prezzi possono superare nettamente quelli di un microprocessore. 

Programmare i microcontrollori: da dove iniziare

La programmazione di un microcontrollore può sembrare inizialmente molto complessa, ma in realtà è sufficiente seguire alcuni semplici passaggi essenziali: 

  • Progettazione dell’applicazione
  • Scrittura del codice
  • Compilazione del codice in linguaggio macchina o linguaggio binario
  • Caricamento del codice macchina sul microcontrollore 

Il processo di programmazione avviene attraverso l’utilizzo di appositi strumenti e kit di sviluppo che permettono di facilitare questo processo, guidando l’utente passo dopo passo. 

Tutte queste attività devono essere svolte facendo attenzione all’architettura del microcontrollore in oggetto: 8-bit, 16-bit e 32-bit. Maggiore è il numero di bus dati supportati, maggiore è la capacità del microcontrollore di gestire ed eseguire calcoli complessi. I microcontrollori, come abbiamo avuto modo di vedere, non sono però utilizzati per operazioni particolarmente complesse, motivo per cui l’architettura a 8-bit è la più diffusa e utilizzata, soprattutto dagli hobbisti. 

Il primo passo per la programmazione di un microcontrollore è avere le idee chiare sulle funzionalità che si vogliono ottenere. Generalmente si procede con la rappresentazione del flusso di esecuzione in un formato grafico che può avere diversi stili come un diagramma di flusso o una macchina a stati.

Una volta chiarito il comportamente dell’applicazione si procede a definire come intervengono gli input e gli output, sulla base di come il microcontrollore dovrà interagire con il mondo circostante. I microcontrollori possono avere linee di ingresso e uscita di tipo analogico e digitale, e tra queste ultime ci sono quelle dedicate alla gestione di protocolli di comunicazione. I più famosi ed utilizzati sono UART, SPI, I2C.

Programmare i microcontrollori: codice, librerie e compilazione

Il passo che segue la progettazione dell’applicazione è quello della stesura del codice, che si compone di due parti. L’inizializzazione e l’elaborazione. L’inizializzazione è una parte di codice eseguita solamente all’inizio, quando il microcontrollore riceve l’alimentazione e si avvia. Serve per definire variabili e costanti, per configurare le porte e la cattura degli eventi a fronte dei quali vengono generati segnali appositi, denominati interrupt. La parte di elaborazione consiste invece in un ciclo ripetuto all’infinito (denominato loop) in cui vengono eseguite le istruzione che il progettista ha definito come comportamento. In questo ciclo il flusso di esecuzione è condizionato da istruzioni, appunto, condizionali che sulla base di variabili di stato (registri) o valori agli ingressi o ancora eventi (interrupt), determinano il flusso di esecuzione. La programmazione del microcontrollore è tanto più efficace quanto più il programmatore riesce a rappresentare in modo logico e sintetico le istruzioni all’interno del loop.

Con l’evoluzione delle tecnologie degli ultimi anni, le funzionalità di un microcontrollore sono aumentate notevolmente. Si trovano in commercio a costi accessibili microcontrollori con periferiche dedicate ad uso specifico – crittografia, comunicazione, conversione di segnale – o addirittura multi-core, ovvero costituiti da più CPU che lavorano in modo collaborativo. E’ tipico in un contesto a basso consumo trovare microcontrollori in cui una CPU rimane sempre attiva consumando pochissimo per ‘svegliare’ la CPU principale con compiti di elaborazione più impegnativi. In questi contesti di accresciuta complessità è normale che un programmatore utilizzi componenti software già fatti da terzi e direttamente utilizzabili per semplificare la programmazione del microcontrollore. Questi componenti riutilizzabili sono chiamati librerie e sono spesso disponibili insieme agli ambienti di sviluppo dedicati al microcontrollore selezionato, unitamente alla documentazione di utilizzo. Speciale menzione deve essere fatta per i Real Time Operating Systems (RTOS), speciali librerie che astraggono il flusso di esecuzione basato sul tipico loop, rendendolo più simile ad un flusso di esecuzione di un’applicazione da PC. Sebbene l’impiego di librerie sia quindi indicato e particolarmente utile nella programmazione di un microcontrollore, una cosa a cui fare attenzione è quanta memoria queste librerie effettivamente occupano in memoria ed in fase di esecuzione del firmware. Questa verifica è possibile farla grazie agli strumenti messi a disposizione degli ambienti di sviluppo e spesso porta a delle scelte salomoniche su come rendere la logica delle applicazioni.

Una volta completata la stesura del codice la programmazione del microcontrollore procede con la compilazione che ha come risultato la creazione di un file binario con un formato compatibile con il microcontrollore selezionato. In questo file sono assemblate le librerie, le variabili e le istruzioni che il microcontrollore deve eseguire.

Programmare i microcontrollori: esempi e risorse

L’offerta di microcontrollori è davvero ampia. I grandi brand nel tempo hanno sviluppato le proprie gamme di prodotti con la creazione di cataloghi dedicati ad applicazioni specifiche: low power, wireless, I/O e così via. EDALAB, nel corso del tempo ha potuto assistere a questa evoluzione, lavorando con soluzioni di ST Microelectronics, Microchip, Espressif, Texas Instruments, Nordic e altri. Ognuno di questi vendor propone le proprie soluzioni corredate di strumenti di sviluppo, schede di valutazione, documentazione, librerie ed esempi.

Interessante anche capire come si sia ridotto il costo di accesso a queste tecnologie: la concorrenza e la diffusione di competenze, grazie alle piattaforme hobbistiche, Arduino su microcontrollore Microchip (ex ATMEL), hanno permesso questo fenomeno. Anni fa una scheda di valutazione, fondamentale per iniziare a programmare i microcontrollori, poteva costare oltre mille euro, corredata di documentazione e software di programmazione. Oggi le schede generalmente hanno un costo che parte da poche decine di euro fino ad un massimo ci poche centinaia.

ST Microelectronics

Importante produttore italo-francese con una gamma infinita di microcontrollori e componenti integrati.

Espressif

Produttore con sede a Shanghai e focalizzato sullo sviluppo di soluzioni IoT Wi-Fi e Bluetooth all’avanguardia e a bassa potenza.

Microchip

Fornitore leader di soluzioni di controllo integrate intelligenti, connesse e sicure con un particolare focus sull’offerta di strumenti semplici di configurazione.

Texas Instruments

Produttore americano focalizzato in sviluppo di microcontrollori e componenti dedicati al mercato industriale e automobilistico

Condividi su facebook
Facebook
Condividi su linkedin
LinkedIn

Leggi ancora

Shopping Basket