Utilizziamo il potente simulatore della labcenter electronics per testare e collaudare i propri progetti a microcontrollore.
Ne hanno fatto di strada i software di simulazione elettronica. Inizialmente essi riuscivano a simulare solamente i circuiti statici ed analogici. Col tempo furono introdotte le possibilità di simulazione nell’ambito del transitorio e del digitale. Oggi i moderni programmi riescono a fare ben altro. Sono in grado infatti di simulare non solo i normali circuiti digitali ed analogici, ma anche di eseguire il software presente all’interno dei microcontrollori, utilizzati quali componenti virtuali del circuito preso in esame. un’applicazione completa al computer, simulando il circuito come se lo si avesse realmente tra le mani.
Microcontrollori e Microprocessori
Il Proteus prevede, nell’ambito delle proprie librerie, una grande varietà di microprocessori e microcontrollori. Tutti perfettamente “funzionanti” e in grado di eseguire la simulazione per la quale essi sono stati programmati. Sono previsti dispositivi prodotti dalla Motorola (ad es. Una possibilità che finalmente consente al progettista di evitare l’inutile utilizzo di basette di prova, millefori e saldature volanti. Tutto il lavoro si riduce infatti in il 68000 ed il 68010), alcuni micro prodotti dalla Intel, dalla Philips, dalla Atmel, dalla Parallax, dalla Maxim, Harris, dalla Zilog e dalla Microchip.
I Compilatori
Per poter simulare un circuito che preveda un microcontrollore, è necessario disporre di un compilatore di un qualsiasi linguaggio. Pertanto vanno senz’altro bene tutti i tools di sviluppo in Basic (come il Mikrobasic), il linguaggio C (come il MikroC, il CC5X), il Pascal, il Ladder (ad esempio Ldmicro) e addirittura l’Assembler. Requisito essenziale è infatti disporre del file eseguibile finale (con estensione HEX nel caso dei microcontrollori PIC) che è generato dal compilatore stesso. Gli esempi trattati sono creati utilizzando l’ambiente di sviluppo Mikrobasic, ma con opportune e semplici modifiche al codice, qualsiasi ambiente può andar senz’altro bene. Quello che serve realmente è, ripetiamo, il file eseguibile prodotto dal compilatore.
Prima simulazione: lampeggio di un Led
Quando si scrive per la prima volta un programma, è consuetudine stampare a video la frase “Salve mondo”. Allo stesso modo, quando si progetta il primo circuito a microcontrollore, si inizia sempre con il semplice lampeggio di un diodo Led. Si utilizzerà allo scopo un microcontrollore Pic 16F84.
Schema elettrico
Lo schema elettrico, da approntare con il Proteus, è composto semplicemente dal microcontrollore Pic 16F84, da una resistenza da 220 ohm e da un diodo Led rosso. Per il posizionamento dei componenti occorre premere il pulsante P posto sulla sinistra della videata (vedi figura 1).
Si digiti pertanto nella casella “keywords” la stringa “16f84”. Il relativo microcontrollore verrà visualizzato sulla finestra di lista componenti (figura 2).
Si selezioni pertanto il componente e si prema il tasto OK. Si ripeta la stessa procedura per gli altri due componenti, digitando come parametri di ricerca le stringhe “220 resistor” e “LED RED”. I componenti prelevati dalla libreria si posizioneranno sulla barra sinistra dei dispositivi (figura 3).
Per il funzionamento del controllore non sono necessari i condensatori di oscillazione ed il quarzo. Non c’è bisogno neanche di collegare il pin MCLR del micro (reset). Selezionando adesso i componenti prescelti, si piazzino sulla board, in modo da disegnare lo schema visibile in figura 4.
Si noti che il diodo Led è collegato sulla porta RB0, tramite la resistenza di limitazione. In questo momento, la simulazione non potrà avvenire in quanto, pur essendoci tutti i componenti vitali, manca il programma da implementare nel micro.
Il firmware
Il programma da scrivere è naturalmente molto semplice. Occorre configurare, per prima cosa, la porta RB0 come uscita. Successivamente, in un ciclo infinito, si deve impostarla alternativamente ora a livello logico alto, ora a livello logico basso, il tutto cadenzato da un’opportuna pausa di tempo. Il listato 1 è stato scritto con il Mikrobasic, ma con semplici modifiche può essere adattato a qualsiasi altro tipo di linguaggio e di compilatore.
rem Lampeggio Led program lampeggio trisb=0 ‘Tutta PORTB in Output portb=0 ‘PORTB in LOW while true portb.0=1 ‘RB0 ON delay_ms(500) portb.0=0 ‘RB0 OFF delay_ms(500) wend end.
Listato 1 |
Durante la digitazione del codice, occorre impostare correttamente il valore della frequenza di Clock (figura 5).
Bisogna anche compilare il programma. Tale fase produrrà un file eseguibile, con estensione HEX, da copiare successivamente nel microcontrollore.
Implementazione del firmware in Proteus
Bene, ora che il firmware è stato scritto ed il file HEX prodotto, occorre “caricarlo” all’interno del microcontrollore virtuale di Proteus. A tale scopo si faccia click, prima col tasto destro e poi col sinistro, sul microcontrollore Pic 16F84 dello schema disegnato. Si aprirà una finestra di dialogo con le proprietà e le caratteristiche di tale dispositivo. Occorre quindi effettuare due operazioni fondamentali: la prima è quella di andare a rintracciare il file HEX appena prodotto, premendo la cartellina gialla. La seconda è quella di impostare la frequenza del clock pari a quella del compilatore. Nel nostro caso è stato scelto un valore pari a 4 Mhz. Si prema infine il tasto OK (figura 6).
Finalmente la simulazione
Adesso occorre lanciare la simulazione. Si prema allo scopo il tasto contrassegnato con la freccia nera, posto in basso sulla barra di stato del Proteus. Inizierà immediatamente l’esecuzione del funzionamento dello schema, con inclusa l’esecuzione del programma del micro. Il diodo Led lampeggia come se avessimo “realmente” costruito il prototipo. Sulla barra di stato appare anche il tempo trascorso e la percentuale di impiego della CPU (del computer). Se tale valore è inferiore al 100%, la simulazione avverrà rispettando i tempi previsti nel codice, altrimenti subirà un leggero rallentamento (figura 7).
Se il codice fosse errato?
Se il programmatore si accorgesse che il codice programma non rispecchia le sue aspettative, ovvero occorre apportare qualche modifica, niente paura. Basta modificare il programma sull’editor del compilatore, compilare nuovamente il codice e rilanciare la simulazione in Proteus. Infatti il firmware è ormai parte integrante del progetto, e non è necessario specificare nuovamente il file eseguibile HEX.
Seconda simulazione: contatore UP-DOWN
Come secondo esempio proponiamo un prototipo utile ed interessante: un contatore UP-DOWN a microcontrollore , composto da un display a 7 segmenti e da due pulsanti. Un pulsante ha la funzione di incrementare il valore visualizzato, mentre l’altro lo decrementa. Il codice per gestire le operazioni è scritto in Mikrobasic.
Schema elettrico
Anche in questo caso lo schema elettrico è abbastanza semplice. Sono utilizzate entrambe le porte del Pic 16F84. La PORT-B (o almeno i suoi 7 bit meno significativi) è utilizzata per pilotare il display a 7 segmenti (a catodo comune), attraverso le sette resistenze di limitazione da 220 ohm. La porta RA0 e RA1 sono trattati come ingressi e accettano i segnali logici provenienti da due pulsanti N/A. Il primo serve ad incrementare il valore visualizzato, il secondo lo decrementa. Degne di nota sono le due resistenze di pull-down a valle delle due porte, che assicurano un potenziale logico basso, in caso della mancata pressione dei pulsanti. Il livello logico alto è invece assicurato dalla presenza della batteria da 5 Volt (figura 8).
Il Firmware
Un tantino più complicato del precedente, esso si occupa della rilevazione della pressione dei tasti, dell’incremento o decremento del valore e del pilotaggio diretto del display. Tutto il codice è racchiuso all’interno di un ciclo infinito (listato 2).
rem Contatore UP-DOWN program contatore const vettore as byte[10] = (63,6,91,79,102,109,125,7,127,111) dim valore as byte trisa=31‘Tutta PORTA in Input porta=0 ‘PORTA in LOW trisb=0 ‘Tutta PORTB in Output portb=0 ‘PORTB in LOW valore=0 while true delay_ms(250) ‘Antirimbalzo rem —- Se si preme tasto UP —— if (porta.0=1) and (valore<9) then valore=valore+1 end if rem —- Se si preme tasto DOWN —— if (porta.1=1) and (valore>0) then valore=valore-1 end if rem —- Visualizza sul Display portb=vettore[valore] wend end.
Listato 2 |
La visualizzazione dei numeri sul display è resa possibile grazie alla codifica dei dieci byte relativi all’interno di un vettore.
La simulazione
Dopo aver compilato il sorgente e aver “programmato” il micro con il relativo file HEX, si può passare direttamente alla simulazione del prototipo, premendo il tasto Play sulla barra di stato, come abbiamo visto per il precedente esempio. La simulazione inizia immediatamente e se l’utente clicca su uno dei due tasti dello schema, il display visualizzerà il valore che si modificherà di conseguenza. Da notare che, durante la simulazione, sono sempre visualizzati gli “stati logici” di linea, ossia il valore logico (alto o basso) in corrispondenza di ciascun nodo. Il valore logico alto è sempre contrassegnato da un punto di colore rosso, mentre il valore logico basso da un punto di colore blu. Gli stati di “indecisione” sono contrassegnati da un punto di colore grigio (figura 9).
Conclusioni
Grazie a questi due esempi, il lettore dovrebbe aver compreso la filosofia con cui il Proteus simula non solo la parte relativa al circuito elettrico, ma anche il software scritto e contenuto nei microcontrollori. Questo avviene perché il programma riesce ad eseguire, passo per passo, le istruzioni in linguaggio macchina di ogni dispositivo intelligente. Finalmente con il Proteus il progettista non ha più bisogno né di saldare, né di assemblare componenti, né di assistere ad eventuali… esplosioni dovute ad errori di calcolo e di collegamento. Tutto il lavoro viene virtualmente eseguito al computer. Questa è la potenza dei programmi CAD/CAE.