Programmare in mikroBasic
 
  Box pubblicitario
mikroBasic PRO - Come fare il debug con MPLAB

Vedere anche:

Per le informazioni riferite a questo argomento e per compilare i programmi è stata usata la
vers. 5.40 di mikroBasic Pro for PIC.

Altre versioni del compilatore potrebbero avere comportamenti diversi o non funzionare.

Dalla versione 3.20 di mikroBasic PRO, è stata implementata la possibilità di generare files di tipo COFF (Common Object File Format).
Con questo tipo di files è possibile fare il debug dei programmi mikroBasic, mikroC e mikroPascal all'interno di MPLAB IDE di Microchip.

Generare il file COFF

(1) Il programma che vogliamo testare in MPLAB deve essere compilato con l'opzione "Generate COFF file" selezionata.

Questa opzione si trova nel pannello "Options".

(2) cliccare sul menu "Tools -> Options" per aprirlo.

(3) Nella finestra "Options" cliccare sulla linguetta "Output".

(4) Poi su "Output Settings".

(5) Selezionare la voce "Generate COFF file".

Cliccare sul pulsante "OK" per chiudere la finestra

(6) Ora possiamo compilare il nostro programma cliccando su "Build".

(7) Nella finestra "Messages -> Message Text" possiamo vedere che il file COFF è stato generato con successo.

Ora possiamo importarlo in MPLAB per fare il debug.

Debug, con il file COFF, in MPLAB

Se abbiamo seguito le indicazioni della pagina "Preparare debug con MPLAB", possiamo iniziare il debug del programma mikroBasic.

Aprire MPLAB e cliccare sul menu:
(8) "File -> Recent Workspaces -> ..."
se esiste nella lista, oppure su:

(9) "File -> Open Workspace..."
per aprire lo spazio di lavoro salvato precedentemente.

(10) In questo esempio, apro lo spazio di lavoro "mikroE_coff.mcw", che era stato salvato precedentemente.

Il programma sotto test è molto semplice e "terra terra" ma, è sufficiente per introdurre il nostro tema.

Nella figura sotto, si vede come è disposto il workspace che sarà usato per la simulazione.

Per la descrizione di alcune particolarità delle finestre, si rimanda a "Preparare debug con MPLAB".

 

Possiamo notare:
(11) La finestra col listato del progetto mikroBasic originale,
(12) la finestra col listato misto, in assembly e mikroBasic,
(13) la finestra Watch,
(14) la finestra Stopwatch.

La barra degli strumenti Debug con i pulsanti:

(15) Run - Esegue programma.

(16) Animate - Esegue programma rallentato.

(17) Step Into - Esegue una istruzione alla volta.

(18) Step Over - Esegue subroutine e si ferma subito dopo.

(19) Step Out - Esegue istruzioni dentro subroutine ed esce da questa.

(20) Stop - Ferma esecuzione dopo Run o Animate.

(21) Reset - Va all'istruzione d'inizio del programma.

(22) Imposta Breakpoint nel listato assembly.

Clicchiamo su Reset, per portarci al punto d'inizio del programma.

