|
Breakpoint per Micro-gt IDE e non solo ...
|
|
Identificazione progetto
progetto 1 |
autore |
|
note |
Pundi di controllo per le variabili durante l'esecuzione di un programma |
Massimo Cormano |
cormas di Grix |
Modifca che permette di eseguire in circuit debug. Programma eseguito in MicroBasic |
Premessa
Sarà capitato anche a Voi di rimanere delusi nel vedere il PIC appena programmato che non funziona come vorremmo o peggio ancora non funziona per nulla ?
In questi casi anche un emulatore come REAL PIC SIMULATOR non può aiutarci più di tanto e l' unica cosa da fare e' rileggere attentamente il codice sorgente nella speranza di trovare l' errore ma, se non abbiamo qualche elemento che ci aiuta a ristringere le ricerche su una parte del programma, la cosa potrebbe risultare impegnativa.
Per facilitare il debug del codice
possiamo dotare la nostra scheda di sviluppo di uno strumento che ci consente
di interrompere MOMENTANEAMENTE il programma in punti prestabiliti (breakpoint)
per verificare sia i valori numerici contenuti nelle variabili sia per
effettuare eventuali misure.
La soluzione che propongo può essere adottata su una qualsiasi scheda di
sviluppo ma , in questa occasione, e' stata applicata con una piccola modifica
hardware alla MICRO-GT IDE che già dispone on-board di 4 DISPLAY a 7
segmenti.
descrizione
I
breakpoint (o interruzioni di programma) sono creati con una routine software
che inseriremo in vari punti del nostro sorgente per bloccare MOMENTANEAMENTE
il programma e visualizzare sui 4 display a 7 segmenti sia il numero di
identificativo del breakpoint sia il valore ESADECIMALE della variabile
desiderata.
Forse qualcuno obbietterà che " l' output delle variabile può essere inviato su un display LCD o su una SERIALE !". Va bene uguale ma LCD e la SERIALE per essere gestiti hanno bisogno di molto più codice poi ,se utilizziamo la seriale per il programmatore risulta scomodo ogni volta passare dal programmatore all' emulatore terminale, ed in fine sia LCD che la SERIALE spesso sono parte integrante del programma che non funziona.
Con circa 200 byte di codice possiamo utilizzare a "tempo pieno ....." i 4 DISPLAY a 7 segmenti che abbiamo sulla MICRO-GT per gestire l' output dei nostri breakpoint.
Di seguito un esempio sull' utilizzo del breakpoint dove facciamo finta di non conoscere il valore della variabile PLUTO e dello stato del PORTA.0 prima e dopo aver premuto il tasto S8. Per rendere facilmente comprensibile l' esempio e' stato utilizzato un basic generico. La sintassi del comando trap per gestire il breakpoint e' :
primo campo = identificativo del breakpoint da 0 a 255
secondo campo = il nome della variabile o port del qaule vogliamo conoscere il contenuto o 0 se ci occorre visualizzare solo il passaggio per un determinato punto del programma
terzo campo =1 il brakpoint visualizza i dati e poi rimane in loop in attesa che venga spinto il pulsantino sulla schedina, 0 visualizza i dati e continua l' esecuzione del programma.
In rosso ho evidenziato i comandi che devono essere aggiunti provvisoriamente al programma per la gestione dei breakpoint:
chip 16F877A,20
#config OSC=HS
#include "trap.h" "link alla libreria
che contiene il codice per il comando trap che vedremo in seguito
Dim pluto As word " definiamo la variabile PLUTO a 16 BIT
pluto = 41832 " Associamo un valore di 41832 alla variabile PLUTO (in
esadecimale A368)
Dir poarta.0 In " impostiamo il port A.0 come INPUT per generare un evento
(sulla MICRO-GT e' lo switch 8)
main:
trap (1 , pluto, 0) " visualizza il breakpoint 1
con il valore della della variabile PLUTO e continua [0]
trap (2 , porta.0, 1) "visualizza il breakpoint 2 con il valore del
portaA.0 e rimani bloccato in attesa di continuare .Premere il tasto sulla
schedina per continuare
Wait Until porta.0 = 0 " attendiamo che il tasto sulla porta A0
venga premuto
trap (3 , porta.0, 1) " visualizza il breakpoint 3
con il valore del portaA.0 e rimani bloccato in attesa di continuare. Premere
il tasto sulla schedina per continuare
goto main
SPERO CHE QUESTO ESEMPIO IN VIDEO RENDA LA COSA PIU' CHIARA
MODIFICA HARDWARE
Sulla MICRO-GT la prima cosa da fare sono due piccole
modiche hardware:
- La prima e' OBLIGATORIA : dobbiamo sostituire il decoder CD4511 (decoder 4 bit to BCD) con una piccola schedina che contiene un F9368 (decoder 4 bit to HEX) per permettere ai DISPALY di visualizzare da 0-9/A-F al fine di poter visualizzare con 4 digit numeri in ESADECIMALE fino a 65535 (FFFF - con il CD4511 possiamo visualizzare numeri fino a 9999 in decimale) Purtroppo il F9368 e' difficile da reperire perché fuori produzione.
- La seconda e' FACOLTATIVA: sostituire il dip switch S26 con uno zoccolo a 16 PIN su cui inserire una nuova matrice di collegamento tra il port B del PIC e il decoder F9368. Questa modifica semplifica il codice di gestione dei dispaly perche' collega il bit LSB/MSB del PIC con i rispettivi LSB/MSB del decoder.
(rimuovere il DIP SWITCH S26 e' sconsigliato perché rischiate di danneggiare la scheda se non siete ESPERTI )
COMPONENTI DA RIMUOVERE
COMPONENTI DA REALIZZARE
ADATTATORE PER F9368
SCHEMA ORIGINALE MICRO GT CON MODIFICA
COMPONENTI DA INSERIRE
SOFTWARE
Il software e' in basic e deve essere adattato alla sintassi del vostro compilatore (anche il C) e salvato come libreria per poi essere richiamato dal programma principale con il comando "trap" come spiegato nella parte iniziale dell' articolo.
Scusatemi ma i commenti non sono il mio forte ........ speriamo che siano esaustivi !
#define PULSANTE portb.3 'definiamo il portb.3 con il nome PULSANTE
#define DISPLAY portb 'definiamo tutto il portb con il
nome DISPLAY
Dim unita As byte 'dimensioniamo
le variabili a 8 e 16 bit
Dim decine As byte
Dim centinaia As byte
Dim migliaia As byte
Dim tmp As byte
Dim label As byte
Dim dato As word
Dim mode As byte
Sub trap (In label, In dato, In mode) 'inizio soubrutine trap
Dir DISPLAY Out ' configuriamo tutto il portb come out
do until mode =2 ' ripetiamo questo loop fino a
quando la variabile mode sara' = 2
'ROUTINE PER IL VALORE DEL BREAKPOINT
set tmp = label ' assegniamo alla variabile tmp il
valore label (numero breakpoint) passato dal comando trap
unita = b'00000000' 'quando viene visualizzato il
numero del breakpoint le unita' sono spente
decine = (b'00001111' and tmp) or b'00100000' "prendiamo i bit (b3/b0 ) e li assegniamo alla variabile
"decine"
repeat 4
rotate tmp Right "spostiamo i bit da b7/b4 a
b3/bo
end repeat
centinaia = (b'00001111' and tmp) or b'01000000' "prendiamo
i bit (b3/b0 ) e li assegniamo alla variabile "centinaia"
migliaia = b'00000000' 'quando viene visualizzato il
numero del breakpoint le migliaia sono spente
visualizza 'chiama
funzione visualizza
'ROUTINE PER IL VALORE DELLE
VARIABILI A 8 O 16 BIT
set tmp =
dato_h 'mette in tmp il byte piu' significativo (HIGH)
della word dato
If dato > 255 then 'esegui solo se variabile
a 16 bit
centinaia = (b'00001111' and tmp) or b'01000000 ' prendiamo i bit (b3/b0 ) e li assegniamo alla variabile
"centinaia"
repeat 4
rotate tmp Right "spostiamo i bit da b7/b4 a
b3/bo
end repeat
migliaia = (b'00001111' and tmp) or b'10000000' ''prendiamo
i bit (b3/b0) e li assegniamo alla variabile "migliaia"
else
centinaia = b'01000000' 'variabile < 255 le
centinaia visualizzano 0
migliaia = b'10000000' 'variabile < 255 le migliaia
visualizzano 0
End If
set tmp = dato 'mette in tmp il byte meno
significativo (LOW) della word dato
unita = (b'00001111' and tmp) or b'00010000' ''prendiamo
i bit (b3/b0) e li assegniamo alla variabile "unita"
repeat 4
rotate tmp Right "spostiamo i bit da b7/b4 a
b3/bo
end repeat
decine = (b'00001111' and tmp) or b'00100000' ''prendiamo
i bit (b3/b0) e li assegniamo alla variabile "decine"
visualizza 'chiama
funzione visualizza
if mode = 0 then
mode = 2
end if
DISPLAY = b'00000000'
loop
End Sub
Function visualizza ' inizio
funzione visualizza
Repeat 170
if mode = 1 then 'se mode = 1 verifica se il pulsante
viene premuto per uscire dal loop della soubrutine trap
dir PULSANTE in ' set portb.3 in input
if PULSANTE = 0 then ' 'verifica se il pulsante
e' stato premuto
mode = 2 'se pulsante e' premuto allora mode =
2 (esci dalla soubrutine trap)
end if
dir PULSANTE out
end if
DISPLAY = unita
wait 2 ms
DISPLAY = decine
wait 2 ms
DISPLAY = centinaia
wait 2 ms
DISPLAY = migliaia
wait 2 ms
End Repeat
End Function
Se non effettuate la modifica hardware facoltativa dovete aggiungere un' ulteriore tavola di conversione di bit quando calcolate i valori esadecimali dei breakpoint e delle variabili da visualizzare perchè i bit MSB/LSB del portb non coincido con i bit MSB/LSB dei decoder (9368 o 4511)
esempio per scrivere 3 sulle display delle decine:
con modifica S26 = b'0010 0011'
senza modifica = b'1100 0010'
esempio per scrivere 1 sul display delle unita'
con modifica S26 = b'0001 0001'
senza modifica = b'1000 0001'
PORT B |
B7 |
B6 |
B5 |
B5 |
B3 |
B2 |
B1 |
B0 |
|
|
|
|
|
|
|
|
|
CON MODIFICA S26 |
MIGLIAIA |
CENTINAIA |
DECINE |
UNITA' |
D (MSB) |
C |
B |
A (LSB) |
SENZA MODIFICA S26 |
A (LSB) |
B |
C |
D(MSB) |
MIGLIAIA |
CENTINAIA |
DECINE |
UNITA |
Una volta terminate le operazioni di debug rimuoviamo tutti i comandi di "trap" inseriti e ricompiliamo il nostro programma definitivamente
Questo progetto è ridistribuibile secondo i termini di licenzaCreative Commons Attribuzione-Condividi allo stesso modo 3.0 Italia