Guida alla Programmazione in C del PIC, 3° Parte

Guida alla Programmazione in C del PICNella Terza Parte si Parlerà della Variabili, degli Operatori e della Istruzioni di MikroC, Inoltre Verrà Presentato un Programma di Esempio…


 
 
 
 




 

INTRO

Come abbiamo visto nella guida precedente le porte del PIC prendono il nome di RB0:RB7 per le porte del registro TRISB e RA0:RA4 per il registro TRISA. All’interno del programma possiamo chiamare i vari pin con dei nomi da noi scelti, in base magari al carico collegato a questi pin o all’ingresso corrispondente ad esso, ad esempio led, display oppure pulsante.
Per fare ciò basta inserire nel programma una linea di codice così fatta:

#define (nome) PORT(nome registro).F(numeropin)

Ad esempio, se vogliamo definire con il nome led il secondo pin del registro TRISB, ovvero RB1 scriveremo prima del void la seguente riga:

#define led PORTB.F1

Questa linea di codice ci faciliterà la scrittura del programma , dal punto di vista funzionale non inserisce niente di utile.

 




 

TIPI DI DATI E VARIABILI

All’interno del programma si possono inizializzare numeri e caratteri che possono essere di vari tipi:

variabili mikroc

Questi sono i tipi di dato elementari, con un prefisso si possono variale le dimensioni e il range di valori.

tipi interi mikroc

Il tipo char può contenere qualsiasi carattere definito secondo lo standard ASCII, quindi qualsiasi lettera (maiuscola o minuscola), cifra (da 0 a 9) e simbolo previsto dalla codifica.
Il tipo int permette di rappresentare numeri interi. Possiamo dichiarare un int con due varianti: short e long, la keyword long permette di estendere il range dei valori che il tipo int può assumere.
I tipi float e double sono i cosiddetti numeri in virgola mobile, che rappresentano l’insieme dei numeri reali: con essi possiamo rappresentare numeri molto piccoli o numeri molto grandi, positivi e negativi e naturalmente con e senza decimali.

Questi tipi di dati ci servono per creare variabili che possono servire per inizializzare le uscite oppure per mamorizzare informazioni sugli ingressi, possono servire anche per contatori o altri scopi.Per inizializzare una variabile scriviamo come segue:

(Tipo di dato) (nome variabile) = (valore della variabile);

Ad esempio avremo:

inizializzazione variabili mikroc

In questo esempio inizializziamo una variabile int di nome “a” e gli diamo una valore di 23, nul secondo esempio inizializziamo e diamo un valore di 7.0 a una variabile di nome “x”, nel terzo esempio inizializziamo un char con segno di valore -20. Nelle due ultime righe di codice inizializziamo 2 variabili, una di nome “b” e “c”, senza dargli un valore; Queste due variabili saranno inizializzate all’interno del programma.
 
OPERATORI MATEMATICI E LOGICI

Gli operatori servono a variare il valore dai dati e variabili oppure a mettere in relazione due o più variabili tra loro. Esistono vari tipi di operatori, tra cui:

OPERATORI MATEMATICI E DI ASSEGNAZIONE
Mettono in relazione due variabili in modo tale da assegnare ad un’altra variabile un valore che dipende dalle due precendenti. Gli operatori di assegnazione invece sono degli operatori che assegnano direttamente il valore ad una variabile in base ad una o più variabile. Le operazioni possibili sono:

 

OPERATORI-MATEMATICI mikroc

OPERATORI BINARI
Questo tipo di operatori lavorano sulle variabili in formato bit, eseguono operazioni binarie come descritto in tabella:

OPERATORI-LOGICI mikroc

OPERATORI LOGICI DI CONTROLLO
Sono degli operatori che controllano il valore di 2 operandi e ritornano un valore booleano ovvero un valore vero o falso, questo valore può servire a controllare un’istruzione iterativa, a chiudere il programma o a fare partire un’istruzione. Gli operatori sono:

OPERATORI DI RELAZIONE mikroc

 




 

LE ISTRUZIONI ITERATIVE

