Lezione n°13 - mrscuole.net

Transcript

Lezione n°13 - mrscuole.net
Corso introduttivo sui
microcontrollori
A. S. 2007 – 2008
Programmare i PIC in C
Demo-Board AnxaPic: il display LCD 4x20
PIC16F877: uso dell’ADC integrato
Nicola Amoroso
[email protected]
NA – L13
http://www.mrscuole.net/anxapic/
1
http://www.mrscuole.net/anxapic/
http://www.mrscuole.net/anxapic/
Programmare i microcontrollori in linguaggio C
Demo-Board AnxaPic: il display LCD 4x20
Per approfondimenti sui display LCD => http://www.giobe2000.it/HW/HD44780/Pag/Home.asp
Questo dispositivo elettronico è molto diffuso, il visualizzatore (Display) a Matrice di Punti
offre all'utente un'eccellente base per il controllo dell'oggetto da lui utilizzato.
Il suo nome deriva dal fatto che l'informazione è affidata allo stato di numerosi piccoli punti
(pixel), organizzati su righe e colonne (Matrice) successive.
Il visualizzatore può essere:
• Alfanumerico: in questo caso i punti sono predisposti in gruppi di 5*10 (5*8 o anche 5*7)
pixel; accendendo opportunamente i puntini ogni gruppo può assumere l'aspetto di un
carattere; di solito questi visualizzatori mostrano una o più righe di caratteri, fino a 40
caratteri per riga.
• Grafico: su questi display non si distinguono le righe di caratteri tipiche degli alfanumerici:
l'area dei pixel è organizzata in modo omogeneo e continuo, prestandosi in modo egregio
a realizzare un'immagine più o meno grande, a seconda della risoluzione
NA – L13
http://www.mrscuole.net/anxapic/
2
http://www.mrscuole.net/anxapic/
http://www.mrscuole.net/anxapic/
Programmare i microcontrollori in linguaggio C
Demo-Board AnxaPic: il display LCD 4x20
Per approfondimenti sui display LCD => http://www.giobe2000.it/HW/HD44780/Pag/Home.asp
Importante è la tecnica utilizzata per accendere i pixel; i metodi di pilotaggio sono
sostanzialmente 2:
•
a matrice passiva: è il più diffuso e il più economico, quando si parla di display LCD si
intende questo modello, si basa sull'applicazione di campi elettrici da applicare su un
reticolo di elettrodi di riga e di colonna, trasparenti, posti ai lati del cristallo liquido; quasi
tutti i dispositivi elettronici (orologi digitali, calcolatrici, i primi portatili…) usano questa
tecnica per accendere i pixel.
•
a matrice attiva: ogni singolo pixel è associato ad un transistor (Thin Film Transistor),
per cui si parla di display TFT-LCD o più sinteticamente di display TFT; la
visualizzazione su di esso è splendida (nel vero senso della parola…) e il controllo dei
pixel è veloce e accurato; naturalmente gli elettrodi del primo tipo non sono necessari
ma la presenza di un componente attivo per ogni pixel porta i costi a livelli piuttosto alti
ancora oggi.
NA – L13
http://www.mrscuole.net/anxapic/
3
http://www.mrscuole.net/anxapic/
http://www.mrscuole.net/anxapic/
Programmare i microcontrollori in linguaggio C
Demo-Board AnxaPic: il display LCD 4x20
Per approfondimenti sui display LCD => http://www.giobe2000.it/HW/HD44780/Pag/Home.asp
I display a cristalli liquidi (LCD, Liquid Cristal Display) sono visualizzatori che, a differenza
dei tubi a raggi catodici (CRT, Cathode Ray Tubes) che sono una sorgente luminosa,
riflettono o assorbono la luce prodotta da una sorgente luminosa esterna o da un sistema di
retroilluminazione.
Il Visualizzatore a Matrice di Punti a cristalli liquidi è, in realtà, solo la parte più appariscente
di un modulo LCD ed è assolutamente inutile senza un circuito elettronico in grado di gestirlo
e, dato l'oneroso compito a cui è chiamato, sembra improbabile solo pensare a realizzarlo
con componenti discreti.
Il mercato offre strutture integrate (moduli) dotate di tutto ciò che serve, montato su un
circuito stampato; da un lato è saldato il display e sul lato opposto sono in evidenza i circuiti
integrati.
NA – L13
http://www.mrscuole.net/anxapic/
4
http://www.mrscuole.net/anxapic/
http://www.mrscuole.net/anxapic/
Programmare i microcontrollori in linguaggio C
Demo-Board AnxaPic: il display LCD 4x20
Per approfondimenti sui display LCD => http://www.giobe2000.it/HW/HD44780/Pag/Home.asp
Certamente il più importante tra questi è il controller HD44780, un componente
programmabile chiamato ad un duplice compito:
•
dispone della struttura necessaria per gestire fino a 50 (10*5) pixel per ciascuno dei
possibili caratteri alfanumerici (16, 20, 24, 32, 40, ..) del display, organizzati su una o più
righe
•
assicura l'interfaccia intelligente tra il visualizzatore e il microcontrollore chiamato a
gestirlo.
Vedremo in seguito come gestire il display LCD presente sulla nostra demo-Board AnxaPic4. Il nostro display, seppur efficace e
valido, appartiene alla categoria di display a basso costo (spesso rimediabili nei mercatini e fiere di elettronica per hobbysti o nei
centri vendita di materiali di surplus elettronico [es. http://www.micromed.it/Elettronica/], è comunque retroilluminato e sicuramente
molto efficace per i nostri scopi
NA – L13
http://www.mrscuole.net/anxapic/
5
http://www.mrscuole.net/anxapic/
http://www.mrscuole.net/anxapic/
Programmare i microcontrollori in linguaggio C
Demo-Board AnxaPic: il display LCD 4x20
Piedinatura standard modulo LCD
N. Pin
Nome
I/O
Descrizione
1
Vss
Power
GND
2
Vcc
Power
+5V
3
Vo
Analog
Reg contrasto
4
Rs
Input
Select Dati/Istruz
5
R/W
Input
Read/Write
6
E
Input
Abilitazione
7
D0
I/O
Dati LSB
8
D1
I/O
Dati
9
D2
I/O
Dati
10
D3
I/O
Dati
11
D4
I/O
Dati
12
D5
I/O
Dati
13
D6
I/O
Dati
14
D7
I/O
Dati
15
Bl+
Power
Retroill+
16
Bl-
Power
Retroill-
NA – L13
Piedinatura del modulo LCD
I pin 1 (Vss) e 2 (Vcc) servono per fornire alimentazione (5 volt);
di solito l'assorbimento è contenuto, dell'ordine di pochi mA.
Il pin 3 (Vo) è un ingresso analogico al quale si deve fornire una
tensione compresa tra 0 e 5V al fine di regolare il contrasto del
display, cioè la capacità di rendere più o meno scuri i pixel attivi,
per rendere migliore la visualizzazione, in funzione della
luminosità dell’ambiente, del display; di solito la regolazione si
ottiene con un potenziometro da 10k.
Il pin 4 (RS), detto Register Selector, indica la natura
dell’informazione presente sul bus dati: se viene forzato a 0 il
byte in ingresso sarà interpretato come un comando da eseguire
(istruzione), mentre con un 1 sarà ritenuto dato da interpretare.
Il pin 5 (R/W) specifica la direzione dei bytes sul bus: se vale 0 si
sta scrivendo nella memoria interna LCD, mentre con un 1
questa memoria è sottoposta a lettura.
Il pin 6 (E) è il segnale che abilita il dispositivo: quando è a livello
alto sincronizza la lettura del dato o del comando predisposto sul
bus dati. L'Enable è il vero e proprio segnale di sincronismo, da
forzare a 1 quando il dispositivo è pronto a gestire un dato o un
comando predisposto sul bus dati (in funzione del valore del busy
flag: finché il suo valore è 1 il controller è occupato a gestire i
trasferimenti interni e non è in grado di accettare l'istruzione
successiva).
I pin dal numero 7 al numero 14 (D0-D7) rappresentano il Data
Bus su cui avviene la trasmissione o ricezione dati dal display, in
base all’operazione che si sta svolgendo.
Talvolta sono presenti 2 pin aggiuntivi (pin 15 e 16), mediante i
quali è possibile alimentare l'eventuale luce di retroilluminazione.
http://www.mrscuole.net/anxapic/
6
http://www.mrscuole.net/anxapic/
http://www.mrscuole.net/anxapic/
Programmare i microcontrollori in linguaggio C
Demo-Board AnxaPic: il display LCD 4x20
AnxaPic4: modulo LCD text 4x20 - Collegamenti elettrici
Sulla nostra demo-Board sono disponibili connettori per moduli LCD
grafico e text, vediamo come è collegato il modulo text 4 righe 20 colonne.
I dati viaggiano su un bus a 4 bit [una delle due possibilità di
implementazione del trasferimento dati con modulo LCD di tipo intelligente
(es. con controller Hitachi HD44780)]. I Pin del controllore utilizzati sono:
RD4, RD5, RD6, RD7 (nibble alto PORTD).
I segnali di controllo Rs, R/W e E utilizzano i Pin RD1, RD2, RD0 rispettivamente; nel caso in cui il modulo
viene impiegato in sola scrittura (cioè il controllore non rileva la posizione e il carattere generato) il pin R/W
viene collegato a GND (quindi sola scrittura per il modulo) mediante opportuno jumper, in questo caso viene
liberato il Pin RD2 del controllore che può essere sfruttato per altro servizio, nel nostro caso può pilotare un
buzzer autooscillante collegato sul Pin RD2 (oppure sul Pin RC5) sempre mediante apposito jumper.
In definitiva il Pin R2D può essere collegato (mediante jumper) verso GND (modalità sola scrittura per il
modulo) oppure verso RD2 (modalità lettura/scrittura per il modulo; è chiaro che in questo secondo caso il
buzzer autooscillante della board non può essere pilotato dal pin RD2.
La modalità in sola scrittura è quella preferita e in seguito utilizzeremo sempre questa condizione.
Per ulteriori ragguagli confrontare lo schema elettrico della demo-Board.
NA – L13
http://www.mrscuole.net/anxapic/
7
http://www.mrscuole.net/anxapic/
http://www.mrscuole.net/anxapic/
Programmare i microcontrollori in linguaggio C
Demo-Board AnxaPic: il display LCD 4x20
AnxaPic4: modulo LCD text 4x20
Il display a cristalli liquidi montato sulla scheda è di tipo intelligente:
LCD vero e proprio viene controllato da un complesso chip che si occupa
di gestire il protocollo di comunicazione. Questo chip è l’Hitachi HD44780
portD
Pin RD1, R2D, RD0
R2D può essere collegato con
GND oppure con RD2
portD
Pin RD4, RD5,
RD6, RD7
NA – L13
http://www.mrscuole.net/anxapic/
8
http://www.mrscuole.net/anxapic/
http://www.mrscuole.net/anxapic/
Programmare i microcontrollori in linguaggio C
Demo-Board AnxaPic: il display LCD 4x20
AnxaPic4: modulo LCD text 4x20
•
Per scrivere un carattere sul display si inviano all’LCD due gruppi di 4 bits
ciascuno, cioe` 8 bits, che rappresentano il codice ascii del carattere da
visualizzare.
•
Per poter scambiare dati con il modulo LCD si impiega un opportuno file di libreria che
comprende tutte le funzioni tipiche per lo scambio di dati e comandi con il modulo;
naturalmente con questo opportuno libreria-“driver” si gestisce opportunamente la elettronica
del modulo LCD.
Per la nostra demo-Board e modulo LCD a matrice 4x20 il file di libreria è denominato
”lcd_4x20.c”, quando si vuole utilizzare l’LCD, della demo-Board, bisogna sempre
includere questo file nel nostro codice sorgente.
•
Funzioni di uso comune del file di libreria:
init_lcd(); => da eseguire prima di tutto, resetta e inizializza l’LCD
printf(lcd_putc, “FRANCO"); => si puo’ utilizzare printf anche per scrivere sull’LCD. printf passa la
stringa “FRANCO” alla funzione lcd_putc che la scrive sull’LCD
lcd_gotoxy(x,y);
=> sposta il cursore nella posizione x,y (colonna. riga) del display
lcd_putc(c); => Mostra il carattere c nella posizione seguente a quella del cursore.
I seguenti caratteri sono speciali: => \f Cancella il display
\n Cursore a inizio seconda riga
\b Cursore indietro di una posizione
NA – L13
http://www.mrscuole.net/anxapic/
9
http://www.mrscuole.net/anxapic/
http://www.mrscuole.net/anxapic/
Programmare i microcontrollori in linguaggio C
Demo-Board AnxaPic: il display LCD 4x20
AnxaPic4: modulo LCD text 4x20
•
Per la nostra demo-Board e modulo LCD a matrice 4x20 il file di libreria è denominato
”lcd_4x20.c”, quando si vuole utilizzare l’LCD, della demo-Board, bisogna sempre
includere questo file nel nostro codice sorgente.
•
Questo file di libreria non è altro che un riadattamento del file “lcd420.c”, della CCS Inc,
incluso nella directory di installazione del nostro CCS PCWH Pic-C Compiler nella cartella
“Drivers”; il file è stato opportunamente modificato e riadattato per l’uso con la nostra demoBoard e il nostro modulo display LCD.
•
Uno dei punti di forza di questo sistema di sviluppo è la disponibilità di un forum aperto a
tutti con disponibilità di materiali, codice e drivers molto utili.
Http:// www.ccsinfo.com/forum/ merita sicuramente una visita se si vuole conoscere più a
fondo la programmazione e lo sviluppo in C dei microcontrollori Microchip a 8 e 16 bit.
NA – L13
http://www.mrscuole.net/anxapic/
10
http://www.mrscuole.net/anxapic/
http://www.mrscuole.net/anxapic/
Programmare i microcontrollori in linguaggio C
Demo-Board AnxaPic: il display LCD 4x20
AnxaPic4: modulo LCD text 4x20 – Un semplice esercizio per iniziare a conoscere e … lavorare
Vediamo ora un semplice esercizio per cominciare a conoscere il sistema e iniziare a lavorare con il
display LCD text 4x20.
Si vogliono visualizzare su display dei semplici elementari messaggi di benvenuto attivando
contemporaneamente il led e il Buzzer (Autooscillante) presenti sulla Demo-Board; ricordiamoci
che il display è attivato in modalità sola scrittura quindi, i PIN RD3 e RD2 vengono utilizzati per
pilotare il Led e il Buzzer on board (ricordarsi di configurare opportunamente i relativi jumpers).
Da questo punto in poi tralasceremo la fase di “set system” e l’uso del relativo tool “Pic
Wizard” del CCS PCWH Pic-C Compiler.
L’Hardware è già implementato on board, per la soluzione del nostro progetto bisogna solo
proporre un flow-chart e il relativo codice sorgente.
Quello che seguirà è un progetto elementare con codice sorgente adatto a principianti come
noi siamo, in seguito sicuramente miglioreremo in qualità!
NA – L13
http://www.mrscuole.net/anxapic/
11
http://www.mrscuole.net/anxapic/
http://www.mrscuole.net/anxapic/
Programmare i microcontrollori in linguaggio C
Demo-Board AnxaPic: il display LCD 4x20
AnxaPic4: modulo LCD text 4x20 – Un semplice esercizio – Main flow-chart e codice sorgente part1
Main flow-chart relativo a tutto il progetto
Il codice sorgente è relativo alla sola fase di inzializzazione
Notare alla riga 14 lo include del driver file di libreria
“lcd_4x20.c” nel codice sorgente. Ricordarsi che tale file è
indispensabile per poter “pilotare” il nostro display LCD
Notare i relativi define per Led e Buzzer
NA – L13
http://www.mrscuole.net/anxapic/
12
http://www.mrscuole.net/anxapic/
http://www.mrscuole.net/anxapic/
Programmare i microcontrollori in linguaggio C
Demo-Board AnxaPic: il display LCD 4x20
AnxaPic4: modulo LCD text 4x20 – Un semplice esercizio – Main flow-chart e codice sorgente part2
Il system Set nella main function generato dal Pic Wizard Tool
NA – L13
http://www.mrscuole.net/anxapic/
13
http://www.mrscuole.net/anxapic/
http://www.mrscuole.net/anxapic/
Programmare i microcontrollori in linguaggio C
Demo-Board AnxaPic: il display LCD 4x20
AnxaPic4: modulo LCD text 4x20 – Un semplice esercizio – Main flow-chart e codice sorgente part3
Lcd_init();
NA – L13
// indispensabile per l’uso del display
http://www.mrscuole.net/anxapic/
14
http://www.mrscuole.net/anxapic/
http://www.mrscuole.net/anxapic/
Programmare i microcontrollori in linguaggio C
Demo-Board AnxaPic: il display LCD 4x20
AnxaPic4: modulo LCD text 4x20 – Un semplice esercizio – Main flow-chart e codice sorgente part4
Tutto OK?
Verifichiamo il lavoro programmando il microcontrollore sulla nostra demo-Board
Il nostro progetto è stato felicemente implementato!
NA – L13
http://www.mrscuole.net/anxapic/
15
http://www.mrscuole.net/anxapic/
http://www.mrscuole.net/anxapic/
Programmare i microcontrollori in linguaggio C
Demo-Board AnxaPic: il display LCD 4x20
AnxaPic4: modulo LCD text 4x20 – Esercizio proposto
Un pulsante, normalmente aperto, viene collegato ai capi del PIN RB1 del nostro micro
(ricordarsi la condizione di collegamento pul-Up attivo), visualizzare su display la scritta
“Pulsante close” quando viene premuto il tasto e visualizzare anche il numero di volte in cui è
stato premuto sino all’istante attuale.
Sviluppare l’esercizio seguendo le semplici fasi di sviluppo:
1.
Analisi del problema, schematizzazione a blocchi (se necessario), con schema elettrico
finale operativo
2.
Impostazione del Software e relativo Flow – Chart
3.
Codice sorgente in linguaggio C [CCS Pic PCWH Compilator]
4.
Simulazione in ambiente Proteus VSM interfaccia ISIS
5.
Presentazione del lavoro finale su demo-Board opportuna (Gp_Mbus …. AnxaPic4)
6.
Opportuna documentazione conclusiva
NA – L13
http://www.mrscuole.net/anxapic/
16
http://www.mrscuole.net/anxapic/
http://www.mrscuole.net/anxapic/
Programmare i microcontrollori in linguaggio C
Pic16F877 – Uso dell’ADC integrato
•
Una delle periferiche più importanti dei PIC è quella relativa al convertitore A/D
(Analogico/Digitale). Il PIC 16F877 ha 8 ingressi analogici che permettono la conversione di un
segnale di ingresso analogico, il cui valore oscilli tra 0 e Vcc oppure tra 0 ed una tensione esterna di
riferimento (compresa tra 0 e Vcc), in un corrispondente numero digitale a 8 o 10 bit.
Essendo presente un solo modulo
convertitore, gli ingressi devono essere
multiplexati da una logica interna,
l’uscita del multiplexer viene inviata ad
un circuito di sample and hold che a
sua volta pilota il vero e proprio
convertitore, che genera il risultato per
approssimazioni successive.
NA – L13
http://www.mrscuole.net/anxapic/
17
http://www.mrscuole.net/anxapic/
http://www.mrscuole.net/anxapic/
Programmare i microcontrollori in linguaggio C
Pic16F877 – Uso dell’ADC integrato
La conversione avviene in due
passaggi:
1.
2.
si carica un condensatore
(acquisition time) SAMPLE
il condensatore viene chiuso su
alta impedenza ed il valore ai
suoi capi viene misurato
(conversion time) HOLD
La fase di conversione utilizza una tecnica ad approssimazioni successive, con un suo ciclo
di clock, più lento di quello del clock di sistema e ottenuto da questo per divisione, il clock
dell’ADC è in genere uguale al clock di sistema diviso otto. In fase di definizione del progetto
il Pic Wizard Tool permette di definire la frequenza di conversione; una opportuna built-In
function del compilatore agisce e definisce opportunamente i valori impostati:
setup_adc(ADC_CLOCK_DIV_8);
Tra una acquisizione e un`altra deve passare il tempo necessario per la
carica del condensatore: ~50 usec.
NA – L13
http://www.mrscuole.net/anxapic/
18
http://www.mrscuole.net/anxapic/
http://www.mrscuole.net/anxapic/
Programmare i microcontrollori in linguaggio C
Pic16F877 – Uso dell’ADC integrato
La conversione avviene in due
passaggi:
1.
2.
si carica un condensatore
(acquisition time) SAMPLE
il condensatore viene chiuso su
alta impedenza ed il valore ai
suoi capi viene misurato
(conversion time) HOLD
Per non aumentare il tempo di conversione (A/D sample time), Microchip consiglia di non
collegare, sul canale di ingresso del nostro convertitore, sistemi con impedenza (resistenza)
di uscita superiore a 10 KΩ, valori superiori possono incrementare il tempo di carica del
condensatore (acquisition time) e quindi aumentare il tempo totale di conversione. Valori
inferiori a 10 KΩ diminuiscono il tempo di acquisizione; in genere valori di impedenza
(resistenza) intorno ai 5 KΩ rappresentano una buona condizione di interfacciamento.
In alcuni casi si preferisce applicare in ingresso un amplificatore a guadagno unitario
(Emitter follower) che ottimizza le condizioni di accoppiamento tra sorgente e convertitore.
NA – L13
http://www.mrscuole.net/anxapic/
19
http://www.mrscuole.net/anxapic/
http://www.mrscuole.net/anxapic/
Programmare i microcontrollori in linguaggio C
Pic16F877 – Uso dell’ADC integrato
•
L’ADC e` a 10 bit (può essere anche ad 8 bit) ed e` collegato ad un multiplexer analogico a 8
ingressi; prima di leggere l’ADC e` quindi necessario scegliere il canale che si vuole
acquisire.
Una opportuna built-In function del compilatore ci permette di scegliere il canale opportuno: set_adc_channel(x), dove x è
un opportuno valore compreso tra 0 e 7; il canale AN0 è associato al valore 0, AN1 è associato al valore 1, …, AN7 è
associato al valore 7.
I Pin del 16F877 corrispondenti ai vari canali sono: can 0 Pin RA0, can 1 Pin RA1, can 2 Pin RA2, can 3 Pin RA3, can
4 Pin RA5, can 5 Pin RE0, can 6 Pin RE1, can 7 Pin RE2 [cfr Data Sheets Pic16F877] .
Canali ADC
Pic Pin
AN0
RA0
AN1
RA1
AN2
RA2
AN3
RA3
AN4
RA5
AN5
RE0
AN6
RE1
AN7
RE2
Per impostare una tensione
di riferimento di fondo scala
diversa da Vcc
NA – L13
http://www.mrscuole.net/anxapic/
20
http://www.mrscuole.net/anxapic/
http://www.mrscuole.net/anxapic/
Programmare i microcontrollori in linguaggio C
Pic16F877 – Uso dell’ADC integrato
•
Il PIC Wizard Tool ci permette, in fase di definizione del progetto, di scegliere opportunamente gli
ingressi analogici che vogliamo utilizzare.
N.B. => Bisogna sempre definire all’inizio gli ingressi analogici che vogliamo utilizzare in quanto
gli stessi Pin possono essere utilizzati come I/O digitali
[cfr Data Sheets Pic16F877],
quindi in fase di
impostazione del progetto bisogna sempre scegliere i canali analogici che si vogliono impiegare
per la conversione analogico-digitale
Se si vogliono leggere e convertire valori analogici da più canali, bisogna leggere e convertire
un canale per volta, dopo aver scelto il canale, prima di iniziare la conversione bisogna
attendere almeno 20 microsecondi per ottenere un valore attendibile
[cfr Data Sheets Pic16F877] .
Ricorda! => Il microcontrollore è un sistema TTL compatibile e non è possibile collegare in ingresso
sui singoli pin tensioni con valori inferiori a GND (0 V) o maggiori di Vcc (5 V) quindi, l’ampiezza
del segnale in ingresso al nostro ADC deve essere minore o uguale a Vcc (o tensione di
riferimento inpostata sui pin RA2-RA3 [cfr. Data Sheets Pic16F877])
NA – L13
http://www.mrscuole.net/anxapic/
21
http://www.mrscuole.net/anxapic/
http://www.mrscuole.net/anxapic/
Programmare i microcontrollori in linguaggio C
Pic16F877 – Uso dell’ADC integrato – Un esempio
Due trimmer, sono collegati tra 5 V e GND sui pin estremi mentre il terzo pin (centrale) è
collegato con RA0 per uno e RA1 per l’altro; le tensioni in ingresso dei Pin RA0 e RA1
possono variare tra 0 e 5 V quando il perno centrale del trimmer viene ruotato tra 0° e
270°.
Leggere, convertire e visualizzare su display LCD il valore delle tensioni ai capi dei
trimmer [Input pin RA0 e RA1]; se il valore letto in ingresso a RA0 supera i 4 volt
emettere un beep di avviso; se, invece, il valore in ingresso di RA1 supera i 4 Volt
emettere due beep di avviso.
Ricordiamo i punti fondamentali di sviluppo per:
Analisi, progettazione e stesura del progetto
1.
2.
3.
4.
5.
NA – L13
Analisi e stesura per punti cronologici del problema con definizione dell’HW
Flow – Charts
Scrittura del codice
Simulazione opportuna
Programmazione Controllore e verifica su demoBoard
http://www.mrscuole.net/anxapic/
22
http://www.mrscuole.net/anxapic/
http://www.mrscuole.net/anxapic/
Programmare i microcontrollori in linguaggio C
Pic16F877 – Uso dell’ADC integrato
Qualche semplice considerazione prima di proporre una semplice soluzione secondo i nostri modelli di sviluppo.
Il microcontrollore, in modalità hardware cioè indipendentemente dal software, una volta attivata la conversione
procede in modo autonomo e salva il risultato, alla fine della operazione di conversione, in due opportuni registri
(per conversioni a 10 bit) denominati ADRESH e ADRESL [cfr Data Sheets Pic16F877]. Naturalmente per
conversioni ad 8 bit il registro interessato è solo ADRESL.
Il CCS PCWH Pic-C compiler mette a disposizione una Buil-In function, read_adc(), che :
•
Inizia un processo di conversione
•
Legge i valori opportuni nei registri interessati
•
Restituisce i valori letti
Naturalmente prima di iniziare un processo di conversione bisogna definire, in fase preliminare,
i canali analogici che si vogliono utilizzare (Pic Wizard Tool), nel nostro caso AN0 (pin RA0) e
AN1 (pin RA1) e prima di utilizzare un canale bisogna selezionarlo, si ricordi Buil-In function
set_adc_channel(x); dopo la selezione del canale attendere almeno 20 microsecondi per
ottenere un valore di conversione attendibile.
N.B. => Se viene utilizzato un solo canale basta selezionarlo una sola volta prima
dell’utilizzo iniziale, il canale di utilizzo resta sempre lo stesso sino a quando non
viene selezionato un canale diverso.
NA – L13
http://www.mrscuole.net/anxapic/
23
http://www.mrscuole.net/anxapic/
http://www.mrscuole.net/anxapic/
Programmare i microcontrollori in linguaggio C
Pic16F877 – Uso dell’ADC integrato – Un esempio
Una semplice analisi del problema porta a definire il seguente schema elettrico
NA – L13
http://www.mrscuole.net/anxapic/
24
http://www.mrscuole.net/anxapic/
http://www.mrscuole.net/anxapic/
Programmare i microcontrollori in linguaggio C
Pic16F877 – Uso dell’ADC integrato – Un esempio
In questa fase è d’obbligo introdurre alcune considerazione per la conversione analogico
digitale.
La ampiezza del segnale analogico da convertire è uguale a 5 Volt, il convertitore è a 10
bit quindi l’intervallo 0 – 5 Volt verrà rappresentato con 1024 combinazioni binarie dei
10 bit del convertitore. Infatti 210 = 1024. La minima variazione della ampiezza del valore
analogico in ingresso, quando la rappresentazione binaria passa dal valore attuale a
quella immediatamente successiva (variazoione del bit meno significativo nella
rappresentazione), sarà pari a (5/1024) = 4,8828 mV. Questo valore prende il nome di
Risoluzione del nostro convertitore.
Si definisce risoluzione di un convertitore il rapporto tra il valore di fondo scala e il
numero di step (passi di avanzamento) necessari per raggiungere il valore di fondo
scala. Il numero di step di avanzamento per il nostro ADC dipende dal numero di bit del
convertitore. Per un convertitore ad 8 bit avremo 28 = 256 step di avanzamento per
raggiungere il valore di fondo scala; per un convertitore a 10 bit avremo 210 = 1024 step
di avanzamento, per un convertitore a 12 bit avremo 212 = 4096 step di avanzamento.
Per un valore di fondo scala di 5 Volt avremo rispettivamente:
5/256 = 19,5331 mv per ADC ad 8 bit
5/1023 = 4,8828 mV per Adc a 10 bit
5/4096 = 1,2207 mV per ADC a 12 bit
è chiaro che la migliore risoluzione si ha per
un convertitore a 12 bit.
NA – L13
http://www.mrscuole.net/anxapic/
25
http://www.mrscuole.net/anxapic/
http://www.mrscuole.net/anxapic/
Programmare i microcontrollori in linguaggio C
Pic16F877 – Uso dell’ADC integrato – Un esempio
Abbiamo visto che a parità del valore di fondo scala, aumentando il numero di bit del
convertitore aumenta la risoluzione dello stesso e quindi la bontà di conversione
(diminuisce il possibile errore tra due rappresentazioni binarie adiacenti).
Aumentando il numero di bit dell’ADC aumenta la risoluzione dello stesso però diventa
anche più complicato e “pesante” (e quindi più costoso) l’Hardware del nostro
componente; molte volte si guarda più al rapporto prezzo/prestazioni che a sistemi con
le migliori prestazioni in assoluto. Per l’uso comune (come nel nostro caso) un
convertitore ADC a 10 bit è più che sufficiente.
N.B. => Nella scelta di un convertitore ADC oltre a queste semplice considerazioni
bisogna considerare anche altre condizioni tecniche progettuali che attualmente
risultano superflue (e incomprensibili) per le nostre attuali conoscenze.
Per un convertitore a 10 bit, dopo una conversione, il valore decimale riportato è pari a
512; a quanto corrisponde l’ampiezza del segnale analogico di ingresso nell’istante
considerato? => Abbiamo visto che per un valore di fondo scala di 5 volt si ha una
risoluzione di 4, 8828 mV, quindi per un valore di conversione di 512 avremo un valore
in ingresso di 512 x 4,8828 10-3 = 2,5 V  242 come risultato della conversione avremo
242 x 4,8828 10-3 = 1,1876 V .... e così via.
NA – L13
http://www.mrscuole.net/anxapic/
26
http://www.mrscuole.net/anxapic/
http://www.mrscuole.net/anxapic/
Programmare i microcontrollori in linguaggio C
Pic16F877 – Uso dell’ADC integrato – Un esempio
2.
Il flow-chart
Una semplice proposta risolutiva
La proposta di flow chart è molto
semplice comunque efficace per i nostri
scopi.
Abbiamo una serie di operazioni
sequenziali e senza alcuna difficoltà
riusciremo a scrivere quella parte di
codice ad esso attinente.
Dovremo prestare un po’ di attenzione
nella fase di impostazione del progetto,
è la prima volta che usiamo un ADC e
quindi sicuramente dovremo fare le
cose in modo da capire subito come và
impostato il modo di procedere.
Come al solito il Pic Wizard Tool ci darà
una mano nella soluzione.
NA – L13
Si
No
Si
No
http://www.mrscuole.net/anxapic/
27
http://www.mrscuole.net/anxapic/
http://www.mrscuole.net/anxapic/
Programmare i microcontrollori in linguaggio C
Pic16F877 – Uso dell’ADC integrato – Un esempio
3.
Codice sorgente
Pic Wizard Tool impostazione del progetto
Pic Wizard Tool
Le impostazioni “general”
di progetto con codice
relativo
NA – L13
http://www.mrscuole.net/anxapic/
28
http://www.mrscuole.net/anxapic/
http://www.mrscuole.net/anxapic/
Programmare i microcontrollori in linguaggio C
Pic16F877 – Uso dell’ADC integrato – Un esempio
3.
Codice sorgente
Pic Wizard Tool impostazione del progetto
Pic Wizard Tool : Setup canali analogici
Pic Wizard Tool
Setup canali analogici e codice
generato
Pic Wizard Tool : setup canali analogici – Come ingressi analogici vengono scelti i canali A0 (RA0), A1 (RA1), A2
(RA2); l’Adc viene impostato su 10 bit (Units 0-1023 => 1024 steps di avanzamento); la frequenza di conversione
viene ottenuto dividendo opportuno il clock di sistema del micro (internal 2-6 us).
NA – L13
http://www.mrscuole.net/anxapic/
29
http://www.mrscuole.net/anxapic/
http://www.mrscuole.net/anxapic/
Programmare i microcontrollori in linguaggio C
Pic16F877 – Uso dell’ADC integrato – Un esempio
3.
Codice sorgente
Pic Wizard Tool impostazione del progetto
Pic Wizard Tool : i due file di codice generati – Si noti la impostazione dell’Adc su 10 bit, la scelta dei canali AN0
(RA0), AN1 (RA1), AN2(RA2) come ingressi analogici e la impostazione del clock dell’ADC
Dopo la fase di setup analizziamo il codice sorgente con il relativo flow-chart
NA – L13
http://www.mrscuole.net/anxapic/
30
http://www.mrscuole.net/anxapic/
http://www.mrscuole.net/anxapic/
Programmare i microcontrollori in linguaggio C
Pic16F877 – Uso dell’ADC integrato – Un esempio
3.
Codice sorgente
NA – L13
http://www.mrscuole.net/anxapic/
31
http://www.mrscuole.net/anxapic/
http://www.mrscuole.net/anxapic/
Programmare i microcontrollori in linguaggio C
Pic16F877 – Uso dell’ADC integrato – Un esempio
3.
Codice sorgente
NA – L13
http://www.mrscuole.net/anxapic/
32
http://www.mrscuole.net/anxapic/
http://www.mrscuole.net/anxapic/
Programmare i microcontrollori in linguaggio C
Pic16F877 – Uso dell’ADC integrato – Un esempio
3.
Codice sorgente
NA – L13
http://www.mrscuole.net/anxapic/
33
http://www.mrscuole.net/anxapic/
http://www.mrscuole.net/anxapic/
Programmare i microcontrollori in linguaggio C
Pic16F877 – Uso dell’ADC integrato – Un esempio
3.
Codice sorgente
Leggo il valore sul canale 0 (AN0-RA0): si noti la scelta del canale relativo e il
delay di 20 microsecondi per il set dei livelli di tensione opportuni
La funzione read_adc() legge gli opportuni registri che contengono il risultato della
conversione e assegna il relativo valore alla variabile int16 val1 (il valore che
ritorna la funzione viene assegnata alla variabile relativa). Successivamente viene
calcolata l’ampiezza del segnale convertito con una operazione di casting
NA – L13
http://www.mrscuole.net/anxapic/
34
http://www.mrscuole.net/anxapic/
http://www.mrscuole.net/anxapic/
Programmare i microcontrollori in linguaggio C
Pic16F877 – Uso dell’ADC integrato – Un esempio
3.
Codice sorgente
-
Il costrutto di CAST
Il costrutto di CAST permette di forzare una espressione a essere di tipo specifico; il costrutto si usa nella seguente
forma: (tipo) espressione
in cui tipo è uno dei tipi di dati del C.
Ad esempio se x è una variabile di tipo int16 e si desidera che il rapporto x/2 deve avere come risultato un
valore float (cioè mantenere la sua componente frazionaria), si può scrivere:
val = (float) x/2
Dove val è una variabile di tipo float dichiarato in precedenza.
Questa operazione associa l’operatore di cast a x (che diventa di tipo float),
nella fase di compilazione anche 2 viene convertito in float e quindi anche il
risultato della operazione sarà di tipo float.
Se non attivavamo una operazione di casting non avremmo ottenuto il risultato
desiderato in quanto si sarebbe realizzata una divisione intera (X è di tipo int16 e anche 2
è una costante intera), il cui risultato sarebbe stato assegnato a una variabile float, con
perdita della parte frazionaria.
Il cast viene considerato come operatore unario e ha lo stesso livello di priorità degli operatori unari.
Nel codice precedente si hanno le variabili: int16 val1; float volt1; l’operazione:
Volt1 = (float) val1 * 0,0048828 è di tipo casting in quanto converte il valore int16 in un dato
di tipo float e poi esegue il prodotto con il valore corrispondente alla risoluzione del nostro ADC; il
risultato sarà sicuramente di tipo float e assegnata alla variabile float volt1.
NA – L13
http://www.mrscuole.net/anxapic/
35
http://www.mrscuole.net/anxapic/
http://www.mrscuole.net/anxapic/
Programmare i microcontrollori in linguaggio C
Pic16F877 – Uso dell’ADC integrato – Un esempio
3.
Codice sorgente
Leggo il valore sul canale 1 (AN1-RA1): si noti la scelta del canale relativo e il
delay di 20 microsecondi per il set dei livelli di tensione opportuni
La funzione read_adc() legge gli opportuni registri che contengono il risultato della
conversione e assegna il relativo valore alla variabile int16 val2 (il valore che
ritorna la funzione viene assegnata alla variabile relativa). Successivamente viene
calcolata l’ampiezza del segnale convertito con una operazione di casting
NA – L13
http://www.mrscuole.net/anxapic/
36
http://www.mrscuole.net/anxapic/
http://www.mrscuole.net/anxapic/
Programmare i microcontrollori in linguaggio C
Pic16F877 – Uso dell’ADC integrato – Un esempio
Compiliamo il nostro sorgente e verifichiamo in ambiente ISIS => Proteus VSM
Tutto OK!
NA – L13
Programmiamo il pic sulla demo-Board e verifichiamo
http://www.mrscuole.net/anxapic/
37
http://www.mrscuole.net/anxapic/
http://www.mrscuole.net/anxapic/