Il mondo dei microcontrollori è invaso da compilatori di ogni sorta e qualità. Si è partiti con l'assembly (e gli assembler) per poi passare a linguaggi sempre più evoluti come il C. In ambito professionale è facile trovare compilatori più o meno costosi, più o meno performanti, più o meno ottimizzati. Fatte le dovute eccezioni, molte Case che producono i microcontrollori hanno a catalogo compilatori C forniti a un prezzo politico e sovente si appoggiano a software-house terze per lo sviluppo di compilatori ad hoc. Anche Microchip Technology dispone di compilatori C per il proprio parco prodotti: per i PIC18, i PIC24/dsPIC, i PIC32, Microchip ha un proprio prodotto, mentre per quanto concerne i PIC12 e PIC16, Microchip non ha mai sviluppato un proprio compilatore C, affidandosi al mercato. Sono così nati diversi compilatori C, tra cui quello sviluppato da HiTech, società facente ormai parte della galassia Microchip. A tutt'oggi, i compilatori C per Microchip sono, a tutti gli effetti, a pagamento, fatta eccezione per SDCC.In questo articolo voglio illustrare come iniziare a lavorare con SDCC, strumento utile allo studente ed all'appassionato che si avvicina al mondo dei microcontrollori e non vuole spendere centinaia di Euro per iniziare a sviluppare le prime applicazioni.
Indice |
SDCC - Small Device C Compiler
Nel 2006, per un caso fortuito, mi trovai a leggere un articolo che parlava di SDCC, un cross-compilatore per diverse famiglie di microprocessori e microcontrollori. Nasce sotto la licenza GNU ed è scaricabile dal sito di SDCC ospitato da SourceForge. SDCC permette di compilare sorgenti per le seguenti piattaforme hardware
- Microprocessori base Intel MCS51: 8031, 8032, 8051, 8052, ecc.
- Micro Dallas DS80C390 e varianti
- Micro Freescale (e quindi anche Motorola) HC08
- Microprocessori Zilog a base Z80:z80, z180, gbz80
- Micro Rabbit: serie 2000/3000
- Microcontrollori Microchip PIC: 12F, 16F, 18F (il progetto sui PIC è in ancora in sviluppo)
SDCC è nativo sui sistemi Unix/Linux ma è stato scritto e compilato anche per i sistemi MS-Windows e Mac OS X. Insomma, ce n'è per tutti i gusti!
I primi passi
SDCC lo si trova al sito indicato in bibliografia. L'installazione per sistemi Windows non è di per sè nulla di complicato; dopo aver lanciato il file di installazione, ad un certo punto è possibile decidere quali piattaforme hardware si vogliono gestire con SDCC. Nel caso si desideri installare compilatore, librerie e file solo per i PICMicro, è possibile togliere il segno di spunta da tutto ciò che non serve, come mostrato in figura, ed eseguire una installazione di tipo "custom".
Al termine, SDCC può autonomamente aggiungere il percorso del compilatore nel PATH comunemente utilizzato dal sistema operativo; questo permetterà di lanciare il compilatore da finestre terminale semplicemente invocandolo con il suo nome.
Dopo aver scaricato ed installato il pacchetto, è opportuno dare una lettura al manuale, almeno al capitolo che riguarda i PIC. Per chi (come me) è all'inizio con SDCC è utile sfogliare la guida in PDF e sbirciare qua e là sui progetti fatti da altri.
Ma dato che guardare altri progetti senza far nulla è deprimente, è facile cedere al desiderio di sviluppare una propria applicazione, qualcosa di "nostro". E, come insegnano tutti i libri di programmazione, non c'è esempio migliore che un bellissimo HELLO WORLD!
LED on-off
Quando si lavora con i PICMicro (ma anche con altri microcontrollori) i rudimenti li si apprende andando a smanettare un po'; se con l'elettronica digitale il primo tentativo che si fa è quello di accendere un LED, con i PICMicro si vuole cercare di farlo lampeggiare! Di per sé il codice C per fare un Hello World di questo tipo è veramente banale, ma non quando si ha a che fare con un nuovo strumento di lavoro come SDCC. Ma andiamo per gradi e vediamo di tracciare uno schema elettrico, prima base sulla quale costruire gli esperimenti.
Il circuito si basa su di un PIC12F683 ma, con poche opportune modifiche al firmware, potrà essere adattato anche ad altri PIC, come ad esempio il PIC12F629 o il PIC12F675. Lo schema mostra il PIC cui è sostanzialmente collegato un LED ed un pulsante, benché il pulsante non sia al momento in alcun modo gestito.
Il codice C per far lampeggiare il LED è il seguente:
#include "pic12F683.h" // Function prototypes void Delay_ms (unsigned int); void nop (void); #define INPUT GP5 #define LED GP2 // FOSC_delay will be used to choose the proper // system FOSC and it is in Delay_ms routine #define FOSC_delay 8000000 // Configuration bits int __at 0x2007 __CONFIG = _INTRC_OSC_NOCLKOUT&_WDT_OFF&_MCLRE_ON; void InitPic (void); void main(void) { InitPic(); while(1) { LED ^= 1; // Toggle pin Delay_ms(500); // 0.5 s delay time } }
Il cuore della routine è espressa nel while(1) dentro al main(): il LED viene acceso e spento a intervalli regolari, di 0.5 secondi. Vale la pena di spendere due parole circa la routine di ritardo. È stata ottenuta impiegando un codice fornito dal sito http://www.golovchenko.org/cgi-bin/delay ove è possibile far generare routine similari, in funzione di FOSC. A tal proposito, ho inserito a titolo di esempio due routine di ritardo, in funzione di FOSC_delay. Il valore va specificato in testa al codice sorgente.
void Delay_ms (unsigned int uiDelTime) { unsigned int i; for (i=0;i<uiDelTime;i++) { #if FOSC_delay == 4000000 __asm cblock d1 d2 endc ;998 cycles movlw 0xC7 movwf d1 movlw 0x01 movwf d2 ;Delay_0 decfsz d1, f goto $+2 decfsz d2, f goto $-3;Delay_0 ;2 cycles goto $+1 nop nop __endasm; #elif FOSC_delay == 8000000 __asm cblock d1 d2 endc ;1998 cycles movlw 0x8F movwf d1 movlw 0x02 movwf d2 ;Delay_0 decfsz d1, f goto $+2 decfsz d2, f goto $-3;Delay_0 ;2 cycles goto $+1 __endasm; #endif } }
Compiling, assembling, linking ...
Sostanzialmente SDCC prende in carico un file sorgente in linguaggio C e genera un file .asm; questo va poi dato in pasto ad assembler e linker, per poter ottenere il file .hex da caricare sul dispositivo. A questo punto entra in gioco un altro pacchetto softweare che continene linker ed asembler; ora, nulla vieta di impiegare MPASM e MPLINIK che vengono installati con MPLAB di Microchip. Ma è possibile scaricare ed installare assembler e linker con licenza GNU dal sito di GPUTILS. Dato che MPLAB è disponibile anche per i sistemi LINUX, forse questi file non sono più necessari, ma vale la pena fare un tentativo.
Ho preparato un make file con il quale generare il file hex a partire dal sorgente. Il make file lancia nell'ordine compiler, assembler e linker:
sdcc -S -V -mpic14 -p12f683 -D__12f683 --use-non-free -DCONFIG HelloWorldSdcc.c
gpasm -c HelloWorldSdcc.asm
gplink -m -w -s C:\Programmi\gputils\lkr\12f683.lkr -o HelloWorldSdcc.hex C:\Programmi\SDCC\non-free\lib\pic14\pic12f683.lib C:\Programmi\SDCC\lib\pic14\libsdcc.lib HelloWorldSdcc.o
... and downloading
A questo punto il programma è pronto per essere eseguito; una volta scaricato sul PIC con il mio fido ICD3, ecco qui il risultato.
L'immagine catturata con l'oscilloscopio e la tabella delle misure mostrano il funzionamento del programma quando FOSC_delay è impostata a 8MHz.
Dalla tabella è possibile apprezzare la qualità della routine Delay_ms(); l'onda quadra misurata è quasi simmetrica (con solo un 0,2% di errore massimo tra gli stati ON e OFF) e complessivamente accettabile con un periodo di 1.008s
Dove trovare i file?
Tanto SDCC quanto GPUTILS dispongono di una propria home page
I manuali di questi strumenti software sono contenuti nel pacchetto di installazione e sono disponibili in PDF.
Il progetto sviluppato in queste pagine (codice sorgente a MAKE file) sono disponibili a questo link del sito PICExperience.
Thank you, Dennis!
Quanti si sono avvicinati al linguaggio C, prima o poi hanno dovuto sfogliare il libro "The C Programming Language" (in italia, il libro è noto con il titolo "Il linguaggio C") di Brian Kerninghan e Dennis Ritchie. Costoro, con Ken Thompson hanno sviluppato il linguaggio C (ed anche una parte dei sistemi Unix). Purtroppo Dennis Ritchie ci ha lasciati, nel mese di ottobre del 2011. Anche grazie al suo apporto al mondo dell'informatica sono stati sviluppati sistemi operativi ed applicazioni sempre più prestanti, anche in ambito industriale.
Il gruppo di sviluppatori di SDCC ha voluto, a suo modo, ringraziare Dennis Ritchie dedicandogli di fatto la release 3.1.0. del compilatore. Sulla home page di SDCC capeggia questa frase:
"The SDCC 3.1.0 release is dedicated to the memory of Dennis M. Ritchie, father of the C programming language."
Grazie, Dennis!
Bibliografia
- Datasheet PIC12F683: http://ww1.microchip.com/downloads/en/DeviceDoc/41211D_.pdf
- Ambiente di sviluppo MPLAB: http://www.microchip.com/mplab
- Compilatore SDCC: http://sdcc.sourceforge.net
- GPUTILS: http://gputils.sourceforge.net
- Dennis M. Ritchie: http://www.topnews.in/dennis-m-ritchie-dies-october-8-2347047
- Sito web PicExperience
- Collana "LO HAI MAI REALIZZATO CON UN PIC?":
- Il contamarce
- Una sorpresa musicale per Babbo Natale
- Una tecnica antirimbalzo
- Il dado elettronico
- Un approccio ai timer dei PICMicro
- I PIC e i segnali analogici: la conversione A/D
- Generare segnali PWM con i PICMicro
- La lampada SIBILLA!
- Una tecnica di misura della tensione di batteria
- Il PIC tiene la data e l'ora
- Pillole di microcontrollori PIC: