Corso di C per Pic (Parte II)

Prosegue il corso di C.

Per poter vedere gli effetti dei nostri programmi vi consiglio di realizzare un piccolo circuito come il seguente

Vediamo ora un nuovo programma ed analizziamolo riga per riga.

(Esempio2.c)

/* Questo e' un commento

che si estende su piu' righe

perche' vi ricordo che termina con -> */

#include <pic.h>

#include "delay.c"

main()

{

TRISB=0;

while(1)

{

PORTB=255;

DelayMs(250);

PORTB=0;

DelayMs(250);

}

}

/* Questo e’ un commento */

Solito commento, questa volta pero' si estende su piu' righe.

#include <pic.h>

Come nel primo esempio dobbiamo includere pic.h, in questo file vengono definiti tutti i registri tipici del processore per cui stiamo compilando.

#include "delay.c"

Questa riga include un file che contiene delle routines di ritardo, viene fornita con le librerie standard e contiene due funzioni.

DelayMs(num) che attende per "num" millisecondi (millesimi di secondo)

DelayUs(num) che attende per "num" microsecondi (milionesimi di secondo)

main()

La nostra cara main da cui parte sempre l'elaborazione del programma.

{

La graffa che apre main... ricordate

TRISB=0;

Al solito usiamo in registro TRISB per impostare la porta B come Output. Spieghiamo meglio l'uso di questo registro.

TRISB e' un byte ovvero 8 bit, ciascun bit rappresenta un pin della porta B, se metto in corrispondenza di quel pin uno "0" la porta sara' di Output, se metto un "1" la porta sara' di Input.

Se rappresentiamo in binario risulta tutto piu' semplice

0b00000000 = tutti in Output

0b00001111 = i pin 0-4 sono Input ed i pin 5-8 sono in output

while(1)

Qui facciamo la conoscenza con un'istruzione molto usata la "while". La sintassi del comando e' come segue.

while(condizione)

{

codice da ripetere

}

La "while" ripete il codice compreso tra le graffe finche' la condizione tra parentesi e' vera.

Ora dato che in C "0=falso" e "diverso da 0 = vero", dire "while(1)" e' come dire "per sempre".

In questa riga quindi inizia un "ciclo" da cui non si esce MAI.

La cosa e' ovviamente voluta e serve per ripetere all'infinito le istruzioni comprese tra graffe.

{

Ecco la graffa di apertura del ciclo while

PORTB=255;

Metto a 1 tutti gli Output della porta B

DelayMs(250);

Chiamata alla funzione di attesa contenuta in Delay.c.

In questo caso attendiamo 250ms, cioe' un quarto di secondo.

Notare che la DelayMs accetta in ingresso un dato di tipo "char", che cosa significa esattamente lo spiegheremo nella prossima lezione, per ora accontentatevi di sapere che questo limita i valori passabili da 0 a 255.

Come faccio allora ad aspettare per 300ms?

Chiamando due volte la DelayMs:

DelayMs(150);

DelayMs(150);

Semplice vero?

PORTB=0;

Azzero le uscite di port B

DelayMs(250);

Attendo 250ms

}

Graffa di chiusura del ciclo while, si ritorna da capo alla riga del while.

}

Graffa di chiusura della main.

Ecco che abbiamo ottenuto un programma che fa lampeggiare dei led.

ESERCIZI

1) Provare a variare i valori associati alla PORTB per vedere l'effetto sui led

2) Provare a variare le temporizzazioni agendo sulla DelayMs

3) Provare a variare il codice contenuto nel ciclo while per ottenere delle sequenze di illuminazione dei led