PIC 16F877A converter 3 sinais A/D

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

PIC 16F877A converter 3 sinais A/D

Mensagempor angelo_eai » 26 Jun 2014 09:57

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
angelo_eai
 
Mensagens: 3
Registrado em: 22 Mai 2014 11:28

Re: PIC 16F877A converter 3 sinais A/D

Mensagempor ze2 » 26 Jun 2014 10:27

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ç
ze2
Byte
 
Mensagens: 193
Registrado em: 09 Fev 2009 13:37

Re: PIC 16F877A converter 3 sinais A/D

Mensagempor Eduardo Augusto » 26 Jun 2014 11:00

Ola!

Fui no datasheet do seu microcontrolador e o procedimento que ele indica é esse aqui.
Pagina 127 seção 11.0
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.


Recomendo que você crie algumas funções tais como:

Código: Selecionar todos
inicializa_modulo_ad();
unsigned int le_ad(unsigned char canal); /*essa função retorna o valor do respectivo canal*/


vão simplificar sua vida rs...

Não gosto de trabalhar com interrupção de canal analógico, lembro que alguns amigos diziam que atrasava muito o microcontrolador, podendo ele até travar, não sei se é verdade, portanto prefiro sempre criar uma rotina que eu faço a atualização por demanda e não por interrupção de conversão.... Não sei qual o seu Objetivo.

Com as conversões dos sinais analógicos funcionando como você estipula, faça um rotina que apresente o valor adc cru, é a hora de dar inicio a configuração da porta serial.

Na pagina 110 do seu datasheet para você ver as configurações da sua porta serial, configure ela do jeito que você quer, transmitir/receber/baud rate/ data bits e pariedade essas coisas.
O importante lembrar que a porta serial só suporta um byte por transmissão, então para enviar os valores você terá de quebrar o valor da conversão. e transmiti-lo

No caso:
Código: Selecionar todos
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


Quaisquer duvidas, tamos aew!
Não é possível dormir com todas mulheres do mundo, mas deve-se fazer o esforço.
Avatar do usuário
Eduardo Augusto
Byte
 
Mensagens: 105
Registrado em: 03 Mar 2014 08:57
Localização: São Paulo, SP

Re: PIC 16F877A converter 3 sinais A/D

Mensagempor angelo_eai » 30 Jun 2014 19:54

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ç


Boa noite pessoal, to programando em C confesso que n é muito a minha praia programaçao, porem me esforço e sei que é necessario o aprendizado, pois bem to num projeto de uma placa de aquisiçao. Recebe tres valores de tensao e envia para um PC.

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...

Se tiverem um material com exemplos de conversao me ajudava tb.

Vlw pessoal pela atençao
abrç
angelo_eai
 
Mensagens: 3
Registrado em: 22 Mai 2014 11:28

Re: PIC 16F877A converter 3 sinais A/D

Mensagempor andre_luis » 30 Jun 2014 20:52

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
}
}



+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Re: PIC 16F877A converter 3 sinais A/D

Mensagempor ze2 » 01 Jul 2014 07:57

como ja conseguiu configurar as portas, vamos tentar abri-las...
não precisa de timer. o ad já tem o seu próprio. veja um exemplo em c puro (hitech-c)
Código: Selecionar todos
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
}

o bacana é que vc pode [tentar] entender o mc bit a bit em detrimento aos mastigados do ccs.
bom pelo menos a parte do ad. divagar e devagar se vai ao longe
abç
ze2
Byte
 
Mensagens: 193
Registrado em: 09 Fev 2009 13:37

Re: PIC 16F877A converter 3 sinais A/D

Mensagempor angelo_eai » 02 Jul 2014 09:54

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
}
}



+++


Bom dia, queria saber como definir o canal a ser lido programando em C
(essas "portas" vou te contar viu)
Obrigado
abrç
angelo_eai
 
Mensagens: 3
Registrado em: 22 Mai 2014 11:28

Re: PIC 16F877A converter 3 sinais A/D

Mensagempor ze » 07 Jul 2014 11:16

ao citar apenas o post do amigo andré, ficou claro que vc usa ccs. neste caso me inclua fora. Mesmo assim vamos tentar somar algo
As vezes dou o peixe, as vezes ensino a pescar. Vejamos...
Talvez não agora ou não você, mas a figura anexa pode ajudar...
Imagem
some-se ao trecho
Código: Selecionar todos
ADCON0 = (channel << 3) + 0xC1;   // enable ADC, RC osc. veja no datasheet a função de cada bit. entre eles, os de escolha de canal

de posse disso e de algum conhecimento mínimo de hex-binário duvido que não tenha se acendido pelo menos uma lamparina! fala sério. não? não mesmo? ahhh. mas a luz é iminente!

E que tal se aprimorássemos a rotina adc?
Código: Selecionar todos
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;
}

assim ela retorna o valor do ad em 10bits pra nós.
boa sorte
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32


Voltar para PIC

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x