Corso di C per Pic (Parte I)

Il C e' un linguaggio con un livello di astrazione, rispetto all'hardware, superiore all'Asm.

Questo non significa che sia superiore all'Asm, semplicemente che alcune operazioni sono piu' semplici e che alcune istruzion i C corrispondono a molte piu' righe in Asm.

Questo corso e' orientato all'uso di questo linguaggio sui Pic in particolar modo il 16F84 ed il 16F628.

Diciamo subito che il C e' un linguaggio che si presta a diventare poco leggibile se non si seguono delle regole di scrittura.

In primo luogo e' "case sensitive", ovvero per lui scrivere Ciao o ciao non e' la stessa cosa quindi occhio.

Altra caratteristica e' che le istruzioni devono essere separate tra loro con un ";", quindi non contano gli "a capo", la riga termina quando il compilatore incontra un ";".

Cominciamo subito vedendo il nostro primo programma in C (Esempio.c)

/* Questo e' un commento */

#include <pic.h>

main()

{

TRISB=0;

PORTB=255;

}

Analizziamo riga per riga

/* Questo e' un commento */

Contiene un commento, cioe' del testo che il compilatore ignorera' e che serve a noi per spiegare che cosa fanno le righe di codice. Dopo un po' di tempo, riaprendo un vecchio programma, avere dei commenti al codice vi rendera' la vita piu' facile.

Il commento inizia con la sequenza /* e termina con */

#include <pic.h>

Contiene un "pragma" di precompilazione, cosi' si chiamano tutte le istruzioni che iniziano con #.

In questo caso l'include serve per includere nel nostro file il contenuto di un altro file (pic.h).

Facciamo un esempio pratico.

Se ho un file (a) con:

1

2

3

ed un file (b) con:

#include <a>

4

5

6

per il compilatore e' come se avessi un solo file con :

1

2

3

4

5

6

chiaro? Speriamo...

Un ultima informazione, se scrivo #include <pic.h> significa che il file pic.h e' nella dir INCLUDE, se invece scrivo #include "led.h" significa che il file e' nella stessa dir del programma.

La differenza e' nell'uso delle parentesi angolate '<' e '>' che indicano implicitamente INCLUDE, contro le virgolette " che invece consento di specificare il path del file da includere.

 

main()

Ecco la riga piu' importante, e' l'inizio vero e proprio del nostro programma. Tutti i programmi iniziano con una funzione chiamata "main"

{

Benvenuti nella funzione main come potete notare questa riga contiene una parentesi graffa.

In C le parentesi graffe servono come "contenitori" di codice. Questa prentesi dice che inizia la funzione main che termina con la parentesi graffa in fondo al programma.

TRISB=0;

Qui abbiamo un assegnamento, o meglio stiamo mettendo il valore "0" nel contenitore TRISB. Che cosa e' TRISB? Per il momento accontentiamoci di dire che e' il registro che determina nel Pic la "direzione" dei dati della porta B.

Mettendolo a "0" impostiamo come Uscite tutti gli 8 pin della porta B.

PORTB=255;

Ecco un altro assegnamento che mette 255 nel registro PORTB. Anche in questo caso mi limito a dire che questa istruzione pone a livello alto tutti i pin della porta B.

Se avete attaccata la scheda di test del Pic dovrebbero accendersi tutti i led.

Per concludere questa lezione ancora qualche considerazione.

1) Dato cle le linee di istruzioni, per il compilatore, si concludono con il ";" avremmo potuto scrivere le utime due righe in un'unica linea:

TRISB=0;PORTB=255;

Per il compilatore non sarebbe cambiato nulla, per noi invece sarebbe stato piu' difficile leggere il listato.

2) I numeri che abbiamo usato per l'esempio sono stati scritti in notazione decimale (0, 255), ma avremmo potuto scriverli anche in Esadecimale (0=0x0, 255=0xFF) o in binario (0=0b00000000, 255=0b11111111)

 

ESERCIZI

Provate a modificare il valore assegnato a PORTB e verificate quali led si accendono.

Provate a cambiare la notazione del valore assegnato a PORTB in esadecimale ed in binario e provate a vedere che cosa cambia nei led.

Vi consiglio di usare la calcolatrice di Windows per vedere i valori Decimale->Esadecimale->Binario

 

TEST

  1. Quale di queste righe é corretta?
    1. TRISB=0, PORTB=240;
    2. TRISB=0; PORTB=240;
    3. TRISB=0 PORTB=240;
  2. Come si scrive in esadecimale il valore 240 decimale?
    1. 0xF0
    2. 0*f0
    3. f0x0
  3. Come si scrive in binario il valore decimale 136?
    1. 0b10001000
    2. bin10001000
    3. 10001000b0