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/