Página 1 de 1

duvida na conversao ad

MensagemEnviado: 09 Mar 2010 12:34
por diogo_18sp
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);
}

MensagemEnviado: 09 Mar 2010 15:32
por MOR_AL
Apenas um chute.
Você colocou os comparadores no modo 7?
MOR_AL

MensagemEnviado: 09 Mar 2010 16:26
por fabim
ai minha cabeça....

MensagemEnviado: 13 Mar 2010 01:09
por diogo_18sp
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.

MensagemEnviado: 13 Mar 2010 19:13
por ze
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

MensagemEnviado: 13 Mar 2010 19:29
por fabim
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;;;;;;;;

MensagemEnviado: 13 Mar 2010 20:58
por vtrx
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.

MensagemEnviado: 13 Mar 2010 22:07
por MOR_AL
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

MensagemEnviado: 15 Mar 2010 12:42
por diogo_18sp
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

MensagemEnviado: 15 Mar 2010 13:18
por Andre_Cruz
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é