Istruzione WHILE
L’istruzione while è la più semplice tra le varie istruzioni, il suo compito è quello di ripetere le istruzioni tra le parentesi graffe finchè una data condizione scritta tra parentesi tonde è vera, quando la condizione cesserà di essere vera il programma terminerà l’istruzione WHILE e riprenderà la sua normale esecuzione.

La sintassi dell’istruzione while e il relativo diagramma di flusso è il seguente:

istruzione while mikroc

Nell’esempio inizializziamo una variabile intera chiamata “i” con un valore uguale a 2. La funzione WHILE sarà eseguita finchè la variabile “i” avrà un valore minore di 7. All’interno del WHILE avremo 3 istruzioni, le prime 2 controllano lo stato di on-off di due led, la terza istruzione aumenta di 1 il valore di “i” ad ogni ciclo. Quindi lo stato dei led è quello indicato in figura per 5 cicli di WHILE, poi i led assumeranno altri valori.

Istruzione DO-WHILE
Molto simile al semplice while questa istruzione funziona al “contrario” infatti esegue prima le istruzioni interne al ciclo e poi verifica l’espressione. La sintassi e il diagramma di flusso per questo ciclo sarà:

istruzione do-while mikroc

Nell’esempio inizializziamo un numero con la virgola con valore 0.5, l’istruzione accende il led1 e incrementa il valore della variabile 2
“i” l’espressione dopo il WHILE controllo lo stato della variabile “i”, finchè la variabile “i” è minore di 1 verrà eseguita l’istruzione interna al DO. Quindi l’istruzione interna al DO verrà eseguita almeno una volta anche se la variabile di controllo non rispetta l’espressione interna al WHILE.

Istruzione IF, ELSE-IF
L’istruzione ci permette di controllare un’espressione e in base a questa espressione esugue un set di istruzioni o un altro set. La sintassi può essere composta solo dall’IF oppure dall’IF e dall’ELSE ed è la seguente:

istruzione if mikroc

Nei tre esempi avremo le seguenti condizioni.
1)L’espressione interna all’IF controlla il valore della variabile, se soddisfa la condizione e segue l’istruzione che porta a livello alto il led1, se la condizione non è soddisfatta il programma esegue le istruzioni successive all’IF.
2)L’espressione interna all’IF controlla il valore della variabile, se soddisfa la condizione e segue l’istruzione che porta a livello alto il led1, se la condizione non è soddisfatta il programma esegue le istruzioni interne all’ELSE quindi spegnerà led1.
3)Nel terzo caso utilizziamo la linea di codice ELSE IF per controllare una seconda espressione. Il programma controlla la prima espressione, se è vera esegue la prima istruzione e non esegue le istruzioni precedute dall’ELSE. Nel nostro caso la prima espressione è vera quindi il led1 verrà acceso mentre lo stato del led2 non verrà alterato. Se la prima istruzione non fosse verifica il programma va a controllare l’espressione interna all’ELSE IF e in base a questa esegue o no l’istruzione presente all’interno di questa istruzione. Alla fine, se tutte e due le espressioni non sono verificate viene eseguita l’istruzione successiva all’ELSE. Quindi in base alle espressioni avremo un’evento, il diagramma di flusso è il seguente:

diagramma di flusso if-else mikroc

La prima immagine rappresenta il diagramma di flusso del primo caso, la seconda è il diagramma di flusso del secondo caso, avremo una espressione di controllo e due possibili istruzioni, il diagramma di flusso per altri casi rimane simile, cambia solo il numero di esporessioni di controllo e di istruzioni.

Istruzione SWITCH
Molto simile all’istruzione if-else lo SWITCH permette di valutare soltanto una variabile, in base a questa variabile avremo dunque un solo risultato. Questa istruzione è biunivoca, associa ad una sola variabile un solo risultato, vi è però in fine una scelta chiamata DEFAULT utile a catturare tutti i casi specificati. La sintassi di questa istruzione è:

istruzione case mikroc

Nell’esempio avremo che l’istruzione SWITCH si comporta come una specie di vettere, infatti all’insieme dei casi assegnamo il nome “switch” mentre il numero del caso in oggetto verrà chiamato “num” quindi se num=0 avremo il caso zero e la nostra istruzione SWITCH ritorna il valore 0xC0 e così via.

Istruzione FOR
Ci permette di eseguire una istruzione interna al ciclo FOR un certo numero di volte, la sintassi di questa istruzione è:

istruzione FOR mikroc

Nell’esempio poniamo a zero il livello del “led1” e inizializziamo una variabile di controllo “i”.
Nel ciclo FOR il valore della variabile “i” viene inizializzata con un valore numerico pari a 0 e ad ogni esecuzione del ciclo viene incrementata di 1 finchè il suo valore non sarà pari a 10 visto che la condizione di stop è i<10 ed “i” parte dal valore 0. All’interno del ciclo viene eseguita l’operazione di xor tra il valore dello stato del led1 e la costante 1; Il led1 è inizialmente spento, 0^1=1 , quindi il led1 si accenderà e rimarrà acceso per 500ms visto che l’istruzione successiva all’operazione di xor è Delay_ms(500). Questa istruzione è presente nelle librerie di MIKROC e introduce un ritardo di valore paria al numero in parentesi. Nel secondo passo del ciclo avremo che “i” assume un valore di 1, il led1 che nel passo precedente era stato posto ad un valore pari ad 1, per via dell’operazione di xor diventa 0 (1^1=0) così il led si spegne per 500ms e così via. Avremo un lampeggio.

 

PROGRAMMA DI ESEMPIO, LAMPEGGIO LED IN MIKROC

Questo secondo programma delle guide è un semplice lampeggio led in due versioni:

#define led PORTB.F0       //led sarà il pin RB0

void main() {              //inizio programma
  PORTB = 0b00000000;      //RB0:RB7 uscite
  TRISB = 0b00000000;      //RB0:RB7 a livello basso
    while(1) {             //ciclo infinito, 1 è sempre 1
      led=0;               //il led viene spento
      Delay_ms(200);       //per 200ms
      led=1;               //il led viene acceso
      Delay_ms(200);       //per 200ms
    }                      //si chiude il ciclo e ricomincia
}                          //chiusura programma

 

1)Nella prima versione definiamo la porta RB0 con il nome led, dopo il main che segna l’inizio del programma inizializziamo il registro PORTB come uscite con un valore basso. Il while con argomento “1” è un ciclo infinito che al suo interno esegue le istruzioni per il lampeggio del led,200ms sarà spento e per altri 200ms sarà acceso. Le due parentesi graffe finali chiudono prima il while e poi il programma.

#define led PORTB.F0       //led sarà il pin RB0

void main() {              //inizio programma
  PORTB = 0x00;            //RB0:RB7 uscite
  TRISB = 0x00;            //RB0:RB7 a livello basso
    while(1) {             //ciclo infinito, 1 è sempre 1
      led=led^1;           //operazione di xor tra led ed 1
      Delay_ms(1000);      //ritardo di 1secondo
    }                      //si chiude il ciclo e ricomincia
}                          //chiusura programma

 

2)Nella seconda versione cambia solo l’argomento del while, l’operando led (che viene inizializzato a 0 con la riga “TRISB = 0x00”) si va a sommare in modo esclusivo con l’operano 1, così che se il led è spento viene acceso, poi c’è un ritardo di un secondo che fa ritornare la variabile led all’operazione di xor, led essendo acceso viene spento e così via. Nel primo caso i numeri sono in formato bit (“0b00000000”) nel secondo caso in formato esadecimale (“0x00”).

Lo schema circuitale per tutti e due i programmi è il seguente:

schema lampeggio led

 

DOWNLOAD CODICE IN VERSIONE .MCPPI E .ASM

VERSIONE LAMPEGGIO1

VERSIONE LAMPEGGIO2



 

[Voti Totali: 0 Media Voti: 0]
Segui la Nostra Pagina Facebook: Facebook

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *