Un buon ambiente di sviluppo integrato è il segreto del successo nella programmazione dei micro. MPLAB® IDE rappresenta la sala comandi per PIC e dsPIC (MPLAB X è la versione successiva). Si tratta di una applicazione a 32bit supportata dal sistema operativo Windows, semplice da utilizzare. Con un unico software è infatti possibile gestire tutte le fasi, dalla stesura del codice alla programmazione del micro. Nel presente articolo si cercherà di comprendere i vari passi che caratterizzano l’intero ciclo di vita del firmware, realizzato tramite MPLAB IDE; si andrà dalla progettazione e scelta del dispositivo alla sua programmazione, passando per le varie fasi di debugging. Inoltre, saranno descritti i componenti software free messi a disposizione all’interno di questo ambiente di sviluppo e gli add-on hardware relativi alla programmazione. La versione di riferimento è la 7.40, ma i flussi di programmazione potranno essere implementati anche nelle versioni attuali.
INTRODUZIONE
MPLAB® IDE (Integrated Development Environment) è un ambiente di sviluppo integrato fornito gratuitamente da Microchip, per la programmazione di microcontrollori PIC e di dsPIC. Questo ambiente di sviluppo funge anche da interfaccia grafica unificata per software e hardware aggiuntivo prodotto sia da Microchip stessa che da terze parti. Passare da un tool all’altro è semplice e veloce. Ad esempio, basta un click per decidere di utilizzare il programmatore/debugger ICD 2 (o versioni successive) dopo aver testato il firmware con il simulatore. Senza dubbio si può affermare che una delle armi vincenti di Microchip nell’ambito dei microcontrollori e DSP è stata proprio l’elevata integrazione di tutti i tools di programmazione. L’altro grande vantaggio offerto dall’ambiente di sviluppo è il simulatore che permette di testare le proprie applicazioni, prima ancora di realizzare il prototipo; in questo modo è possibile rendersi conto di eventuali conflitti tra le periferiche on-board e ridurre in tal modo il tempo di progettazione del dispositivo finale. Solo dopo essersi accertati del corretto funzionamento del firmware (almeno con il simulatore) è possibile utilizzare MPLAB ICD2 per programmare e analizzare l’hardware oppure semplicemente programmare il micro tramite tools come PICSTART Plus o MPLAB PM3.
CICLO DI SVILUPPO DEL FIRMWARE
Il processo di scrittura di un’applicazione è spesso indicato con il termine ciclo di sviluppo, poiché è raro che tutti gli step, dal progetto all’implementazione, possano essere eseguiti correttamente al primo colpo. Molto più spesso il codice è scritto, testato e poi modificato al fine di produrre un’applicazione perfettamente funzionante; la figura 1 riporta una schematizzazione di tale ciclo. Per svolgere tutte queste operazioni sono necessari, tra l’altro: un editor di testi per scrivere il codice, un project manager per organizzare i files, un compilatore o assemblatore per convertire il codice sorgente in codice macchina, un software che simuli il comportamento del micro o un hardware che effettui il download sul chip. È qui che entra in gioco un ambiente di sviluppo integrato, consentendo ai progettisti di sistemi embedded di avanzare attraverso il ciclo senza la distrazione di dover cambiare continuamente il tool impiegato. Utilizzando MPLAB, tutte le funzioni sono integrate e quindi il programmatore può concentrarsi esclusivamente sul completamento dell’applicazione.
Installazione ed esecuzione
Per l’installazione del software è possibile seguire due possibili strade:
- Installazione da CD-ROM. In questo caso è sufficiente inserire il CD-ROM all’interno del lettore e seguire le istruzioni a video per l’installazione oppure lanciare manualmente menu.exe presente nella root del CD-ROM.
- Installazione da Web. La pagina web a cui fare riferimento è la seguente: http://ww1.microchip.com/downloads/en/DeviceDoc/mp740_full.zip. Dopo aver scaricato il file è necessario decomprimerlo e avviare il relativo file di setup.
La schermata iniziale che si presenta al primo avvio è riportata in figura 2.
Project wizard: creazione del primo progetto
La creazione e gestione di un progetto passa attraverso le seguenti fasi:
- Selezione del dispositivo;
- Selezione del linguaggio di programmazione;
- Inserimento files del linker;
- Creazione files di codice;
- Compilazione;
- Verifica del codice con il simulatore.
Per agevolare il compito del programmatore, MPLAB fornisce un comoda utility che consente di automatizzare tutti questi passi, almeno le prime volte che si utilizza il software; successivamente, quando si sarà acquisita una certa familiarità, si può procedere anche in modo manuale. Per mostrare come si procede, si scriverà un semplice programma dimostrativo in linguaggio assembler, con funzione toggle su un pin di output. Sarà inoltre mostrato come effettuare il download di tale codice su di una scheda custom oppure sulla PIC DEM Board di Microchip, mediante l’uso di ICD2. Innanzitutto è necessario selezionare il PIC su cui è basato il progetto, andando da Configure->Select Device; la figura 3 mostra la schermata relativa. Dalla combo box Device selezionare PIC18F452.
La presenza di led verdi e rossi nella schermata, indicano rispettivamente la compatibilità o meno dei programmatori, dei linguaggi e dei debugger per il dispositivo prescelto. In alcuni casi si può trovare il colore giallo, che indica una compatibilità parziale. A questo punto è possibile avviare la procedura automatica per la creazione del progetto e l’inserimento dei relativi files, selezionando Project-> Project Wizard… L’utilizzo di un progetto non è strettamente necessario per la compilazione di un file, ma diventa essenziale per progetti complessi che sono organizzati in più files. Dopo che è stata visualizzata la schermata iniziale bisogna premere il tasto Next. Gli step da seguire sono di seguito descritti:
- La prima opzione da selezionare è il dispositivo da utilizzare (è comunque preferibile impostarlo da Select Device per rendersi conto delle compatibilità con i vari tools). Premere Avanti per continuare.
- Il secondo passo consiste nell’impostazione del linguaggio di programmazione da utilizzare. Come già ricordato MPLAB garantisce la piena compatibilità di compilatori di terze parti, nonché dei suoi C18 e C30. Per l’esempio in questione si utilizzerà però MPASM Assembler (fornito gratuitamente insieme a MPLAB). È interessante notare che MPLAB conosce già la locazione dell’assembler e del linker. Premere Avanti per continuare.
- A questo punto viene richiesto l’inserimento del nome ed il percorso del progetto. Premere Avanti per accedere allo step successivo, dopo aver immesso tali informazioni.
- È giunto il momento di inserire il file sorgente; essendo un dimostrazione del funzionamento di MPLAB e non di programmazione, sarà sufficiente selezionare un modello fornito da MPLAB stesso. Si tratta semplicemente di un file che viene usato per iniziare un progetto, poiché dispone delle sezioni essenziali di cui esso è costituito. Selezionare il file f452tmpo.asm, presente al percorso: C:\xxx\Microchip\MPASM Suite\Template\Object\ (dove xxx indica la cartella di installazione di MPLAB, che di default è Program Files). Premere il pulsante Add per aggiungere il file al progetto e quindi spuntarlo dalla relativa checkbox. In tal modo verrà creata una copia del file nella cartella di progetto.
- Oltre al file del codice è necessario specificare ed inserire il file linker, che contiene informazioni relative all’organizzazione della memoria e ai registri del PIC. Quindi selezionare il file 18f452.lkr dal percorso C:\Programmi\Microchip\MPASM Suite\LKR\. Nella stessa cartella si può notare la presenza di un file simile 18f452i.lkr, che però deve essere utilizzato con il programmatore/debugger MPLAB ICD2. Tale file linker riserva una parte dell’area di memoria del PIC al debugger. Poiché si utilizzerà solo il simulatore (almeno in questa prima fase) è sufficiente usare il primo file. A questo punto il progetto presenta due file, come è mostrato in figura 4. Premere Avanti per visualizzare la schermata successiva, in cui vengono riassunte tutte le impostazioni che sono state effettuate. Premendo il tasto Fine si conclude la procedura.
Il progetto è dunque stato creato ed i relativi files sono visibili dalla finestra Project Window, come riportato in figura 5.
Da tale finestra è possibile, tramite doppio click, aprire i file all’interno della finestra MPLAB IDE Editor.
Consigli per ottimizzare l’area di lavoro
Una funzione particolarmente utile, quando si lavora con progetti costituiti da file multipli, è la visualizzazione a tab dei files; questo permette di avere in un’unica finestra tutti i files. Per impostarla bisogna aprire la finestra editor e premere il tasto destro del mouse; selezionare dal menu contestuale la voce Properties e quindi spuntare la checkbox Use Tabbed Window. Per rendere effettiva questa modifica, MPLAB chiederà di chiudere e riaprire il programma. Come impostazione base, l’ambiente di sviluppo utilizza colori differenti a seconda del tipo di codice (es. commenti, istruzioni assembler, …). È possibile intervenire su queste impostazioni utilizzando sempre la voce Properties e selezionando il tab relativo al testo. In esso è possibile modificare i colori delle varie parti del testo, facendo click sul pulsante Choose Colors; inoltre, è possibile selezionare il font utilizzato e la relativa grandezza. Al fine di individuare gli errori e per il debug è possibile far visualizzare il numero di riga, da Properties, tab Editor e spuntando la voce Line Numbers. La figura 6 mostra un’immagine della finestra Properties.
La fase di build del progetto
La fase di build consente di mettere insieme tutti i files del progetto, al fine di generare il codice oggetto. La figura 7 schematizza le varie fasi attraverso cui bisogna passare.
Lo schema di figura 7 è quello generale. Nel caso in esame si utilizzerà il percorso file sorgente, assemblatore, linker e file oggetto. Per effettuare questa operazione è necessario andare dal menu Project->Build All. Ovviamente, non ci saranno errori poiché non è stato ancora aggiunto del codice al modello utilizzato. Però è interessante osservare i risultati dell’elaborazione all’interno della finestra Output (figura 8).
La scritta BUILD SUCCEEDED conferma che tutto il processo è stato eseguito senza errori. Se ci fossero stati errori, questi sarebbero stati elencati nella stessa finestra. In questo caso, sarebbe stato sufficiente fare doppio click sull’errore per aprire l’editor sulla riga errata. Supponiamo ora di voler modificare il file sorgente, aggiungendo del codice per far cambiare stato alla linea RB0 del PIC18F452. Si tratta di aggiungere le seguenti linee a partire dalla riga numero 138:
movlw 0x00 movwf TRISB; Imposta PORTB come uscita Loop movlw 0x01 movwf PORTB; Imposta RB0 alto movlw 0x00 movwf PORTB; Imposta RB0 basso goto Loop
Avendo fatto una modifica al codice è necessario effettuare nuovamente la procedura di build, allo stesso modo descritto sopra (in alternativa si può premere la combinazione di tasti Ctrl+F10).
La fase di test del progetto: MPLAB SIM
Per testare questo semplice programma con il simulatore software basta selezionare Debugger->Select Tool->MPLAB SIM. Per iniziare ad eseguire il codice è essenziale effettuare un reset, andando da Debugger->Reset->Processor Reset o semplicemente premendo il tasto F6. Si vedrà un freccia verde che si posiziona sulla prima istruzione da eseguire, ossia nel caso in esame sulla riga 79 (goto Main). Per avanzare nel programma passo-passo si possono utilizzare le funzioni Step Into e Step Over (tasti F7 e F8). La prima permette di entrare all’interno di sotto procedure, la seconda invece salta eventuali subroutine. Ovviamente, MPLAB permette l’esecuzione del programma alla normale velocità (tasto F9), anche se questa opzione è utilizzata raramente, poiché non consente di osservare le variazioni nei registri e sulle porte di uscita. Più interessante risulta l’opzione Animate (raggiungibile dal menu Debugger), che rappresenta un incrocio tra il run e lo step into / step over. Animate viene eseguito più lentamente della funzione run, ma al contempo permette di vedere le variazioni del valore dei registri nelle finestre SFR e Watch (descritte nel seguito). Per fermare tale simulazione è sufficiente premere il tasto F5. Per analizzare le variazioni dei registri e delle porte bisogna far riferimento alla funzione Watch, raggiungibile dal menu View. La finestra che si apre non contiene ancora nessuna variabile da monitorare. Per controllare le variazioni della porta B del PIC è sufficiente selezionare il registro PORTB nell’editor di testi trascinando all’interno della finestra Watch; tale discorso vale per qualunque variabile o struttura (nel caso si utilizzi il compilatore anziché l’assembler); la figura 9 mostra tale finestra, con il registro PORTB ivi inserito.
In realtà, per tutti i registri SFR (Special Function Register) del PIC esiste un’apposita finestra per una visualizzazione completa: View->Special Function Register. Per una visualizzazione ottimale di tutte le finestre aperte basta utilizzare l’opzione Window->Tile Horizontally. Inoltre, ciascuna finestra dispone di un comando che consente loro di essere vincolate all’area di lavoro. Tale opzione è accessibile facendo click con il tasto sinistro del mouse sull’angolo in alto a sinistra di ogni finestra e selezionando l’opzione Dockable. Se a questo punto si avvia il comando Animate, si potrà osservare la variazione del registro PORTB da 0x00 a 0x01 e viceversa con una velocità (di default) pari a 0.5 secondi. Per l’applicazione in questione, tale velocità è sufficiente. Potrebbe capitare, per progetti più complessi, che tale valore sia troppo basso o troppo alto; è possibile variarlo selezionando la scheda Animation/Realtime updates dal menu Debug->Settings. Variare il numero presente nel campo indicato come Animate Step Time. Per visualizzare i valori delle variabili in RAM è necessario selezionare File Register dal menu View. All’interno di tale finestra sono anche riportati gli SFR, poiché essi sono mappati in memoria. A prima vista tale finestra potrebbe sembrare confusa, ma è possibile impostare un colore differente per gli SFR. Per fare questo basta fare click, nella finestra File Registrer, con il tasto destro del mouse su Properties. Un’altra comoda funzionalità di cui deve essere sicuramente dotato un IDE sono i breakpoints. Si tratta di punti di interruzione, in corrispondenza del quale il programma si arresta. Possono essere utilizzati, per esempio, allo scopo di analizzare lo stato delle variabili ad un dato punto del codice. Per inserirne uno bisogna semplicemente fare doppio click sulla riga desiderata (si fa notare che il programma si arresta prima di eseguire la riga in corrispondenza della quale il breakpoint viene inserito). La presenza di una interruzione viene segnalata mediante un punto di colore rosso nell’editor, alla sinistra della riga. Possono essere inseriti più breakpoints all’interno del programma. In questo caso è conveniente utilizzare la funzione Run. Esistono situazioni in cui è utile misurare il tempo trascorso per eseguire un certo numero di istruzioni, magari per sincronizzarsi con dispositivi esterni o per altri motivi. In questo caso risulta molto utile la funzione StopWatch raggiungibile dal menu Debugger. Con riferimento all’esempio di codice assembly di cui sopra, inserire due breakpoints alle righe movlw 0x00 e movlw 0x01. Aprire la finestra Stopwatch e avviare Run. Il programma si arresta alla prima delle due istruzioni. Nella finestra Stopwatch viene visualizzato il tempo (0.8ms) per eseguire tutte le istruzioni fino a quella attuale. Se si preme il tasto Zero, si azzera il contatore relativo del tempo, mentre quello assoluto rimane invariato. Si può a questo punto premete ancora il tasto Run. Il risultato è riportato in Figura 10.
Quando si lavora con progetti particolarmente complessi e che quindi necessitano di molta memoria programma e dati, è essenziale monitorare la percentuale di RAM e ROM residua. Per far questo è sufficiente selezionare View->Memory Usage Gauge. In fase di debug risulta molto utile, al fine di eliminare eventuali bachi, effettuare il trace tramite View->Simulator Trace.
Segnali esterni con il simulatore
Un limite del simulatore è, spesso, l’impossibilità di simulare interazioni con l’esterno. Questo non è il caso di MPLAB. Tali stimoli possono essere variazioni di livello o impulsi su di uno specifico pin. Oppure una variazione nel valore di un determinato SFR o locazione di memoria. Fondamentalmente, si individuano due tipi di stimoli esterni:
- sincroni: una serie predefinita di segnali ad una porta I/O, ad un registro SFR o GPR;
- asincroni: la variazione si verifica in un momento non meglio precisato, tramite la pressione di un bottone all’interno dell’IDE.
Per decidere quando, come e quali stimoli esterni si devono verificare, è necessario utilizzare due strumenti che MPLAB IDE mette a disposizione:
- generatore SCL, per la creazione eventi sincroni;
- stimulus Controller, che fa riferimento ad un file ottenuto con SCL ma serve per generare eventi asincroni.
Uno schema di principio di tali tools è mostrato in figura 11.
Il blocco di testo indicato con il termine Scenario indica il file che contiene tutte le informazioni relative alla simulazione mediante stimoli esterni. Si supponga di voler inserire uno stimolo asincrono: aprire un nuovo scenario selezionando Debugger->Stimulus Controller->New Scenario. Tali sollecitazioni si suddividono in: regolari (per la maggior parte dei pin/SFR) e message-based (utilizzato principalmente per la UART/USART). La descrizione dei campi presenti nella finestra Stimulus Controller è riportata in tabella 1.
Ogni riga della finestra Stimulus Controller rappresenta uno stimolo. Dopo averli configurati tutti è possibile salvare il tutto in un file Scenario per successive modifiche o utilizzo. Si rimanda il lettore al datasheet MPLAB IDE - User’s Guide per l’utilizzo del generatore SCL, al fine di generare sollecitazioni sincrone.
Programmazione visuale: il plug-in MPLAB VDI
Il Visual Device Inizializer, o MPLAB VDI, è un plug-in avanzato che fornisce un modo visuale per impostare il codice di inizializzazione delle periferiche. Il suo utilizzo è relativo ai PIC18x e ai dsPIC. L’elenco completo dei componenti che hanno piena funzionalità con tale strumento è riportato in tabella 2.
Utilizzando la versione di MPLAB 7.40, tale tool è già presente all’interno della suite.
Il Visual Device Inizializer è caratterizzato da:
- interfaccia semplice ed intuitiva, grazie alla possibilità di effettuare il drag&drop;
- supporto completo alla configurazione del dispositivo;
- generazione di codice di inizializzazione;
- perfetta integrazione in MPLAB IDE;
- accesso a manuali e datasheet;
- visualizzazione e stampa di reports relativi alla configurazione.
La figura 12 mostra la schermata del VDI, raggiunta tramite Tools->Visual Device Inizializer (bisogna evidenziare che tale opzione sarà selezionabile solo se si utilizza un dispositivo compreso nell’elenco riportato in tabella 1).
Esso risulta utile in varie fasi di sviluppo del progetto. Innanzitutto, durante lo studio di fattibilità del progetto, in quanto aiuta a capire quale dispositivo utilizzare per soddisfare le specifiche. Durante la fase di implementazione, per la generazione del codice e durante la fase di documentazione, per la generazione di reports dettagliati. Come si nota dalla figura 12, ogni pin è riportato con un diverso colore. L’elenco completo dei codici dei colori è riassunto in tabella 3.
Per comprendere meglio il funzionamento del VDI, si procederà ora con una semplice configurazione dell’interrupt esterno del PIC18F452. Il blocco relativo agli interrupt è già inserito all’interno del chip virtuale. Facendo click su di esso si accede ad una schermata che contiene tutte le opzioni relative a questa funzionalità. Impostare le opzioni come riportato in figura 13.
Premendo il pulsante Ok si noterà che il pin 33 del PIC è colorato in verde, ossia l’interrupt è stato ben configurato. La stessa operazione dovrà essere ripetuta per ogni periferica che si vuole configurare. Se il blocco non è già presente nel chip virtuale bisogna effettuarne il drag&drop. Si deve notare che questo modo di procedere permette a chi programma di non conoscere necessariamente in maniera dettagliata il PIC. In questo senso il VDI rappresenta un livello di astrazione rispetto alla normale procedura di programmazione dei micro (la tecnica alla base di questo modo di procedere è un linguaggio di programmazione conosciuto con il nome di XML). Dopo aver concluso le impostazioni delle periferiche è necessario generare il codice. Per far ciò bisogna selezionare Visual Inizializer->Code Generation e quindi salvare il file, per poi aggiungerlo al progetto. Per quanto concerne i reports è possibile visualizzarli e memorizzarli in formato txt, sempre dal menu Visual Inizializer.
VISUALIZZAZIONE GRAFICA DEI DATI: IL PLUG-IN DMCI
Il Data Monitor and Control Interface (DMCI) rappresenta una novità della MPLAB IDE 7.40. Questo plug-in fornisce un controllo dinamico delle variabili. Per utilizzare tale strumento selezionare Tools->Data Monitor and Control Interface. È possibile utilizzare 9 controlli slider, 9 controlli booleani (ON/OFF) e 4 grafici. Dopo aver compilato il codice è possibile abilitare i controlli semplicemente spuntando la checkbox relativa. A questo punto è possibile aprire il menu contestuale, facendo click con il tasto destro del mouse sul controllo stesso. I controlli di tipo slider e on/off vengono utilizzati come input, mentre i controlli graph servono per monitorare lo stato delle variabili. La figura 14 mostra un esempio di controllo slider attivato.
INSTALLAZIONE ED USO DI MPLAB ICD2
Il programmatore/debug è uno strumento molto versatile che consente di programmare, ma soprattutto effettuare il debug del codice. Esso rappresenta il simulatore hardware, per usare una analogia con quello software già analizzato (figura 15).
La procedura di installazione è descritta in dettaglio nella guida all’installazione dei driver, raggiungibile da Help->Driver Installation e selezionando poi installazione di ICD2. È importante sottolineare che non bisogna collegare il cavo USB dell’ICD2 alla relativa porta, prima che questo venga richiesto. Dopo aver concluso la procedura di installazione è possibile utilizzare il dispositivo. Per selezionarlo andare da Debugger->Select Tools->MPLAB ICD2. Come ricordato in precedenza, quando si usa ICD2 bisogna usare il file linker che termina con ‘i’; perciò bisogna portarsi nella finestra di gestione del progetto, fare click con il tasto destro del mouse e selezionare Remove, per rimuovere il file linker impostato in precedenza (18f452.lkr). Ripetere la stessa operazione selezionando Add ed aggiungere il file 18f452i.lkr. Se invece si desidera programmare il dispositivo è necessario portarsi sul menu Programmer->Select Programmer->MPLAB ICD2. Avendo effettuato questa operazione, MPLAB mostra una barra di strumenti (MPLAB ICD2 Program Toolbar) che contiene tutti i comandi necessari alla programmazione del dispositivo. Con la stessa procedura è possibile installare ed utilizzare altri strumenti di programmazione ed emulazione, come ICE2000 o ICE4000.
Troppo vecchio, oggi hanno rilasciato la versione 3.61 del MPLABX …
E’ un articolo didattico che affronta il tool per eccellenza nell’ambiente micro. Molti sviluppatori fanno ancora riferimento a MPLAB. Per la versione successiva vi consiglio questo link come approfondimento http://it.emcelettronica.com/mplab-xpress-ide-cloud-based-con-raspberry-pi