Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Ricerca personalizzata
14
voti

LO HAI MAI REALIZZATO CON UN PIC? Una prima occhiata a SDCC

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".

Installare SDCC (1/2)

Installare SDCC (1/2)

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.

Installare SDCC (2/2)

Installare SDCC (2/2)

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.

Documentazione SDCC

Documentazione SDCC

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.

Hello World SDCC

Hello World SDCC

L'immagine catturata con l'oscilloscopio e la tabella delle misure mostrano il funzionamento del programma quando FOSC_delay è impostata a 8MHz.

LED on-off su oscilloscopio

LED on-off su oscilloscopio

Tabela con alcune misure

Tabela con alcune misure

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.

Dennis M.Ritchie

Dennis M.Ritchie

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

Pillole di Microcontrollori PIC

Pillole di Microcontrollori PIC

3

Commenti e note

Inserisci un commento

di ,

Ho dimenticato di aggiungere che ho integrato con successo SDCC con il Programmer's Notepad (che consiglio di provare perché fatto bene e molto flessibile) ottenendo un buon ambiente di sviluppo integrato.

Rispondi

di ,

Grazie, TardoFreak. In effetti il mio auspicio è che tanti utenti del forum, soprattutto gli studenti o gli hobbisti che si avvicinano al mondo dei PICMicro, possano con un investimento minimo sui sistemi di programmazione dei PIC, realizzare i primi progetti in linguaggio C. Il tempo dirà se ho torto o ragione! Ciao.

Rispondi

di ,

Bell' articolo! Scritto in modo chiaro e semplice. Sono certo che sarà molto utile per chi si avvicina al mondo dei micro in generale e dei PIC in particolare.

Rispondi

Inserisci un commento

Per inserire commenti è necessario iscriversi ad ElectroYou. Se sei già iscritto, effettua il login.