Olá, sou iniciante em micro e preciso converter 3 sinais analogicos e enviar por um serial,
porem nao estou sabendo lidar com as interrpçoes ( nem sei se sao necessarias) na conversao.
Preciso de uma ajuda.
vlw
Moderadores: andre_luis, 51, guest2003, Renie
1. Configure the A/D module:
• Configure analog pins/voltage reference and
digital I/O (ADCON1)
• Select A/D input channel (ADCON0)
• Select A/D conversion clock (ADCON0)
• Turn on A/D module (ADCON0)
3. Wait the required acquisition time.
4. Start conversion:
• Set GO/DONE bit (ADCON0)
5. Wait for A/D conversion to complete by either:
• Polling for the GO/DONE bit to be cleared
(interrupts disabled); OR
• Waiting for the A/D interrupt
6. Read A/D Result register pair
(ADRESH:ADRESL), clear bit ADIF if required.
7. For the next conversion, go to step 1 or step 2
as required. The A/D conversion time per bit is
defined as TAD.
inicializa_modulo_ad();
unsigned int le_ad(unsigned char canal); /*essa função retorna o valor do respectivo canal*/
unsigned int valor_adc;
unsigned char temp
adc_valor = le_ad(1);
temp = valor_adc>> 8; // joga parte alta do valor do adc na variavel temp
transmite_uart(temp); // envia a parte alta de temp
temp = valor_adc; // joga parte baixa de valor_adc em temp
transmite_uart(temp); // envia a parte baixa
ze escreveu:fale + sobre vc. o que sabe. qual linguagem domina. o que já fez. se já passou pela etapa do pisca led. etc. interrupção pode ser útil ou desnecessária. fale + sobre o sistema. sugiro ir por partes: domine uma conversão ad. pegue o resultado. reserve. domine a transmissão serial. transmita o resultado
abç
angelo_eai escreveu:Fiz a configuraçao do conversor, com tres portas analogicas, AN3, AN2 e AN0. Agora que o bixo pega nao sei lidar com a conversao, se ligo um timer para esperar uma conversao e depois a outra...
#define CANAL_VAC_ENTRADA 0
#define CANAL_VDC_BATERIA 1
#define CANAL_IAC_SAIDA 3
void main ( void )
{
...
int BufferValor ;
setup_adc_ports( RA0_RA1_RA3_ANALOG ) ; // define as portas 0, 1 e 3 como analogicas
setup_adc( ADC_CLOCK_DIV_32 ) ; // define clock interno da conversão
while ( 1 )
{
...
set_adc_channel ( CANAL_VDC_BATERIA ) ; // define canal a ser lido, como o da porta RA1
read_adc ( ADC_START_ONLY ) ; // dispara a conversão
/* Rotinas consumindo tempo suficiente para a conversão se concretizar */
BufferValor = read_adc ( ADC_READ_ONLY ) ; // realiza a leitura do valor convertido
}
}
void
adc_read(unsigned char channel)
{
ADCON0 = (channel << 3) + 0xC1; // enable ADC, RC osc. veja no datasheet a função de cada bit. entre eles, os de escolha de canal
ADGO = 1; //dispara conversão
while(ADGO) // aqui está o 'timer' do ad
continue; // wait for conversion complete
}
andre_teprom escreveu:angelo_eai escreveu:Fiz a configuraçao do conversor, com tres portas analogicas, AN3, AN2 e AN0. Agora que o bixo pega nao sei lidar com a conversao, se ligo um timer para esperar uma conversao e depois a outra...
Já passei por essas mesmas perguntas quando trabalhei com o CCS e suas APIs de A/D.
Segue um trecho do programa que fiz, mas basicamente tem de iniciar a conversão, e depois de algum tempo, ler o resultado, pois se fosse imediatamente após o inicio da conversão, o resultado estaria incorreto, pois não teria dado tempo suficiente:
cpp code#define CANAL_VAC_ENTRADA 0
#define CANAL_VDC_BATERIA 1
#define CANAL_IAC_SAIDA 3
void main ( void )
{
...
int BufferValor ;
setup_adc_ports( RA0_RA1_RA3_ANALOG ) ; // define as portas 0, 1 e 3 como analogicas
setup_adc( ADC_CLOCK_DIV_32 ) ; // define clock interno da conversão
while ( 1 )
{
...
set_adc_channel ( CANAL_VDC_BATERIA ) ; // define canal a ser lido, como o da porta RA1
read_adc ( ADC_START_ONLY ) ; // dispara a conversão
/* Rotinas consumindo tempo suficiente para a conversão se concretizar */
BufferValor = read_adc ( ADC_READ_ONLY ) ; // realiza a leitura do valor convertido
}
}
+++
ADCON0 = (channel << 3) + 0xC1; // enable ADC, RC osc. veja no datasheet a função de cada bit. entre eles, os de escolha de canal
unsigned int adc_read(unsigned char channel)
{
ADCON0 = (channel << 3) + 0xC1; // enable ADC, RC osc. veja no datasheet a função de cada bit. entre eles, os de escolha de canal
ADGO = 1; //dispara conversão
while(ADGO) // aqui está o 'timer' do ad
continue; // wait for conversion complete
return ADRESH*256 + ADRESL;
}
Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante