Corso di C per Pic (Parte IV)
Eccoci ad un nuovo appuntamento con il nostro corso di C.
Questa lezione cerchera' di spiegare le basi di un linguaggio di programmazione:
1) Variabili
2) Salti condizionati
3) Cicli
1) Le variabili.
Fino ad ora abbiamo sempre espresso nei nostri programmi grandezze costanti (es. il ritardo passato alla funzione di ritardo). Questo significa che il valore era impostato "fisso" prima della compilazione e non cambiava per tutta la durata del programma.
Ma se abbiamo bisogno di un valore che cambia?
Allora dobbiamo usare una variabile.
Per poter usare una variabile dobbiamo prima definirla, la definizione di una variabile avviene tassativamente all'inizio di un blocco programma, prima di qualsiasi istruzione.
(Esempio4a.c)
#include <pic.h>
main()
{
char contatore;
contatore = 1;
PORTB = contatore;
}
Analizziamo il programma
char contatore;
Ecco la "dichiarazione" della variabile, che si compone di "tipo" = char e "nome" = contatore.
Il primo dice che tipo di dato conterra' la variabile il secondo e' il nome simbolico che useremo nel programma per riferirci a quella variabile.
ATTENZIONE : usate sempre nomi esplicativi... inutile una variabile di nome "gfhfghf", all'interno di un programma complesso non sara' chiaro che cosa rappresenta.
I tipi di variabili cambiano a seconda dell'uso della stessa vediamo i principali:
bit |
1 |
boolean |
char |
8 |
e' lunga un byte e puo' contenere un numero da -127 a 128 |
unsigned char |
8 |
lunga sempre un byte ma senza il segno contiene un numero da 0 a 255 |
short |
16 |
2 byte contiena da -32,768 a 32,767 |
unsigned short |
16 |
2 byte da 0 a 65535 |
int |
16 |
come la short |
unsigned int |
16 |
come la short |
long |
32 |
4 byte da -2,147,483,648 a 2,147,483,647 |
unsigned long |
32 |
4 byte da 0 a 4,294,967,295 |
float |
24 |
reale ( contengono numeri con la virgola |
double |
24 |
reale ( con vari livelli di precisione |
double |
32 |
reale ( raramente le useremo su un Pic |
2) Salti condizionati
Vediamo ora un altro esempio
(sempio4b.c)
#include <pic.h>
main()
{
char conteggio;
conteggio = 1; /* assegno a conteggio il valore 1 */
while(1) /* questo e' un ciclo infinito... ricordate? */
{
PORTB = conteggio; /* porto il valore di conteggio in PORTB */
conteggio++; /* incremento conteggio */
if(conteggio == 10) /* se conteggio e' uguale a 10... */
conteggio = 1; /* ...allora lo rimetto a 1 */
}
}
In questo listato ho fatto uso dei commenti per spiegare alcune righe... ricordate i commenti?
Vediamo le righe piu' importanti
conteggio++;
Vediamo l'uso del doppio piu' che indica al compilatore di incrementare di uno la variabile.
Messo in una riga da solo equivale a dire:
conteggio = conteggio + 1;
Per una caratteristica del C pero' e' possibile usare il "++" anche all'interno di una espressione.
Avremmo potuto scrivere anche la riga in questo modo:
PORTB = conteggio++;
e non sarebbe cambiato nulla, il compilatore avrebbe passato il valore a PORTB e poi avrebbe incrementato conteggio, ma avremmo potuto scrivere anche :
PORTB = ++conteggio;
In questo caso il compilatore avrebbe prima incrementato e poi passato il valore a PORTB.
Operatori:
++ incrementa di 1
-- decrementa di 1
+ somma
- sottrai
* moltiplica
/ dividi
+= somma un valore e riassegna
-= sottrai un valore e riassegna
esempi
c = a+b;
se a=1 e b=3 allora c = 4
c = b-a;
allora c = 2;
c += 2;
e' come dire c = c + 2;
c -= 4;
e' come dire c = c - 4;
if(conteggio == 10)
Vediamo il primo salto condizionato:
if = se
(conteggio == 10) notate l'uso di "==" per fare un confronto... infatti "=" sarebbe un assegnamento e per una caratteristica del C se avessimo scritto "if(conteggio=10)" sarebbe stata sempre vera in quanto avrebbe sempre assegnato a conteggio il valore 10.
ATTENZIONE all'uso di "=" e di "=="
la riga successiva quindi viene eseguita solo quando e' vera l'espressione di "if" cioe' quando conteggio e' uguale a 10
3) Cicli
esistono due cicli
for e while
a) ciclo for
la sintassi e' :
for(i=0;i<10;i++)
la prima parte "i=0" indica che il for partira' con i che vale 0.
la seconda parte "i<10" indica che il for continuera' finche' i varra' meno di 10.
la terza parte "i++" indica che ad ogni giro i sara' incrementata di 1.
possiamo allora scrivere
for(i=0;i<10;i++)
{
PORTB = i;
}
per assegnare a PORTB i valori da 0 a 9
ATTENZIONE : la condizione di uscita del for era i<10 e quando i arriva a 10 esce dal cilco e non esegue il suo contenuto quindi PORTB non prendera' mai il valore 10.
Possiamo anche scrivere
for(i=0;i<10;i+=2)
{
PORTB = i;
}
in questo caso i valori di i saranno
0,2,4,6,8
e se vassimo scritto
for(i=0;i<10;++i++)
{
PORTB = i;
}
quali sarebbero i valori di i ?
b) Ciclo while
Lo abbiamo gia' visto in precedenza per costruire cicli infiniti. Adesso vediamo di fare cicli finiti.
while(condizione)
ciclo
il ciclo viene eseguito finche' la condizione e' vera.
esempio
while(i<10)
{
PORTB = i;
i++;
}
Da notare che in questo caso non e' garantito l'esecuzione del ciclo, infatti se ad esempio scriviamo
i = 100;
while(i<10)
{
PORTB = i;
i++;
}
assegnando prima del ciclo ad "i" il valore 100 la condizione del while sara' subito falsa e quindi il ciclo non verra' eseguito.
Anche se puo' sembrare assurdo la situazione potrebbe verificarsi se i viene manipolata molte righe prima:
i = 100;
...
...
...
...
...
...
while(i<10)
{
PORTB = i;
i++;
}