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++;

}