Sei sulla pagina 1di 2

Esperienza in laboratorio sul PIC16F877A

Un lavoro di : Salvatore Parisi Olariu Vlad Francesco Quinci Omar Bozza

Premessa:
Bench il professore abbia esplicitamente dichiarato il fatto di essere in non pi di 3 membri nello stesso gruppo, noi siamo in 4 perch, a causa delle condizioni meteorologiche (neve), il sottoscritto (Olariu) e Parisi, appartenenti a due gruppi diversi, si sono "uniti", in quanto mancava ad entrambi il partner (rispettivamente, Bozza e Quinci). Abbiamo dunque dovuto continuare il lavoro in 4, in quanto il materiale era lo stesso. Spero che questo non pregiudichi la valutazione finale.

Su cosa si lavorato?
Lo strumento fondamentale utilizzato quest'anno stato il PIC, di conseguenza anche in questa esperienza lo si impiegato per i nostri scopi. Non stiamo qui a discutere delle sue caratteristiche, in quanto l'abbiamo gi fatto nella scorsa relazione. Quello di cui ci interessa parlare la parte nuova: attraverso il convertitore analogico/digitale integrato nel PIC, siamo stati in grado di far "contare" il PIC utilizzando diversi livelli di tensione manipolata attraverso un trimmer da 20K circa.

Come funziona?
Il tutto molto semplice: Abbiamo collegato la breadboard con il PIC e tutti i collegamenti necessari ad una "saponetta" (MPLab), attraverso la quale "governavamo" il PIC, inserendo il codice nel linguaggio C. Nello specifico, noi abbiamo utilizzato la porta AN0 per il segnale analogico di input (la si puo' vedere in figura, sulla sinistra, la seconda). Abbiamo scritto il codice nella subroutine dedicata alla gestione del Timer_1 e, attraverso una serie di IF, abbiamo definito i range nei quali accendere o spegnere i nostri 4 led (abbiamo contato fino a 15, in quanto 2^4 (led)=15 numeri, con 0 compreso). Usare il convertitore stato abbastanza semplice, in quanto il PIC ci viene molto in contro. Dopo aver inizializzato i diversi strumenti per la conversione, la vera chicca sta nella seguente riga:

value = read_adc(); Attraverso essa, il PIC legge il valore analogico che gli diamo attraverso AN0 (read_adc) e lo mette in una sua variabile predefinita (value). Noi, in seguito, nella gestione della subroutine del Timer_1 controlliamo, come detto in precedenza, se questa variabile compresa in un determinato range determinato dai noi. Come? E' abbastanza semplice: sapendo che il convertitore del PIC stato impostato a 8 bit, esso puo' contare fino a 2^8 = 256 numeri (zero compreso). Dividendo questo numero per 16, si ha che l'intervallo cercato di 16 "scatti". Vediamo per un semplice esempio: if (value<=16) //fintanto che il segnale analogico in entrata { // minore di 16, dai come risolutato 0 (4 led spenti): output_bit(PIN_A1,0); output_bit(PIN_A2,0); // 0000 -> 0 output_bit(PIN_A3,0); output_bit(PIN_A5,0); Nel codice qui sopra, si controlla che il valore in entrata, analogico (contenuto in value), sia minore di 16. Nel caso sia vero, le varie funzioni output_bit si preoccupano di far accendere o spegnere i led. In questo caso, sei value<=16, allora siamo nel numero 0, rappresentato dal fatto che tutti i led sono spenti. Verr spontaneo chiedersi: ma come cambiamo il valore contenuto in value? Semplice: questo valore modificato attraverso il trimmer, che, aumentando o diminuendo il valore della sua resistenza interna, fa modificare la tensione, permettendoci di "contare" fino a 15 (+ lo 0). Purtroppo non si potuto testare il tutto, in mancanza di tempo, ma lo stesso principio stato applicato con successo a un motore elettrico, con cui ha funzionato a meraviglia. In allegato questo file si trova anche il codice sorgente in C, anche esso abbondantemente commentato.