duvida na conversao ad

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

duvida na conversao ad

Mensagempor diogo_18sp » 09 Mar 2010 12:34

ola amigos to migrando da linguagem assembly pra "C" estou usando o MikroC E ESTOU COM UM PROBLEMINHA FIZ O CODIGO DO MEU PROGRAMA E DEPOIS TESTE NO PROTEUS SO QUE ACONTECE QUANDO O VALOR DA CONVERSAO FICA ABAIXO DE 1 VOLTS O DISPLAY LCD MOSTRA;
EXEMPLO DE CONVERSAO 0.59 VCC NO DISPLAY APARECE 5.90 OQ HA DE ERRADO NO MEU CODIGO.


// LCD module connections
sbit LCD_RS at Rc0_bit;
sbit LCD_EN at Rc1_bit;
sbit LCD_D4 at Rc2_bit;
sbit LCD_D5 at Rc3_bit;
sbit LCD_D6 at Rc4_bit;
sbit LCD_D7 at Rc5_bit;

sbit LCD_RS_Direction at TRISc0_bit;
sbit LCD_EN_Direction at TRISc1_bit;
sbit LCD_D4_Direction at TRISc2_bit;
sbit LCD_D5_Direction at TRISc3_bit;
sbit LCD_D6_Direction at TRISc4_bit;
sbit LCD_D7_Direction at TRISc5_bit;
// End LCD module connections
char valor [16];
char text [] =" Canal Analogico";
char volts[] ="Volts";
int ve = 0;
float leitura = 0.0;

void main() {

portc = 0 ; //saidas sao 0
trisc = 0 ; //saida
trisa.f0 = 1; //ra0 entrada
adcon1 = 0b00001110 ; //ra0 como analogico

lcd_init(); //inicializa lcd
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_cursor_Off);
lcd_out(1,1,text);
delay_ms(100);
lcd_out(2,1,volts);

do{
ve = ADC_Read(0); // Get 10-bit results of AD conversion
delay_us(10);
leitura = ve*0.00498;
floatToStr(leitura,valor);
//wordtostr(valor,valor);
lcd_out(2,12,valor);

}while(1);
}
diogo_18sp
Byte
 
Mensagens: 117
Registrado em: 14 Jan 2008 18:12
Localização: Amparo ,SP

Mensagempor MOR_AL » 09 Mar 2010 15:32

Apenas um chute.
Você colocou os comparadores no modo 7?
MOR_AL
"Para o triunfo do mal só é preciso que os bons homens não façam nada." Edmund Burke.
"Nunca discutas com pessoas estúpidas. Elas irão te arrastar ao nível delas e vencê-lo por possuir mais experiência em ser ignorante". Mark Twain
Avatar do usuário
MOR_AL
Dword
 
Mensagens: 2934
Registrado em: 19 Out 2006 09:38
Localização: Mangaratiba - RJ

Mensagempor fabim » 09 Mar 2010 16:26

ai minha cabeça....
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor diogo_18sp » 13 Mar 2010 01:09

MOR_AL escreveu:Apenas um chute.
Você colocou os comparadores no modo 7?
MOR_AL



os comparadores naum estao em 7 pois naum vou usar como i/o digital.
diogo_18sp
Byte
 
Mensagens: 117
Registrado em: 14 Jan 2008 18:12
Localização: Amparo ,SP

Mensagempor ze » 13 Mar 2010 19:13

você "naum" devia migrar pra esta. Isto pode denegrir a "sintaxe" de tão bela "linguagem". Tu te importas de ter um ajudante [de mrd] a menos? nada pessoal. é só uma questão de princípios.
grato
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor fabim » 13 Mar 2010 19:29

diogo_18sp escreveu:
MOR_AL escreveu:Apenas um chute.
Você colocou os comparadores no modo 7?
MOR_AL



os comparadores naum estao em 7 pois naum vou usar como i/o digital.

ai minha cabeça;;;;;;;;
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor vtrx » 13 Mar 2010 20:58

