PARTICOLARITA' E LIMITAZIONI CON mikroC PRO

Nel programmare il microcontrollore PIC 16F877A con il linguaggio C++, devo tenere in considerazione vari aspetti particolari legati al microcontrollore e al compilatore, che si differenziano e in qualche modo sono complementari con il C++ usato sui PC.

Sebbene il mikroC possa lavorare con qualsiasi tipo di dati, ai fini della velocità di esecuzione dei calcoli, è bene tenere in considerazione il fatto che il PIC lavora con 8 bit e ciò causa un aumento del tempo di esecuzione. Quindi è consigliabile usare tipi di dato di minime dimensioni. Comunque i tempi di calcolo dipendono dal modello di PIC.

A causa del numero di celle del registro stack non posso fare più di 8 annidazioni (se uso l'interrupt questo valore va abbassato di un unità, cioè posso fare al massimo 7 annidazioni).

Le funzioni non possono superare i 2 K (2048 righe), altrimenti il compilatore segnalerà un errore. Si può superare il problema suddividendo la funzione in più blocchi.

Tutti i registri speciali SFR (special function registers) dei PIC sono automaticamente dichiarati come variabili globali di tipo volatile unsigned short e alcuni dei loro bit come costanti. Quindi sono visibili dall'intero programma. Essendo il linguaggio C++ legato alla struttura hardware il mikroC è legato ai microcontrollore della microchip, e una volta scelto il modello, il compilatore include nel progetto, all'atto della creazione, il file di definizione e dichiarazione dei registri. I file di definizione , per i vari modelli di PIC, si trovano nella cartella Defs dell'installazione di mikroC. Per sapere se un registro o un suo bit è definito, si può usare il Code Assistant o consultare il file riferito al microcontrollore usato all'interno della cartella Defs.

Tutti i registri e le variabili sono a 1 byte e si possono leggere e scrivere i singoli bit :

esempi di scrittura :

PORTB.B2 = 1; // mette a “1” il bit 2 del PORTB (il bit meno significativo è F0)

PORTB =PORTB | 0x04; // esegue OR bit a bit quindi il bit RB2 verrà posto a “1”

RB2_bit = 1; // mette a “1” il bit 2 del PORTB

PORTB.B2 = 0; // mette a “0” il bit 2 del PORTB (il bit meno significativo è F0)

PORTB =PORTB & 0xFB; // esegue AND bit a bit quindi il bit RB2 verrà posto a “0”

RB2_bit = 0; // mette a “0” il bit 2 del PORTB



esempi di lettura :



a = PORTB.B3; //assegna alla variabile a il valore del bit RB3

//la funzione seguente assegna a RA0=1 se RB3=0

if (PORTB.B3 == 0)

{

PORTA.B0 = 1;

}

.

.

.



MikroC usa un proprio algoritmo per distribuire all'interno della program memory e dei registri RAM i vari oggetti del programma (costanti, variabili, funzioni, etc.). Se abbiamo la necessità di collocare una funzione o una variabile a partire da uno specifico indirizzo possiamo usare le direttive del linker.

Direttiva absolute

specifica l'indirizzo iniziale di una variabile in memoria RAM. Se la variabile è maggiore di un byte (es. tipo long di 4 byte) i suoi byte saranno memorizzati in locazioni consecutive a quella specificata. Bisogna fare attenzione a non sovrapporre due o più variabili.

Char K absolute 0x33 //la variabile k è di 1 byte e occupa l'indirizzo 33

long j absolute 0x30 //la variabile j è di 4 byte ed occupa gli indirizzi 30,31,32 e 33




vediamo che all'indirizzo 33 c'è una sovrapposizione che causa un malfunzionamento.



Direttiva org

specifica l'indirizzo della program memory in cui verranno scritte le istruzioni che seguono la riga con questa direttiva. Questa direttiva NON può essere applicata alla funzione di interrupt, la quale verrà scritta sempre dall'indirizzo 04h della program memory.

es.

void funzione1 (char pippo) org 0x23

{

istruzioni della funzione 1 (CORPO)

}

questa funzione verrà salvata e quindi scritta dalla riga 0x23 della program memory.