Comunicazione Rs232 (solo Tx) con minime risorse
Come debuggare un micro a 8 pin usando solo un piedino.
Descrizione
Recentemente ho avuto la necessità si sviluppare un paio di applicazioni con PIC12xxx che hanno solo 8 pin. Avevo per le mani dei 12F765, piccoli GRANDI micro che hanno molte periferiche ma poca memoria FLASH e RAM.
Nonostante usi compilatori 'C' che supportano debug hardware (MikroElettronica e Microchip), ho scoperto che questi non supportano i chip a 8 piedini.
Questo è anche comprensibile in quanto il debug richiede 3 piedini, ce ne sono 6 in tutto, pertanto improponibile. Il solo metodo di sviluppo possibile è quello di scrivere il codice, programmare il chip, metterlo sulla scheda di lavoro e testarlo.
Questa operazione viene ripetuta finchè il codice è a posto.
La cosa si fà piuttosto tediosa quando il codice è complesso.
Non si riesce a capire cosa fà esattamente il micro, e bisogna provare e riprovare N volte.
Mi sono ricordato degli albori della mia carriera, primissimi anni '80, quando un'emulatore per micro costava dai 20 ai 50 milioni di lire (improponibile per le mie tasche).
A quel tempo lavoravo prevalentemente con lo Zilog Z80, quello dei famosi ZX80, ZX81 e Spectrum (i meno givani come me se li ricodano).
Allora non esitevano Flash o EEprom, solo ROM ed Eprom.
Per aiutare lo sviluppo avevo realizzato un 'emulatore di Eprom' che mi permetteva di caricare il codice compilato ed eseguirlo sulla scheda target.
Per quanto riguarda il DEBUG avevo sviluppato una semplice tecnica che consisteva nell'inviare all'esterno del micro dei dati (di solito numeri) che facevano capire cosa stava facendo il micro.
La visualizzazione di questi dati avveniva in vario modo, LED, Display a 7 segmenti, primi LCD alfanumerici, UART, ecc.
Tornando al lavoro attuale, ho pensato che la cosa più pratica fosse inviare caratteri o brevi stringhe ad un programma TERMINAL tipo Hyperterminal (io uso Clear Terminal).
La cosa non presenta alcun problema a prima vista, considerando che i compilatori 'C' usati hanno queste funzioni.
Un'analisi più attenta ha evidenziato che piccoli micro come quello usato hanno grosse limitazioni :
1) spesso non hanno una UART hardware interna (periferica), ma questo si potrebbe aggirare usando la SoftUART, prevista dal compilatore.
2) le funzioni SoftUart dei compilatori prevedono l'uso sia del TX che l'RX (non è necessario ricevere
per il DEBUG), e pertanto usano 2 pin su 6.
3) la Flash di questi chip è di 1K e la RAM ha solo 64Bytes.
Con queste risorse non si possono usare le funzioni SoftUart del compilatore e tantomeno la 'famelica' Sfprintf perchè,
anche se ci stessero, lascerebbero ben poca memoria per il nostro codice.
4) con la mia soluzione si può usare quaksiasi pin di I/O, lasciando libero l'uso di quelli legati a periferiche
specifiche. Da notare che questa tecnica può essere usata anche con miro di altre marche.
Alla fine ho deciso di implementare una comunicazione solo TX con protocollo RS232 che usi le minori
risorse possibili.
Ovviamente questa scelta limita molto le prestazioni di comunicazione, ma è sufficiente per lo scopo.
Ecco alcuni suggerimenti su come si può usare, poi metteteci un po' di fantasia :
1 - Usare un codice numerico di uno o più bytes per indicare i punti del codice dove passa l'esecuzione
(consiglio di aggiungere uno spazio tra i numeri o un CR/LF).
2 - Suddividere il risultato di un calcolo, misura AD, tempo o altro in più bytes ed inviarli.
3 - per indicare l'accadere di eventi tipo pulsante premuto, uscita attivata, reset dovuto a watch-dog o altro, ecc.
Uno dei progetti che ho fatto recentemente è un timer con tempi ON e OFF selezionabili via Dip-SW.
Siccome i tempi arrivavano anche ad ore, non ho voglia di rimanere fermo a cronometrare i tempi.
Pertanto invio un carattere ('A' per acceso e 'S' per spento) ad un programma terminal con 'time stamping'
(indica sullo schermo la data e ora del ricevimento).
Vado a vedere il risultato dopo alcune ore e calcolo i tempi ON e OFF.
Il codice è relativamente semplice e si compone di tre parti :
1 - L'impostazione del parametro ritardoTX che determina il baudrate in funzione dellla frequenza di
clock del micro.
2 - l'inizializzazione del pin da usare come TX, da mettere all'inizio del Main().
3 - la parte di trasmissione di un byte (c'è anche una funzione che invia una stringa di lunghezza fissa, (array[4]).
Ci sono due esempi in MikroC, ma possono essere facilmente portati in basic o altri linguaggi, uno per i chip a 8 pin dove la porta si chiamo GPIO e l'altro per micro più grossi, tipo il 16F876 che avevo a disposizione.
Per i più curiosi ho un paio di foto che mostrano i circuti e i Debugger usati per questo lavoro :
Potete vedere sopra la scheda che uso per fare dei test con PIC a 28 pin (16F876 in questo caso) e sotto la minuscola scheda che uso per programmare i PIC a 8 pin (ed anche per il debug in questo caso).
Sempre nella seconda foto vedete anche la semplicissima interfaccia TTL-232 da usare per collegare il pin del micro alla porta seriale di un PC.
Troverete lo schema di tale interfaccia nei file Wod insieme al codice.
Ho preferito allegare il codice dei due esempi come files Word per dare una migliore leggibilità.
Esempio TX RS232 con PIC12F675.doc
Esempio TX RS232 con PIC16F876.doc
Buon lavoro e spero divertimento a tutti!!!