Página 1 de 1

Ad não mostra direito o valor no lcd

MensagemEnviado: 19 Jun 2008 06:50
por geraldomelo
Ola Pessoal , tenho um programa aqui em CCS , e quando eu coloco ele para funcionar , ele teria que mostrar no LCD , o valos “tensão “ até 1023(valor do AD mesmo ) . só que quando vou variando a tensão , quando ela chega em 512 , passa para 0 e começa de novo do zero e vai subindo ...
Não estou conseguindo ver onde tá o erro , até porque tava funcionando antes ... obs. Esse programa ainda não esta acabado , mas essa parte do LCD e do Ad não está funcionando , e eu não to conseguindo enxergar onde esta o erro no código ... aqui vai o código inteiro : só pode ser os printf lá embaixo , mas não estou enxergando mesmo ... pode ser o sono ...

#include <16F876.h>
#device adc=10
#use delay (clock=4000000)

#fuses HS,NOWDT,PUT,BROWNOUT,NOLVP
#use fast_io(a)
#use fast_io(B)
#use fast_io(C)
#include <regs_16F87x.h>
#include <mod_lcd_pic16f876a.c>
#bit rs_lcd=portc.1 // pino do pic onde esta ligado o pino RS do lcd para ser colocado em terra
#bit botao0=portb.0

int16 tensao,tensao_total;
int16 corrente,corrente_total;



void le_ad (void)

{
int t;
t=3;
while(t)
{
set_adc_channel(0);
delay_us(70);
tensao=read_adc();
set_adc_channel(1);
delay_us(70);
corrente=read_adc();
tensao_total=tensao_total+tensao;
corrente_total=corrente_total+corrente;
t--; }

tensao_total=tensao_total/3;
corrente_total=corrente_total/3;



}
}

void main(void)


{

cmcon=07; // comparadores desligados
rbpu=0; // pull ups do port b ativados
set_tris_a (255);
set_tris_b(255);
set_tris_c(0);
porta=0;
portb=0;
portc=0; // inicia o ports a,b,c em 0
rs_lcd=0; // coloca pino RS do display para terra
lcd_ini() ;
lcd_escreve('\f'); // apaga lcd
lcd_envia_byte(0,0x0c); // apaga cursor do lcd
setup_adc_ports(ra0_ra1_analog_ra3_ref); // faz pino ra0 entrada do ad ..
setup_adc (adc_clock_internal); // adc ligado ao clock interno


while (true)
{

le_ad();
lcd_pos_xy(1,1);
printf(lcd_escreve,"Tensao: %Lu V \r\n",tensao_total );

printf(lcd_escreve, "Amps: %Lu mA \r", corrente_total);



if (tensao>950)
{ lcd_escreve('\f');
while (tensao>950)
{ printf(lcd_escreve, " Warning !! \r\n ");
printf(lcd_escreve, " Voltar Knob !! ");
le_ad();
}

lcd_escreve('\f'); }


}}

Abs

Geraldo

Re: Ad não mostra direito o valor no lcd

MensagemEnviado: 19 Jun 2008 08:13
por Jorge_Francisco
tensao,tensao_total,corrente e corrente_total são signed e vc está imprimindo unsigned com "%Lu". Outra coisa o while do le_ad() é para fazer uma média? porque vc não zera tensao_total e corrente_total antes?

Re: Ad não mostra direito o valor no lcd

MensagemEnviado: 19 Jun 2008 08:17
por Jorge_Francisco
Ah e o fuse para 4Mhz é XT.

Vlw

MensagemEnviado: 19 Jun 2008 08:25
por fabim
mais uma dica, antes de fazer a conversão e amostragem, pra não ficar perdendo tempo.

Se nova amostra igual amostra anterior intão não faz nada

Se diferente

nova amostragem

Fabim

MensagemEnviado: 19 Jun 2008 12:21
por guest2003
outra coisa,

sempre que possivel utilize divisoes por multiplos de base 2... ao invez de fazer 3 medias e dividir por 3, faça 4 e divida por 4... o compilador faz esse tipo de divisão apenas fazendo shift nos bytes...

[]'s

MensagemEnviado: 24 Jun 2008 04:39
por geraldomelo
Ok Pessoal ... Desculpe a demora para responder , pois estava enrolado qui , inclusive com isso ... Bom , vamos por partes .. bem , vem mais pepino por ai , e do grosso ... heheh

Guest2003 , o problema estava exatamente onde vc falou ... ali esta em 3 , mas foi só para testar no Proteus , pra não ficar lento , na realidade , eu estava fazendo 128 amostragens ... então acontecia eh que estourava o valor de 65535 da int16 ... to fazendo 64 amostragens e agora tá funcionando ...... mesmo sem ter feito as alterações sugeridas pelos colega Jorge .... mas mesmo funcionando , eu fiz as alterações , pois estava errado mesmo ..... Fabim , eu não estou fazendo oque vc falou , pq na verdade esta me sobrando tempo e código ... na real , o programa só tem que fazer isso mesmo .. tá sobrando muito recurso ... no máx , colocar um botão , para mostrar a potência ...

pessoar , até aqui muito obrigado , mas agora entra o pepino no qual falei .. eh sobre a precisão do AD ... to abrindo outro tópico para esse não ficar bagunçado

abs

Geraldo