Ad não mostra direito o valor no lcd

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Ad não mostra direito o valor no lcd

Mensagempor geraldomelo » 19 Jun 2008 06:50

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
geraldomelo
Byte
 
Mensagens: 267
Registrado em: 14 Out 2006 16:53
Localização: Ribeirão preto - SP

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

Mensagempor Jorge_Francisco » 19 Jun 2008 08:13

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?
Avatar do usuário
Jorge_Francisco
Dword
 
Mensagens: 1009
Registrado em: 12 Out 2006 09:53
Localização: Rio de Janeiro

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

Mensagempor Jorge_Francisco » 19 Jun 2008 08:17

Ah e o fuse para 4Mhz é XT.

Vlw
Avatar do usuário
Jorge_Francisco
Dword
 
Mensagens: 1009
Registrado em: 12 Out 2006 09:53
Localização: Rio de Janeiro

Mensagempor fabim » 19 Jun 2008 08:25

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
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 guest2003 » 19 Jun 2008 12:21

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
http://www.sethi.com.br (Institucional)
http://www.sethi3d.com.br (Impressoras 3d)
http://www.sethi.com.br/blog (Blog Impressoras 3d)
Avatar do usuário
guest2003
Word
 
Mensagens: 746
Registrado em: 13 Out 2006 11:48
Localização: Campinas - SP

Mensagempor geraldomelo » 24 Jun 2008 04:39

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
geraldomelo
Byte
 
Mensagens: 267
Registrado em: 14 Out 2006 16:53
Localização: Ribeirão preto - SP


Voltar para PIC

Quem está online

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

cron

x