home | area personale         schemi | tutorial | robotica | pic micro | recensioni         forum | chat irc         faq | contatti         store | Ordina PCB
username
password
cerca
 
L'ADC DEL MICROCONTROLLORE 16F876 / 877 tipo: livello:
registri e bit di configurazioe, scelta della porta, velocità di convesione, accenno sull'interrupt cio che serve per usarlo
 
 



L'adc

 

Conversione analogico digitale  mi suona piu famigliare del termine digitalizzazione  

sembra un sciogli lingua :-) anche se il significato e' lo stesso .

L' adc di questi  microcontrollori, i due fratelli 16F876 / 877 ci permette

 in maniera semplice di collegare  trasduttori  di vario genere , come sensori di temperatura,

di pressione , di posizione, ecc...  cosi da permetterci di  interagire con il mondo esterno

vediamolo piu da vicino.  

Tensione di lavoro da 0 – 5 volt  +/- 10%

16F876   5 porte  PORT_A pin 2,3,4,5,7 

16F877   8 porte  PORT_A pin 2,3,4,5,7   PORT_E pin 8,9,10

sono siglati con AN0-AN7  

 il pin 6 della PORT_A non viene usato per l’adc

la /figura1.gif   mostra come sono collegate le porte  all'adc 

qui   adc_registri_associati.jpg    sono evidenziati   in chiaro gli indirizzi,  i registri  e relativi bit 

Risoluzione  a 10 bit    la cui risoluzione puo essere utilizzata anche   a 8  bit attraverso

ADCON1 REGISTER  bit 7: ADFM: A/D Result format select

   

 VREF+   VREF-   impostano tensioni di riferimento nel renge di lavoro dell’adc

Esempio: Vref+ = 3 volt  , Vref- =1 volt      = 2Volt

                   Vref+ = 3 volt  , Gnd /Vss           = 3 volt

 L’acquisizione/conversione  avviene  all'interno delle  tensioni di riferimento  

 in base alla configurazione   tavola 2.jpg  del seguente registro         

ADCON1 REGISTER  bit 3-0: PCFG3:PCFG0: A/D Port Configuration Control bits

 La lettura conversione avviene per singola porta impostando 

ADCON0 REGISTER  bit 5-3: CHS2:CHS0: Analog Channel Select bits

clock di conversione definita  attraverso

ADCON0 REGISTER  bit 7-6: ADCS1:ADCS0: A/D Conversion Clock Select bits

Attivare/accende  per rendere la periferica disponibile come adc attraverso 

 ADCON0 REGISTER  bit 0: ADON: A/D On bit
         
 Start alla conversione  abilitare il flag

ADCON0 REGISTER   bit 2: GO/DONE: A/D Conversion Status bit

la figura qui sotto riporta le configurazioni che si possono adottare  per quanto sopra citato


 conclusa  la conversione  il bit GO/DONE viene posto a 0 dall’hardware
due  sono le strade  da seguire per  determinare  l’evento 
         1°  testare il flag  GO/DONE  se = 0          
         2°  attivare l’interrupt  e scrivere le routine di gestione (piu complicato )

il risutato della convesione si trova nei registri

1Eh  ADRESH A/D Result Register High Byte
9Eh   ADRESL A/D Result Register Low Byte

Per una scala/risoluzione  a 8 bit sarà sufficente leggere ADRESH  avento configurato  ADFM=0
per una rappresentazione  a 10 bit  (con  piu risoluzione)   configurare ADFM=1 

in piu bisogna eseguire uno shift a sinistra di 8 posizioni 

esempio: var_temp =(ADRESL+(ADRESH<<8)); 

Il pic lo fa  per noi  non so spiegare …:-) se qualcuno vuol dire la sua  fa cosa gradita

Conclusa questa panoramica generale riassumendo in pratica cosa fare

1. configurare il modulo Adc :    ADCON1
  - porte A/D  da usare                                  PCFG3:PCFG0
    - riferimenti di tensione       
  - formatazione del risultato                        ADFM    
2. selezionare la porta                ADCON0  
 - per la conversione ANx                            CHS2:CHS0
 - scegliere il clock (velocità)                       ADCS1:ADCS0
3. configurare l’interrupt  (facoltativo se non serve disabilitarlo )
       - create le routine per gestire l’evento:
       - Clear ADIF bit                   PIR1
       - Set ADIE bit                      PIE
       - Set GIE bit                         INTCON
4. Attendere un’adeguato tempo in us  per l’acquisizione della tensione  da parte della porta
5. Iniziare la conversione ponendo GO/DONE=1          
6. testare il bit GO/DONE =0   per determinare la  fine della conversione 
 - se l’interrupt è abilitato  non serve testare GO/DONE
    ci sarà la routine dell’interrupt che gestisce l’evento
7. leggere i registri  ADRESL  ADRESH   secondo formatazzione  ADFM
8. ripartire  dal punto 
             1 per nuove configurazioni
             2 per  cambiare porta ANx  e clock
             3 per la stessa porta e stessa configurazione

Tutto questo è necessario per capire come usare l’adc, tanto per citarlo l'adc 

viene richiamato dal modulo CCP in determinate configurazioni.

Personalmente  non l'ho mai approfondita,  non ne ho avuto motivo.

Il programma che segue l'ho scritto con HI-TECH  Microchip PIC v8.02  PL1  in linguaggio  C 

ha lo scopo di  passare dalla teoria alla pratica, :-)  intendiamoci  non è una lezione di C   :-)

