Progetto 3: Termometro con convertitore A/D Questo progetto dimostra come acquisire un segnale da una sensore di temperatura analogico e visualizzare la temperatura attraverso il collegamento seriale con un PC ed attraverso una sequenza di led. I valori rilevati dal sensore vengono convertiti in gradi Celsius attraverso una opportuna formula di messa in scala. Configurazione dei jumpers per PIC 16F877A (zoccolo 40 pin): RA0 con TEMP RD0 con SW2 RB0 RB7 con LED1 LED8
Programmazione del PIC 16F877A: Per l applicazione in oggetto è necessario configurare il modulo di conversione A/D tramite i registri SFR ADCON1 e ADCON0. Il contenuto di questi registri permette di impostare la frequenza del clock di funzionamento del convertitore (si tratta di un convertitore a 10 bit ad approssimazioni successive), se i vari pin connessi al convertitore siano usati come canali analogici o digitali, se il risultato vada memorizzato nei due registri ADRESH e ADRESL in modo allineato a destra o a sinistra, e così via.inoltre, il registro ADCON0 contiene anche i bit per forzare la partenza di una conversione e per rilevare il suo completamento (GO/DONE), che nelle librerie del compilatore Hi-Tech PICCLite è denominato ADGO. Registro ADCON1 per PIC 16F877A: Bit 7: ADFM, giustificazione del risultato 1= giustificazione a destra 0= giustificazione a sinistra Bit 6: ADCS2. fattore moltiplicativo della frequenza della conversione (impostata nei bit 6 e 7 di ADCON0): 1= moltiplicato per 2 0= moltiplicato per 1 Bit 5-4: non usati Bit 3-0: PCFG3:0, configurazione della porte come analogiche o digitali e dei relativi riferimenti di tensione per la conversione, come mostrato dalla tabella:
Registro ADCON0 per PIC 16F877A: Bit 7-6: ADCS1:0, scelta della frequenza di clock per la conversione 00 = ogni 2 colpi di clock dell oscillatore del microcontrollore 01 = ogni 8 colpi di clock dell oscillatore del microcontrollore 10 = ogni 32 colpi di clock dell oscillatore del microcontrollore 11 = utilizzo di un oscillatore RC integrato al convertitore A/D stesso Bit 5-3: CHS2:0, selezione del canale analogico (indirizzamento del multiplexer): 000 = AN0 001 = AN1 111 = AN7 Bit 2: GO/DONE bit di stato della conversione: 1= ciclo in esecuzione (viene settato via software per iniziare la conversione) 0= conversione terminata (viene resettato in automatico dal convertitore A/D al termine dell operazione) Bit 1: non usato Bit 0: ADON, bit di abilitazione del convertitore 1= convertitore abilitata 0= convertitore disabilitata
Ad esempio, l operazione di avvio e valutazione del termine della conversione può essere tradotta in linguaggio C come segue: ADGO = 1; while(adgo) // Attesa della fine della conversione continue; Il risultato di conversione, a 10 bit ma memorizzato nei 16 bit di ADRESH e ADRESL, può essere riportato in una unica variabile di tipo int in linguaggio C come segue: temp=adresl+(adresh<<8); Per la configurazione della porta seriale, è necessario impostare il registro TXSTA (per la configurazione della trasmissione), RCSTA (per l eventuale configurazione della ricezione) e SPBRG, per impostare il funzionamento di un apposito temporizzatore utilizzato per la serializzazione dei bit (Baud Rate Generator). Una volta configurata correttamente la seriale (allo scopo possono essere utilizzate apposite librerie di funzioni), i dati trasmessi dal microcontrollore al PC possono essere visualizzati tramite il semplice emulatore di terminale (pre-installato fra gli accessori del sistema operativo Microsoft Windows) HyperTerminal, come mostrato dalla seguente schermata:
Si noti che il dato numerico deve essere trasmesso sotto forma di caratteri, pertanto saranno necessarie opportune funzioni di conversione fra i tipi di dato, solitamente disponibili come librerie per i compilatori in linguaggio C. Configurazione dei jumpers per PIC 16F690: RA0 con TEMP RA1 con SW2 Per questo microcontrollore, date le limitate risorse di I/O, si può omettere la visualizzazione sui led. Programmazione del PIC 16F690: Per questo microcontrollore, la configurazione dei canali analogici deve essere effettuata attraverso i registri ANSEL, ANSELH, ADCON1 e ADCON0:
Registro ANSEL per PIC 16F690: Bit 7-0: Scelta dei canali analogici da AN7 ad AN0, per ciascun bit: 1 = canale analogico 0 = canale digitale Registro ANSELH per PIC 16F690: Bit 3-0: Scelta dei canali analogici da AN11 ad AN8, per ciascun bit: 1 = canale analogico 0 = canale digitale Registro ADCON1 per PIC 16F690: Bit 7: non usato Bit 6-4: ADCS2:0, setta la frequenza di conversione 000 = ogni 2 colpi di clock dell oscillatore del microcontrollore 001 = ogni 8 colpi di clock dell oscillatore del microcontrollore x11 = utilizzo di un oscillatore RC integrato al convertitore A/D stesso 101 = ogni 16 colpi di clock dell oscillatore del microcontrollore 111 = ogni 64 colpi di clock dell oscillatore del microcontrollore Bit 3-0: non usati Registro ADCON0 per PIC 16F690: Bit 7: ADFM, giustificazione della conversione a 10 bit 1= giustificazione a destra 0= giustificazione a sinistra Bit 6: VCFG, tensione di riferimento 1= Vref+ pin 0= Vdd Bit 5-2: CHS3:0, scelta del canale analogico (indirizzamento del multiplexer) 0000= AN0 0001= AN1 1011= AN11 Bit 1: GO/DONE bit di stato della conversione 1= ciclo in esecuzione 0= conversione terminata Bit 0: ADON, bit di inizializzazione della conversione 1= conversione abilitata 0= conversione disabilitata