Breakpoint per Micro-gt IDE

e non solo ...

 

 

Identificazione progetto

progetto 1

autore

email

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

Descrizione: http://www.grix.it/UserFiles/cormas/Image/7segmicrogt/7seg-1.jpg

COMPONENTI DA REALIZZARE

Descrizione: http://www.grix.it/UserFiles/cormas/Image/7segmicrogt/7seg-3.jpg

ADATTATORE PER F9368

Descrizione: http://www.grix.it/UserFiles/cormas/Image/7segmicrogt/stampato.JPG

SCHEMA ORIGINALE MICRO GT CON MODIFICA

Descrizione: http://www.grix.it/UserFiles/cormas/Image/7segmicrogt/schema.jpg

COMPONENTI DA INSERIRE

Descrizione: http://www.grix.it/UserFiles/cormas/Image/7segmicrogt/7seg-2.jpg

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

  Pagina precedente