Si tratta di una serie di dispositivi che ho realizzato nella fase di studio e prototipizzazione dell'Mt21/42-Endofaster. Riguardano la programmazione dei microcontrollori ST6 e la loro sperimentazione su circuiti di prova. Il complesso dei componenti è rappresentato da un programmatore, un alimentatore e da una serie di schede che servono per lo studio e la verifica del linguaggio di programmazione (assembler) degli ST6.
Anno di realizzazione: 1999.
Il microcontrollore è un componente comunemente impiegato in numerosi dispositivi elettronici, dal comune forno a microonde al personal computer. Si tratta di un dispositivo elettronico integrato impiegato come soluzione alternativa al microprocessore e utilizzato soprattutto nei sistemi embedded, cioè sistemi in cui bisogna monitorare e gestire le funzionali di un dispositivo.
Un microcontrollore può essere considerato come un piccolo computer a cui è possibile collegare, ad esempio, un display, dei pulsanti o altri sensori che, opportunamente programmati, sono in grado di eseguire specifiche funzioni.
Un microcontrollore racchiudere in un piccolo “pacchetto” (da cui la connotazione di integrato) vari componenti come la CPU (central processing unit, cioè il processore) 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.
I microcontrollori sono diversi dai microprocessori. I microprocessori vengono solitamente utilizzati in tutte quelle applicazioni in cui non vi è un’attività predefinita, ma è l’utente a scegliere come utilizzarlo. 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.
Può essere sintetizzata in quattro 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.
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 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 è quello di stabilire le 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 comportamento 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. 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 istruzioni 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. È possibile addirittura 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.
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.
L’offerta di microcontrollori è divenuta, nel tempo, molto ampia. I grandi brand nel corso degli anni hanno sviluppato le proprie gamme di prodotti con la creazione di cataloghi dedicati ad applicazioni specifiche: low power, wireless, I/O e così via. La proliferazione delle aziende produttrici di microcontrollori (e la conseguente competizione) ha portato ad una notevole riduzione dei costi, favorendone una grande diffusione sulle piattaforme hobbistiche (vedi Arduino). 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 di poche centinaia.
L'ST6 è un microcontrollore di produzione SGS-Thomson realizzato in tecnologia HCMOS, adatto alla costruzione di dispositivi di bassa e media complessità. In commercio è reperibile in una serie di modelli basati sullo stesso schema di principio: una CPU a 8 bit (comune a tutti i modelli) circondata da alcune periferiche (macrocelle), il tutto all'interno di un unico chip.
I microcontrollori appartenenti alla famiglia degli ST6 possono essere classificati in vario modo, una prima divisione può essere fatta in base al tipo di memoria adottata: ROM, EPROM o OTP.
I modelli con memoria di tipo ROM sono solitamente destinati alla produzione industriale in grossi quantitativi e vengono programmati in fase di costruzione con un procedimento detto di mascheratura. Tale procedimento permette la produzione di numerosi pezzi già programmati in tempi relativamente brevi, ma può essere svolto solamente con l'ausilio di particolari attrezzature fuori della portata dell'hobbista. La sigla che contraddistingue questo tipo di microcontrollori è composta dal prefisso ST62 seguito da un numero (10, 15, 20 o 25) che ne indica la quantità di memoria ed il numero di porte I/O, ed infine da un suffisso che specifica il tipo di contenitore, la temperatura di funzionamento ed in maniera opzionale il programma contenuto.
Nota: il suffisso /XXX è composto da 2 o 3 caratteri alfanumerici utilizzati per identificare il programma contenuto in ROM.
I modelli con memoria di tipo EPROM sono dotati di una piccola finestra tramite la quale, utilizzando una comune lampada a raggi ultravioletti, è possibile cancellare il programma contenuto al loro interno. Solitamente sono impiegati in fase di sviluppo per la creazione di prototipi, infatti, è possibile cancellarli e riprogrammarli per almeno un centinaio di volte, e quindi correggere eventuali errori presenti nel programma. La loro sigla è simile a quella dei modelli ROM, ma si differenzia per la presenza della lettera "E" (che sta per EPROM) posta a seguito del prefisso ST62 e dal suffisso /HWD o /SWD che ne specifica il tipo di Watchdog (Hardware o Software).
I modelli con memoria di tipo OTP sono in pratica identici ai modelli con EPROM, ad eccezione del fatto che possono essere programmati una sola volta (OTP = One Time Programmable - Programmabili una sola volta). Sono utilizzati per piccole produzioni anche a livello hobbistico, costano meno dei modelli con EPROM ed offrono in più la possibilità di proteggere da lettura il programma contenuto al loro interno, ecco perché, dopo avere sviluppato e testato un programma su di un ST6 con EPROM, si utilizza invece il modello OTP sul circuito finale. La sigla di questi dispositivi è composta dal solito prefisso ST62 seguito dalla lettera "T" (da OTP) e dallo stesso suffisso utilizzato sui modelli EPROM.
Sui modelli con memoria di tipo OPT e EPROM è disponibile anche una variante chiamata Option Byte la quale permette di impostare alcune opzioni in fase di programmazione (ad esempio il tipo di oscillatore da utilizzare o l'attivazione o meno del Watchdog), questi modelli si differenziano dai precedenti per la presenza della lettera "B" (Option Byte) al interno della loro sigla, pertanto un ST62E20F1/HWD diventa un ST62E20BF1 e un ST62T15B6/SWD diventa un ST62T15BB6 (i suffissi /HWD e /SWD spariscono perché il tipo di Watchdog può essere stabilito in fase di programmazione).
La struttura interna degli ST6 viene realizzata con la tecnologia delle macrocelle e si compone di:
Una CPU ad otto bit (denominata CORE).
Una memoria programma di tipo ROM o EPROM.
Una memoria dati di tipo RAM.
Alcune porte di Ingresso/Uscita (12 o 20, dipende dal MCU).
Un Timer a otto bit completo di prescaller a sette bit.
Un Watchdog digitale.
Un convertitore Analogico/Digitale ad otto bit.
Un oscillatore di Clock pilotato da un quarzo esterno (max 8 MHz).
Un gestore di Reset.
Un ingresso di Interrupt non mascherabile.
Un Program Counter con sei livelli di stack.
Collegamento della scheda BUS con più schede test