Discussione: MPLABX Code Generator
Visualizza messaggio singolo
  #3  
Vecchio 24-12-2014, 08.16.54
L'avatar di guiott
guiott guiott non è collegato
Robottaro sostenitore
 
Data registrazione: 23-04-2004
Residenza: Roma
Età : 64
Messaggi: 1,418
Potenza rep: 336
guiott La sua reputazione è oltre la sua famaguiott La sua reputazione è oltre la sua famaguiott La sua reputazione è oltre la sua famaguiott La sua reputazione è oltre la sua famaguiott La sua reputazione è oltre la sua famaguiott La sua reputazione è oltre la sua famaguiott La sua reputazione è oltre la sua famaguiott La sua reputazione è oltre la sua famaguiott La sua reputazione è oltre la sua fama
Invia un messaggio via AIM a guiott Invia un messaggio via MSN a guiott Invia un messaggio via Yahoo a guiott Send a message via Skype™ to guiott
Predefinito

Ti crea un main nel quale ti suggerisce quello che c'è da fare

Codice:
void main(void)
{
    // initialize the device
    SYSTEM_Initialize();

    // When using interrupts, you need to set the Global and Peripheral Interrupt Enable bits
    // Use the following macros to:

    // Enable the Global Interrupts
    //INTERRUPT_GlobalInterruptEnable();

    // Enable the Peripheral Interrupts
    //INTERRUPT_PeripheralInterruptEnable();

    // Disable the Global Interrupts
    //INTERRUPT_GlobalInterruptDisable();

    // Disable the Peripheral Interrupts
    //INTERRUPT_PeripheralInterruptDisable();

    while (1)
    {
        // Add your application code
    }
}
La ISR

Codice:
void interrupt INTERRUPT_InterruptManager (void)
{
   // interrupt handler
    if(INTCONbits.TMR0IE == 1 && INTCONbits.TMR0IF == 1)
    {
        TMR0_ISR();
    }
    else
    {
        //Unhandled Interrupt
    }
}
inizializza gli I/O

Codice:
void PIN_MANAGER_Initialize(void)
{
    LATA = 0x00;
    TRISA = 0x3E;
    ANSELA = 0x16;
    WPUA = 0x00;

    LATB = 0x00;
    TRISB = 0xF0;
    ANSELB = 0xF0;
    WPUB = 0x00;

    LATC = 0x00;
    TRISC = 0xFF;
    ANSELC = 0xCF;
    WPUC = 0x00;

    OPTION_REGbits.nWPUEN = 0x01;

    APFCON0 = 0x00;

    APFCON1 = 0x00;
}
e crea le relative define sia per i mnemonici che per le macro di utilizzo

Codice:
#define INPUT   1
#define OUTPUT  0

#define HIGH    1
#define LOW     0

#define ANALOG      1
#define DIGITAL     0

#define PULL_UP_ENABLED      1
#define PULL_UP_DISABLED     0

// get/set IO_RA0 aliases
#define IO_RA0_TRIS               TRISA0
#define IO_RA0_LAT                LATA0
#define IO_RA0_PORT               RA0
#define IO_RA0_WPU                WPUA0
#define IO_RA0_ANS                ANSA0
#define IO_RA0_SetHigh()    do { LATA0 = 1; } while(0)
#define IO_RA0_SetLow()   do { LATA0 = 0; } while(0)
#define IO_RA0_Toggle()   do { LATA0 = ~LATA0; } while(0)
#define IO_RA0_GetValue()         RA0
#define IO_RA0_SetDigitalInput()    do { TRISA0 = 1; } while(0)
#define IO_RA0_SetDigitalOutput()   do { TRISA0 = 0; } while(0)

#define IO_RA0_SetPullup()    do { WPUA0 = 1; } while(0)
#define IO_RA0_ResetPullup()   do { WPUA0 = 0; } while(0)
#define IO_RA0_SetAnalogMode()   do { ANSA0 = 1; } while(0)
#define IO_RA0_SetDigitalMode()   do { ANSA0 = 0; } while(0)
Ti crea le funzioni per l'utilizzo normale, del tipo:

Codice:
void TMR0_Initialize(void);

uint8_t TMR0_ReadTimer(void);

void TMR0_WriteTimer(uint8_t timerVal);

void TMR0_Reload(void);

void TMR0_ISR(void);
Già solo la parte di inizializzazione del clock vale tutto il programma:

Codice:
void SYSTEM_Initialize(void)
{
    OSCILLATOR_Initialize();
    PIN_MANAGER_Initialize();
    TMR0_Initialize();
}

void OSCILLATOR_Initialize(void)
{
    // SPLLEN disabled; SCS FOSC; IRCF 500KHz_MF; 
    OSCCON = 0x38;
    // OSTS intosc; HFIOFR disabled; HFIOFS not0.5percent_acc; PLLR disabled; T1OSCR disabled; MFIOFR disabled; HFIOFL not2percent_acc; LFIOFR disabled; 
    OSCSTAT = 0x00;
    // TUN 0x0; 
    OSCTUNE = 0x00;
    // Set the secondary oscillator
    
}
Non ti sto a riportare tutto il codice. Fai una prova molto semplice: crea un progetto da zero, seleziona il PIC di tuo piacimento e poi lancia il tool di Code Generation e configura le tue periferiche. Ti trovi tutto il template, molto ben organizzato, con tutti i file.c separati per periferica e per funzione e tutti i file.h relativi con tutti i prototipi delle funzioni e gli mnemonici di tutto quello che serve. Ti trovi tutte le Interrupt Service Routines pronte insomma, puoi cominciare a lavorare con tutto ben commentato in sintassi javadoc che ti permette di avere i suggerimenti on-line durante l'editing del codice per ogni funzione e la possibilità di ottenere una documentazione corretta in modo automatico.
Il tutto è così ben fatto che, in pratica, è un corso di programmazione avanzata per XC8.

Non lavoro in basic ma penso che questo abbia comunque più macro e librerie per usare tutto in maniera più semplice. La Microchip non è mai stata famosa per fornire delle librerie fatte bene in C. l'MCC ti aiuta proponendo tutti i registri che servono per ogni periferica in modo sintetico, ma per capire come usarli devi sempre andare a leggere il DS. Ti propone il codice per tutte le funzioni, molto ben descritto, ma sei tu che devi andare ad adattarlo alle tue esigenze.
Non esiste il paragone con il Basic come non esiste il paragone con l'IDE di Arduino in termini di facilità di utilizzo, ma con il C puoi fare veramente tutto quello che ti serve sfruttando al massimo (veramente al massimo) le potenzialità delle periferiche dei PIC che sono il loro vero plus.

Nei corsi che sto tenendo porto sempre come esempio questo:

per me è un ottimo esempio delle possibilità di un PIC, di un tipo neanche troppo sofisticato. Tutto il programma si svolge ad interrupt tra le diverse periferiche, con tempi ben precisi nell'ordine dei microsecondi. Il codice è di una banalità unica. Come sempre la parte più complicata è solo la configurazione iniziale, poi gira tutto tra ISR minimali.

Con il C, un C che ti consenta l'accesso ai singoli registri, puoi farlo. Con MCC puoi iniziare un programma in C anche da zero in maniera semplice... finalmente.
__________________
Guido
------
www.guiott.com

Ultima modifica di guiott : 24-12-2014 alle ore 08.19.51
Rispondi citando