Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Ricerca personalizzata
17
voti

LO HAI MAI REALIZZATO CON UN PIC? - Una breve introduzione a XC8: HELLO WORLD!

Ma in quante salse è stato proposto il fatidico HELLO WORLD? Davvero molte! E come esimersi dal riproporlo in questa sede? La "scusa" è quella di continuare a parlare di MPLABX e dei nuovi compilatori che Microchip sta lanciando, quelli della famiglia XC. Nel 2012 sono stati proposti XC8, XC16, XC32, XC32++, compilatori C (e C++) rispettivamente per le famiglie a 8, 16, 32 bit dei prodotti Microchip. Sono stati sviluppati come derivazione di prodotti già esistenti aggiungendo nuove funzionalità e dando ai prodotti XC una nuova veste non solo esteriore.

Indice

Le licenze XC

I compilatori XC sono disponibili con tre tipologie di licenza: Free, Standard e Pro. Ciò che le distingue sono fondamentalmente soltanto due aspetti: il livello di ottimizzazione del codice ed il prezzo del prodotto. I due aspetti sono strettamente correlati e direttamente proporzionali: tanto più è elevato il prezzo del compilatore tanto maggiore è il livello di ottimizzazione disponibile.

Microchip ha sempre tenuto una politica dei prezzi che però permette all'utente di "assaggiare" il prodotto, prima di acquistarlo. Così, per 60 giorni e per qualunque compilatore XC venga installato, si ha a disposizione una licenza PRO pienamente funzionante. Scaduto il limite dei 60 giorni, l'utente può a sua scelta, acquistare una licenza Standard o PRO oppure continuare ad usare il compilatore con una limitazione nelle ottimizzazioni, secondo la licenza Free.

Livelli di ottimizzazione del codice

Livelli di ottimizzazione del codice

Il compilatore XC8

Per i PICMicro a 8 bit è disponibile XC8, scaricabile liberamente dal sito di Microchip. Nasce sostanzialmente da una evoluzione del compilatore PICC di Hi-Tech, software house che Microchip ha acquisito qualche da non molto; XC8 ha subito una maturazione, qualche miglioria (a detta della Casa) e certamente non ne mancheranno in futuro. Una cosa importante è che XC8 si integra alla perfezione in MPLABX ed è possibile eseguire compilazioni, trasferimenti e debugging direttamente da MPLABX. Una volta scaricato e installato, MPLABX avvisa che è disponibile un nuovo compilatore; dal menu TOOLS, scegliendo la voce OPTIONS e successivamente Embedded si ha modo di verificare che il compilatore sia stato caricato e che i percorsi dei file eseguibili siano corretti.

Selezione del compilatore XC8

Selezione del compilatore XC8

Hello World!

Nel proporre un esempio di compilazione con XC8, non c'è niente di più immediato che far lampeggiare un LED. Anche se l'esempio è ormai inflazionato, rappresenta un buon trampolino di lancio per impratichirsi senza dover avere troppe righe di codice che, a mio parere, possono "distrarre" il neofita.

Lo schema di partenza è mostrato nel seguito, schema che propone un LED connesso ad un PICMicro e la porta ICSP per la programmazione mediante PICkit2, PICkit3, ICD2, ICD3. L'esempio (ed anche il codice che viene mostrato) è stato pensato per funzionare con PIC12F675 e con PIC12F683, dispositivi che hanno lo stesso pin-out.

La sezione di alimentazione, in grado di generare i 5V per far funzionare il circuito, non è stata mostrata. A dire il vero, per un funzionamento "didattico", magari montando il circuito su millefori, la parte di alimentazione può essere omessa, facendo in modo che il programmatore alimenti direttamente la scheda.


Dopo aver avviato MPLABX, si deve creare un nuovo progetto, seguendo quanto indicato in questo articolo. Si deve aver cura di scegliere il PICMicro adatto a questo progetto (PIC12F675 oppure PIC12F683) ed il compilatore XC8.

A questo punto è sufficiente aggiungere il codice C riportato qui nel seguito, compilare e trasferire il codice. L'effetto del lampeggio è immediato!


/*

Project: HW_12F675

Ver 1.0

Author: Paolo Rognoni, 2012

MCU: Microchip PIC12F675 and PIC12F683

Clock: 4 MHz (internal clock)

Compiler: XC8 - Version 1.12

File: HW_12F675.c


This software shows the HELLO WORLD Led blinking, using either PIC12F675 or

PIC12F683. The source code is ready for both PICMicro


This software is given under license CC-BY-NC-ND (Italy) as describe in the following

License: Creative Commons Attribuzione - Non commerciale - Non opere derivate 3.0 Italia

http://creativecommons.org/licenses/by-nc-nd/3.0/it/legalcode

http://creativecommons.org/licenses/by-nc-nd/3.0/it/deed.it


Link:

http://www.picexperience.it

http://www.electroyou.it


*/


#include <xc.h>


#define LED GPIObits.GP2

#define _XTAL_FREQ 4000000


/* Configuration bits */

#ifdef _PIC12F683_H_

#pragma config CP = OFF, MCLRE = ON, FOSC = INTOSCIO, WDTE = OFF