(tutto ciò che si trova a destra di // sono commenti)

//******************************
 //    L' ADC nei pic 16f876 - 877
//    AN0 e AN1  convertono  la stessa tensione   ma la rappresentano
//    AN0 in 10 bit  AN1 in 8 bit , variando il flag ADFM , il tutto visualizzato in scala decimale su display lcd  2x16
//  ****************************
 

#include "c:ht-picincludepic.h"
#include "C:ht-picincludedelay.c"
#include "C:ht-picincludelcd.c"

// #define  ADC_* raggruppa le impostazioni per l'uso della porta
// da usare, ANx porta, clock,il formato del risultato, in questo modo
// è piu facile scrivere  e leggere il prg   
 

#define ADC_0 ADCON1=0b10000000,ADCON0= 0b00000001; 
#define ADC_1 ADCON1=0b00000000,ADCON0= 0b00001001;       

unsigned var_temp=0;        // variabile intera senza segno (16 bit 2 byte)
unsigned char i=0;              // variabile intera 8 bit 1 byte

//*****************************
// inizializzo le routine
int init_portLcd();                    // + presentazione
int ReadAdc(); 
int stampa();
//******************************
main()                                          // all’interno del  MAIN  la gestione del prg
{
init_portLcd();
 GIE=0;   // disabilita interrupt generale 
 PEIE=0;  // tutto disable
 PIE1=0;  
 PIR1=0; 
//********************************************************* 
while(1)
{
// ADCON1= 0b10000000;           // formatazione risultato 10 bit  bit7=1
// ADCON0= 0b00000001;           // scelta porta e clock conversione
//  questa due righe in alto  sono state sostituite  da ADC_0;   
ADC_0;                                           // AN0
 ReadAdc();                                   // routine di lettura 
 var_temp =(ADRESL+(ADRESH<<8));   // sposto il contenuto delle due variabili
                                                                          //  ADRESL e ADRESH  in una a 16 bit intera
// ADCON1= 0b00000000;                           // formatazione risultato 8 bit  bit7=0
// ADCON0= 0b00001001;       
ADC_1;                                                            // AN1
 ReadAdc();  
 stampa();                                                       // ruotine per lcd
} // end while
} // fine main
//************
ReadAdc()
{     
 DelayUs(250);                             // ritardo per acquisire la tensione
 ADGO=1;                                      // start  della conversione A/D
  while(ADGO);                             // ADGO=0 fine conversione
}
//***********
stampa()
{
 LCD_GOTO(1,1);
  LCD_PUTS("    ");
 LCD_GOTO(1,1);
  LCD_PUTUN(var_temp);         
 LCD_GOTO(2,1);
  LCD_PUTS("    ");
 LCD_GOTO(2,1);
  LCD_PUTUN(ADRESH);         
DelayMs(200);
}
//******************
init_portLcd()
{
 PORTB=0;      
 TRISB0=1;
        TRISB1=0;             //DATA 4 dell'LCD
        TRISB2=0;             //DATA 5
        TRISB3=0;             //DATA 6
        TRISB4=0;             //DATA 7
        TRISB5=0;             //RS
        TRISB6=0;             //E
 TRISB7=1;
// inizializza LCD
       LCD_INIT();                // INDISPENSABILE serve ad inizializzare l'LCD
       DelayMs(50);             // ritardo per completare l'inizializzazione (facoltativo)
       LCD_CLEAR();         // cancella il display 
       DelayUs(750);           // pausa (facoltativo)
// presentazione 
       LCD_CMD(LCD_line1);           // numero riga
       LCD_PUTS("   by Agric     ");      
       LCD_CMD(LCD_line2);         
       LCD_PUTS(" ADC 16F876-877 ");       // scrivo una stringa di caratteri
DelayMs(255);                                                  // pausa 255 millisecondi 
        DelayMs(255);                                          // si puo usare un ciclo FOR   
       DelayMs(255);   
         DelayMs(255);                                         // Se la quantità di memoria dati e
       DelayMs(255);                                           // programma non e' un problema  
         DelayMs(255);                                         // va bene anche cosi   
      DelayMs(255);
        DelayMs(255);
LCD_CMD(LCD_line1);          
       LCD_PUTS(" ADC 16F876-877 ");   
       LCD_CMD(LCD_line2);         
       LCD_PUTS(" su WWW.GRIX.IT ");    
DelayMs(255);     
        DelayMs(255);       
       DelayMs(255);
        DelayMs(255);
          DelayMs(255);     
         DelayMs(255);       
      DelayMs(255);
       DelayMs(255);
LCD_CLEAR();           // Cancella il display 
       DelayMs(50);        // pausa (facoltativo)
 LCD_GOTO(1,8);
       LCD_PUTS("10 BIT");    // scrivo una stringa di caratteri
 LCD_GOTO(2,9);
       LCD_PUTS("8 BIT");      // scrivo una stringa di caratteri
}

 qui in allegato un video che mostra il funzionamento del programma       adc_8_10_bit.wmv 

   grazie di tutto  Agric

 



  il parere della community
esprimi il tuo voto approvi questa pagina? promo


  non sei autenticato, per questo non puoi visualizzare i commenti sulla pagina. Se sei registrato accedi oppure registrati.


difficoltà
costo
informazioni
Questa pagina è stata creata da agric
il 22/09/2008 ore 16:30
ultima modifica del 26/09/2008 ore 09:22
la pagina è stata visitata 9934 volte




Lo staff di www.grix.it non si assume responsabilità sul contenuto di questa pagina.
Se tu sei l'autore originale degli schemi o progetti proposti in questo articolo, e ritieni che siano stati violati i tuoi diritti, contatta lo staff di www.grix.it per segnalarlo.

   
 







 
 
indietro | homepage | torna su copyright © 2004/2024 GRIX.IT - La community dell'elettronica Amatoriale