ELEMANIA
PIC16F690 - Variabili
Tipi di variabili

Per una trattazione generale dell'argomento variabili nel linguaggio C rimandiamo alla specifica sezione del sito Programmiamo. Qui ci occuperemo più nel dettaglio dell'uso delle variabili nell'HI-TECH C per il PIC.

La tabella seguente riassume i tipi di variabili intere che possono essere utilizzate con le loro dimensioni in bit:

Tipo Dimensioni (bit)
bit 1
(unsigned) char 8
signed char 8
(signed) short 16
unsigned short 16
(signed) int 16
unsigned int 16
(signed) short long 24
unsigned short long 24
(signed) long 32
unsigned long 32

Le parentesi tonde intorno a "unsigned" o "signed" indicano che la corrispondente parola chiave può essere omessa dalla dichiarazione di variabile (valore di default).

I tipi bit e short long non sono standard del linguaggio C ANSI, ma sono specifici del C per il PIC. In particolare le variabili di tipo bit possono contenere solo i valori 0 e 1 e non possono essere passate come parametri ad una funzione (sebbene possano essere usate come valore di ritorno).

La tabella seguente mostra invece i tipi di variabili floating (cioè per numeri decimali):

Tipo Dimensioni (bit)
float 24
double 24
long double 24

Praticamente le tre dichiarazioni di tipo sono del tutto equivalenti nel HI-TECH C per cui nel seguito useremo solo il tipo double per le variabili con la virgola. Aggiungiamo anche che un'opzione del compilatore permette di estendere lo spazio occupato da queste variabili da 24 a 32 bit.

Un semplice esempio di uso di variabili

Il seguente spezzone di programma fa uso di una variabile intera di nome cont per ripetere dieci volte il ciclo di lampeggiamento dei LED collegati su PORTC:

for (int cont=0; cont <10; cont++)
    {

    PORTC=0XFF; // tutti i bit di PORTC a 1
    __delay_ms(500);

    PORTC=0X00; // tutti i bit di PORTC a 1
    __delay_ms(500);
    }

La variabile cont nel sorgente C verrà probabilmente implementata usando una o più locazioni tra i cosiddetti General Purpose Registers. Normalmente il programmatore in C non ha nessun controllo (né gli serve averlo) su dove esattamente verranno salvate in memoria le variabili del suo programma. La gestione delle variabili viene lasciata al compilatore.

 

Assegnazione indirizzo a variabile e variabili speciali (Special Function Register)

Vi sono taluni casi in cui il programmatore ha la necessità di stabilire l'indirizzo in memoria di una variabile. La sintassi da usare per ottenere questo è la seguente:

unsigned char pippo @ 0x021;

dove pippo è un nome qualsiasi per la variabile scelto dall'utente. Il valore esadecimale che segue la chiocciola @ serve per a specificare l'indirizzo in memoria della variabile. Si noti che la variabile è stata dichiarata unsigned char, poiché questo è il tipo C che corrisponde a uno spazio occupato pari a un byte, cioè esattamente le dimensioni delle locazioni nella memoria RAM del PIC. Comunque il metodo descritto funziona anche con gli altri tipi di variabili (semplicemente vengono allocate più locazioni consecutive, nel caso in cui la variabile occupi più di un byte).

Questa modalità di assegnazione degli indirizzi alle variabili è usata nel file include pic16f690.h per definire la posizione in memoria dei registri SFR del PIC (variabili speciali). Per esempio nel file include troviamo la dichiarazione di una variabile PORTA fatta nel seguente modo:

volatile unsigned char PORTA @ 0x005;

L'elenco delle variabili speciali predefinite può essere trovato direttamente nel file pic16f690.h

NOTA:

La parola chiave volatile è utilizzata per segnalare al compilatore (e in particolare all'ottimizzatore, cioè a quella parte del compilatore che si occupa di ottimizzare il codice velocizzandolo e/o diminuendo l'occupazione in memoria) che non bisogna applicare l'ottimizzazione a questo tipo di variabili. Senza voler entrare troppo nel dettaglio, usando lo specificatore volatile si impedisce al compilatore di eliminare dal programma riferimenti apparentemente ridondanti alla variabile, ma che tuttavia sono necessari perché la variabile stessa potrebbe cambiare il proprio valore nel corso dell'esecuzione per cause "hardware" (e, in quanto tali, non prevedibili dal compilatore).

E' interessante anche la possibilità di dichiarare una variabile di tipo bit facendola corrispondere esattamente a un preciso bit di un dato registro. La sintassi da usare è la seguente:

bit nomebit @ ((unsigned)&nomeregistro*8)+numerobit;

Vediamo un esempio pratico (tratto dal solito pic16f690.h) per dichiarare una variabile di tipo bit e di nome RA2 associata al bit 2 del registro di nome PORTA:

volatile bit RA2 @ ((unsigned)&PORTA*8)+2;

 

precedente - successiva

Sito realizzato in base al template offerto da

http://www.graphixmania.it