Noteremo che nelle finestre del codice non c'è nessuna indicazione della riga di inizio.
Come si può spiegare questo?
La spiegazione sta nel fatto che il listato mostra le corrispondenze assembly e mikroBasic, ma non fa vedere proprio tutto il codice eseguito (il codice d'inizio e di fine, in questo caso).

Per vedere il punto d'inizio, dobbiamo vedere la memoria programma, cliccando sul menu:
(23) "View -> Program Memory".

N.B.
Per vedere la memoria programma, bisogna prima avere importato il file eseguibile ".hex", come spiegato in "Preparare debug con MPLAB" al punto (19).

Nella finestra "Program Memory" è mostrato il codice assembly ricavato dal file .HEX ed è indicato (con la freccia verde) che

(24) questo è il punto d'inizio del programma (indirizzo 0).

L'istruzione indica di saltare (goto) all'indirizzo 0x3.

Clicchiamo allora su Step Into, per eseguire quella istruzione di programma.

 

Adesso possiamo vedere, nella finestra "Disassembly Listing", l'indicazione della prossima istruzione che verrà eseguita, all'indirizzo "0003", come anche nella finestra "Program memory", che, a questo punto, possiamo chiudere.

La colonna "Opcode" contiene il codice di esecuzione, scritto nella memoria programma, che viene letto dal microcontroller per eseguire il programma.

 

Anche nella finestra del codice mikroBasic, viene indicata la riga con l'istruzione corrispondente.

Nella finestra "Stopwatch", vediamo che, l'istruzione precedente, ha richiesto 2 cicli istruzione per essere eseguita e che sono trascorsi 1 microsecondi dall'inizio del programma.

Adesso stiamo attenti:
se clicchiamo nella finestra del codice mikroBasic e poi clicchiamo su "Step Into", avanzeremo di 1 istruzione mikroBasic (ma avanzeremo contemporaneamente, in questo caso, di 3 istruzioni nella finestra assembly).

Se, invece, clicchiamo nella finestra del codice assembly e poi clicchiamo su "Step Into", avanzeremo sempre e soltanto di 1 istruzione assembly.

Clicchiamo allora sulla finestra mikroBasic e poi su Step Into, fino a che arriviamo alla riga 7.

 

Vediamo che, in mikroBasic abbiamo eseguito solo 2 istruzioni, mentre in assembly sono 5.
Notiamo anche il tempo di esecuzione e i cicli istruzione.
La prossima istruzione dovrebbe modificare il registro portB.

Assicurandoci che sia selezionata la finestra mikroBasic, clicchiamo ancora su Step Into.

 

Vediamo, nella finestra Watch, che il registro portB ha cambiato il valore.

La prossima istruzione eseguirà la sub procedura delay_ms(1000) che genera un ritardo di 1000 millisecondi. Se la eseguiamo passo passo, cliccando su Step Into, ci mettiamo dieci anni per eseguire tutte le istruzioni e i salti ripetuti (vedi listato assembly), quindi, dovremo seguire un'altra strada.

Selezioniamo allora la finestra mikroBasic e poi facciamo doppio click, sulla parte grigia, in corrispondenza della riga 9 (sotto alla freccia verde).

Imposteremo, così, un punto di arresto (breakpoint), che fermerà il simulatore, quando arriverà a quella istruzione, subito dopo aver eseguito la sub procedura delay_ms(1000).

Vogliamo però vedere, anche, se il tempo, impostato nella sub procedura di ritardo, è adeguato. Nella finestra "Stopwatch", azzeriamo allora la colonna del tempo parziale (Stopwatch), cliccando sul pulsantino "Zero".

La colonna "Total Simulated", è il tempo totale della simulazione e non verrà azzerata.

Assicurandoci che sia selezionata la finestra mikroBasic, clicchiamo su Run, per eseguire il programma fino al primo breakpoint che verrà incontrato.

 

Dopo qualche attimo, come mostra la figura sopra, vedremo che l'esecuzione si fermerà nel punto del breakpoint e che il tempo di esecuzione è stato esattamente di 1 secondo, cioè 1000 millisecondi. La sub procedura delay_ms(1000) funziona perfettamente.

Clicchiamo adesso su Step Into per eseguire l'istruzione che modifica portB di nuovo.

 

E la figura sopra mostra i risultati.
Ora abbiamo un'altra istruzione di ritardo, quindi, facciamo come prima e piazziamo un altro breakpoint in corrispondenza della riga 11.

Assicurandoci che sia selezionata la finestra mikroBasic, clicchiamo ancora su Run.

 

Nella figura sopra, i risultati.

Clicchiamo ancora su Step Into per eseguire l'istruzione successiva.

 

Ci ritroveremo di nuovo alla riga 7 per ripetere di nuovo il tutto.
Per rimuovere i breakpoints, basta rifare il doppio click nello stesso punto, sopra alla "B" con sfondo rosso.

Possiamo impostare i breakpoint anche cliccando su Breakpoint.

La finestra "Breakpoints" serve, più che altro, per abilitare o disabilitare i breakpoint, ma possiamo creare anche breakpoints inserendo

(25) l'indirizzo (in esadecimale) della memoria di programma dove vogliamo che l'esecuzione si fermi.

Per ogni breakpoint inserito ci sarà
(26) una casella, con il segno di spunta, se il breakpoint è abilitato. Per disabilitarlo, togliere il segno.

Per rimuovere il breakpoint, basta
(27) selezionarlo e cliccare su "Remove".

Gli altri pulsanti servono per rimuovere, abilitare o disabilitare tutti i breakpoints.

I breakpoint saranno segnalati nella finestra del codice assembly con una "B" con lo sfondo rosso.

Ma, essendo l'indirizzo del breakpoint riferito all'indirizzo della memoria e non ad una riga del programma, sarà, invece, segnalato con una "B" con lo sfondo giallo nella finestra del codice mikroBasic.

Possiamo impostare più facilmente i breakpoint, nella finestra assembly, anche facendo doppio click nella parte grigia (alla stessa maniera della finestra mikroBasic) e così anche per rimuoverli.

 

mikroBasic PRO - Preparare debug con MPLAB

 

Bibliografia:
Manuale mikroBasic PRO,
Guida MPLAB IDE,
Datasheet PIC16F877A

 

Ultima modifica