#endif


/* Configuration bits */

#ifdef _PIC12F675_H_

#pragma config CP = OFF, MCLRE = ON, FOSC = INTRCIO, WDTE = OFF

#endif


void InitPic (void);


void main(void)

{

    

    /* PICMicro initialization */

    InitPic();


    /* Never ending cycle...*/

    while(1)

    {

        LED^=1;             /* LED alternate ON and OFF */

        __delay_ms(200);    /* delay macro (200ms) */

    }


}


void InitPic (void)

{

/* I/O port configuration */

    GPIO  =  0x00;


#ifdef _PIC12F683_H_

    CMCON0 = 0x07;      /* Disable comparators */

    OSCCON = 0x60;      /* Oscillator frequency: 4MHz */

#endif


#ifdef _PIC12F675_H_

    CMCON =  0x07;      /* Disable comparators */

#endif

    ANSEL =  0x00;      /* Disable A/D module */

    TRISIO = 0x3B;      /* Only GP2 is set as OUTPUT */

    WPU = 0;            /* Disable internal pull-ups */

    OPTION_REG = 0x80;  /* Disable internal pull-ups */

}

Come si può notare, ho impiegato due macro messe a disposizione del compilatore XC; come detto, il codice C è compilabile tanto per PIC12F675 quanto per PIC12F683 e, benché questi PICMicro abbiano caratteristiche similari, differiscono per alcuni aspetti come il nome e la presenza di alcuni registri. Per passare da un progetto compilato per PIC12F675 a uno per PIC12F683 è sufficiente aprire la finestra delle proprietà del progetto e selezionare un altro PICMicro.

Il ritardo impostato di 200ms è stato rilevato con l'oscilloscopio, ed ecco il risultato:

LED blink, catturato dall

LED blink, catturato dall'oscilloscopio

Per alimentare il circuito con la sola tensione fornita da ICD3 è sufficiente tornare nelle impostazioni di progetto e, nella voce ICD3 selezionare la voce POWER e successivamente spuntare la voce POWER TARGET CIRCUIT FROM ICD3:

Alimentazione da ICD3

Alimentazione da ICD3


Mi manca il PIC... si prova la simulazione!

Mi è capitato proprio questo: sono rimasto senza PIC12F675! Come fare, allora? Senza disperare, ho potuto verificare il funzionamento del codice C preparato, impiegando SIMULATOR, il debugger. Il simulatore lo si attiva nelle proprietà del progetto, selezionandolo nella voce Hardware tool:

Simulator

Simulator

Un video

Ed ecco il blinker in funzione. Niente di che, soltato una breve dimostrazione di come funziona MPLABX con XC8. Il video mostra diversi aspetti argomentati in questo articolo come la compilazione per due PIC differenti, la simulazione ed infine l'alimentazione fornita da ICD3:

Licenza

Questo articolo ed il software rilasciato rientrano nell'ambito della licenza CREATIVE COMMONS BY-NC-ND 3.0, secondo quanto indicato nelle note legali qui riportate.

Licenza Creative Commons

Licenza Creative Commons

Sintesi delle note legali (italiano)

Note legali (italiano)

Legal code (international)

Commons deed (international)


Bibliografia

8

Commenti e note

Inserisci un commento

di ,

No, c'è anche il mix con il C18. Credo che Microchip voglia uniformare il più possibile i compilatori suo (C18) e l'acquisito (Hi-Tech).

Rispondi

di ,

Articolo chiaro e invogliante per un neofita! Complimenti! Qual è quindi la differenza tra XC8 e hi-tech? Un semplice cambio di nome?

Rispondi

di ,

Non qui, il codice. Usiamo il forum!

Rispondi

di ,

azz... non mi ha mantenuto la formattazione del testo... è antiestetico!

Rispondi

di ,

Per provare la conversione A/D ho aggiunto in initpic


//ADCON0= 0b00001100; /*Enable A/D module*/
// 0 left justified
// 0 Vref = Vdd
// xx
// 11 analog =AN3
// 0
// 0
e ho modificato il while come segue
while(1)
{
LED^=1; /* LED alternate ON */
ADCON0bits.GO_DONE=1; /*inizia conversione*/
while(ADCON0bits.GO_DONE) /*gira fino a che la conversione non è avvenuta*/
;
__delay_ms(ADRESH); /* avendo impostato left "justified" prendo solo gli 8 bit più significativi */
}
però non funge.....o meglio non me lo compila mi dice che c'è un'errore nell'istruzione delay.... cosa devo aggiungere?

Rispondi

di ,

Feliz Navidad a todos el mundo! @Matteo1991: sì, si tratta di una impostazione (non istruzione) per l'utilizzo dell'oscillatore interno. :-)

Rispondi

di ,

Grazie Paolino. Feliz Navidad para ti también mi amigo! -carlo.

Rispondi

di ,

Eccellente, davvero un bel contributo! un bel ragalo di natale! Un chiarimento: "FOSC = INTOSCIO" è l'istruzione con cui si setta l'oscillatore interno giusto? Grazie mille e buon natale!

Rispondi

Inserisci un commento

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