Se prepara que voce não vai ter a mesma eficiencia que ja está acostumado em ASM.
Ja faz 4 dias que não tem uma resposta... :wink:
Aguarde mais um pouco que provavelmente terá um auxílio de alguem que programa em C.
Avatar do usuário
vtrx
Dword
 
Mensagens: 2239
Registrado em: 20 Abr 2008 21:01

Mensagempor MOR_AL » 13 Mar 2010 22:07

MOR_AL escreveu:Apenas um chute.
Você colocou os comparadores no modo 7?
MOR_AL


Ops! verifiquei que ao ligar o 16F877A, os comparadores já se encontram no modo 7 (comparadores desligados das entradas). No 16F628, os comparadores se encontram no modo 0 (os pinos RA0, RA1 RA2 e RA3 se encontram conectados às entradas deles). Sendo assim, como o seu PIC tem CAD, suponho que ao ligá-lo, os comparadores não interfeririam no programa. Portanto, desconsidere minha sugestão inicial.
Verifiquei que há dois métodos para você obter o resultado correto da conversão;
1 - Aguardando cerca de 20us. Você aguarda 10us.
2 - Monitorando o pino GO/DONE(barra) do registro ADCON0. Quando seu estado lógico for para '0', "não há conversão em processo" (a conversão terminou).
Experimente uma dessas opções.
Há uma conversão intrínseca no cálculo da variável "leitura". Dê uma olhada no manual do MikroC. Tente observar (primeiramente) apenas o valor da variável "ve". Veja se está correto. Não precisa declará-la para valores negativos e positivos. Só haverão positivos.
Ah! Coloque o While(1) no lugar do DO. Assim você pode variar a entrada do CAD e obter a leitura no LCD (sempre ... E não apenas uma vez)
MOR_AL
"Para o triunfo do mal só é preciso que os bons homens não façam nada." Edmund Burke.
"Nunca discutas com pessoas estúpidas. Elas irão te arrastar ao nível delas e vencê-lo por possuir mais experiência em ser ignorante". Mark Twain
Avatar do usuário
MOR_AL
Dword
 
Mensagens: 2934
Registrado em: 19 Out 2006 09:38
Localização: Mangaratiba - RJ

Mensagempor diogo_18sp » 15 Mar 2010 12:42

olha amigos vou explicar e assim, minha conversao acontece so que quando o pic faz a leitura da tensao por exemplo 4vcc aparece 4 vcc no meu lcd ,quando abaixo essa tensao para 520 mv no meu lcd aparece 5.00 e- por que naum aparece 0.5 vcc to usando uma variavel float pra conseguir este valor na multiplicaçao que fasso este e- indica que a leitura esta com um valor abaixo de zero e isso como faria pra conseguir deixar 0.5 vcc obrigado
diogo_18sp
Byte
 
Mensagens: 117
Registrado em: 14 Jan 2008 18:12
Localização: Amparo ,SP

Mensagempor Andre_Cruz » 15 Mar 2010 13:18

diosgo_18sp,

Para teste escreva no LCD o resultado da conversão, ou seja sua variavél "ve", e varie a tensão e observe o resultado da conversão.

Se o valor da conversão estiver errado, experimente colocar um delay maior do que 10uS, costumo usar um delay com o dobro do Tad(tempo de conversão do A/D) e mais um delay de 500uS.

Se o valor estiver correto, experimente:

Na linha:

"leitura = ve*0.00498; "

ve esta declarada como uma variavél do tipo inteira.
leitura esta declarada como uma variavél do tipo float.

A constante 0.00489 é float.

Experimente testar assim:

leitura = (float) ve * 0.00489;

Acredito que o erro esta em misturar variavéis inteira com float.
Utiliza o modificador de tipo (float) pra converter o resultado de ve * 0.00489 para float.

Abraço

André
Andre_Cruz
Word
 
Mensagens: 559
Registrado em: 03 Jan 2009 14:06


Voltar para PIC

Quem está online

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

cron

x