duvida lcd 20x2

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

duvida lcd 20x2

Mensagempor jandom » 19 Out 2007 22:06

como mostrar 4 valores analogicos em um display 20x2, estou usando 4 entradas analogicas e precisava mostrar ao mesmo tempo estes valores!
Estou usando o ccs.
obrigado pela ajuda!
jandom
Byte
 
Mensagens: 132
Registrado em: 03 Nov 2006 20:40

Re: duvida lcd 20x2

Mensagempor andre_luis » 22 Out 2007 08:09

jandom,

Voce está com problemas de Layout ou de programação ?

Se for o 2o caso, tem muito material na Web. Dá uma busca no fórum http://www.edaboard.com que tem algo parecido com isso postado lá.

Se for em C, o compilador CCS já tem 'drivers' prontos para acesso à LCD e A/D.

+++
"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

Mensagempor jandom » 22 Out 2007 11:38

Andre! Obrigado por tua ajuda!
Mais preciso mostrar no display algo assim:
linha 1 - Vent1 XXXX mV Cor1 XXXX mA
linha 2 - Vent2 XXXX mV Cor2 XXXX mA
Hoje só estou conseguindo mostrar na linha1 a voltagem e na linha 2 a corrente em duas telas, o que dificulta a a calibração do equipamento, pois as telas ficam alternando entre si!
jandom
Byte
 
Mensagens: 132
Registrado em: 03 Nov 2006 20:40

Mensagempor ze » 22 Out 2007 14:33

tenho um Código Avançado Complexo Adaptável que faz algo como:
void msgdsp(lin,col,"texto"); //lin=1,2 col=0...19 no seu caso. É fácil adaptar a string para variável int.
Feito com Hitech C. se quiser...(tenho que procurar na minha Biblioteca Original Sobre Trabalhos Autodidatas
Abraço...
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor jandom » 22 Out 2007 21:55

Lellis, posta aqui pra nós, quem sabe a sua B.O.S.T.A, não pode salvar a V.I.D.A de muitos!!!
jandom
Byte
 
Mensagens: 132
Registrado em: 03 Nov 2006 20:40

Mensagempor jandom » 22 Out 2007 22:59

cpp code
int le_analogica()
{
output_high(out_via_1);
output_high(out_via_2);
delay_ms(100);
set_adc_channel(0);
delay_ms(200);
vin1_1 = read_adc();

lcd_pos_xy(1, 1);
printf (lcd_escreve,"Tensao %2.3f mV ",vin1_1);

set_adc_channel(1);
corrente1= read_adc();

lcd_pos_xy(1, 2);
printf (lcd_escreve,"Corrente %4.2f mA ",corrente1);

delay_ms(2000);
output_low(out_via_1);
output_low(out_via_2);

return(vin1_1);
return(corrente1);



Parei por aqui!!!
jandom
Byte
 
Mensagens: 132
Registrado em: 03 Nov 2006 20:40

Mensagempor ze » 23 Out 2007 10:06

espero que a V.I.D.A. de muitos valha + de que esta B.O.S.T.A.
(originária de um Código Único).

"mas afinal, o que é a V.I.D.A.?"


Código: Selecionar todos
//talvez fique menor do que printf()

//display 4 bits ligado em PORTC 7...4
#define lin1 0x80 //linha 1 do display
#define lin2 0xc0 //2
#define LCD_RS RC1
#define LCD_EN RC0
#define LCD_STROBE LCD_EN=1;asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");LCD_EN=0

void lcd_write(unsigned char c)
{
PORTC = (PORTC & 0x0f) | (c & 0xf0);
LCD_STROBE;
c <<= 4;
PORTC = (PORTC & 0x0f) | (c & 0xf0);
LCD_STROBE;
delay(500);
}
/**********************************************************************/
void msgdsp(unsigned char l,unsigned char c,const char * s)
{
LCD_RS=0;
lcd_write(l+c);  //posiciona cursor
LCD_RS=1;
while(*s)
lcd_write(*s++);
}
/**********************************************************************/
void lcd_dec(unsigned char l,unsigned char c,unsigned char nd,unsigned int dado)
{
unsigned int mil,cen,dez,un;
mil=dado/1000;
cen=(dado-mil*1000)/100; //pode usar %
dez=(dado-mil*1000-cen*100)/10;
un=dado-mil*1000-cen*100-dez*10;
LCD_RS=0;
lcd_write(l+c);//posiciona cursor
LCD_RS=1;
switch(nd) {
   case 4: lcd_write(mil+0x30);//sem break
   case 3: lcd_write(cen+0x30);
   case 2: lcd_write(dez+0x30);
   case 1: lcd_write(un+0x30);
   }
}
/**********************************************************************/
void lcd_init(void)
{
 LCD_EN=0;
 LCD_RS=0; // write control bytes
 delay(30); // power on delay
 PORTC = 0b00110000; // attention!
 LCD_STROBE;
 delay(2000); // power on delay
 LCD_STROBE;
 delay(10000); // power on delay
 LCD_STROBE;
 delay(2000); // power on delay
 PORTC = 0b00100000; // set 4 bit mode
 LCD_STROBE;
 delay(2000); // power on delay
 lcd_write(0x28); // 4 bit mode, 1/16 duty, 5x8 font
 lcd_write(0x0e); // display off
 lcd_write(0x06); // entry mode
 lcd_write(0x0c); // entry mode
 lcd_write(1); // limpa display
}

void main(void)
{
....
....
....

msgdsp(lin1,0,"oi!");
msgdsp(lin2,6,"tchau!");
lcd_dec(lin1,7,4,1234);
}
Editado pela última vez por ze em 23 Out 2007 10:40, em um total de 2 vezes.
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor ze » 23 Out 2007 10:44

edson, foi de propósito. só p ver se estava atento!!! brincadeira...

bigado! corrigi.....
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor EDSONCAN » 23 Out 2007 10:58

lcd_dec(lin1,7,1234);
void lcd_dec(unsigned char l,unsigned char c,unsigned char nd,unsigned int dado)

Se eu contei certo sao 4 parametros que a lcd_dec espera e voce passou 3, no C antigo isso dava pau, no mais modernos ja nao sei, alias ultimamente so sei que nada sei.

Edson
EDSONCAN
Word
 
Mensagens: 876
Registrado em: 11 Out 2006 14:11

Mensagempor jandom » 23 Out 2007 20:51

cpp code
WHILE(true)
{
output_high(out_via_1);
output_high(out_via_2);
output_high(out_via_3);
output_high(out_via_4);

set_adc_channel(0);
vin1_1 = read_adc();
vin1_1 = vin1_1*20;

lcd_pos_xy(1,1);
printf (lcd_escreve,"Va %2.2f ",vin1_1);

set_adc_channel(1);
vin2_1 = read_adc();
vin2_1 = vin2_1*20;
lcd_pos_xy(1,2);
printf (lcd_escreve,"Vb %2.2f ",vin2_1);

lcd_pos_xy(11,1);
set_adc_channel(2);
corrente1 = read_adc();

printf (lcd_escreve," Ca %2.2f ",Corrente1);

lcd_pos_xy(11,2);
set_adc_channel(3);
corrente2 = read_adc();

printf (lcd_escreve," Cb %2.2f ",Corrente2);


delay_ms(2000);
output_low(out_via_1);
output_low(out_via_2);
output_low(out_via_3);
output_low(out_via_4);
delay_ms(500);

}


tentei isso, mas não deu certo!
pois a leitura do canal 0 aparece no display em Vb que do outro canal, como se estivesse invertido as entradas, mas não estão!
alguém pode dar uma luz?
entrada tensão a= pino AN0
entrada tensão b= pino AN1
entrada corrente a = pino AN2
entrada corrente b = pino AN3

header

setup_ADC_ports (all_analog); // CONFIGURA ADC.
Setup_adc(ADC_CLOCK_INTERNAL); // CONFIGURA CLOCK.

No aguardo!!
jandom
Byte
 
Mensagens: 132
Registrado em: 03 Nov 2006 20:40

Mensagempor kubiak » 23 Out 2007 21:42

Jandom,

Não sei se é esse seu problema...
Porém no PIC depois de voce selecionar uma entrada analógica é necessário voce fazer um delay..Antres de ler...
Senão voce lê coisas estranhas, ou valor de outro canal etc...

set_adc_channel(0);
delay_us(100); // Já testei vários tempos de Delay....
vin1_1 = read_adc();
.....
.....

Um abraço...
kubiak
Bit
 
Mensagens: 37
Registrado em: 11 Out 2006 19:28
Localização: São Paulo - Brasil

Mensagempor ze » 24 Out 2007 09:15

setar posição de display com rotina antes de escrever... setar entrada adc com rotina antes de ler... [des]interessante este estilo do ccs. (mas sei que não é regra). me distanciei ainda + dele. o hitech tem rotinas + inteligentes (ponto de vista) como adcread(channel). see:
Código: Selecionar todos
#include <pic.h>

/* Basic A2D sample code for an PIC16F87x device.
 * This code willl set up the A2D module to return an
 * 8-Bit result. If greater precision is needed, a 10-Bit
 * result can be returned if read_a2d() is modified to
 * return the short ((ADRESH<<8)+(ADRESL)). Note also that
 * ADCON1 should be set to 0x80 in the init_a2d() routine
 * instead of zero.
 *
 * This code will sample an A2D value on analog port RA0, and it's value
 * will be used to move a LED's position across PORTB.
 *
 * This project can be demonstrated on the Microchip PICDEM2 board.
 */

__CONFIG(DEBUGEN & WDTDIS & LVPDIS);   // Setup the configuration word for ise with ICD2

/* Sample code to set up the A2D module */
void init_a2d(void){
   ADCON0=0;   // select Fosc/2
   ADCON1=0;   // select left justify result. A/D port configuration 0
   ADON=1;      // turn on the A2D conversion module
}

/* Return an 8 bit result */
unsigned char read_a2d(unsigned char channel){
   channel&=0x07;   // truncate channel to 3 bits
   ADCON0&=0xC5;   // clear current channel select
   ADCON0|=(channel<<3);   // apply the new channel select
   ADGO=1;   // initiate conversion on the selected channel
   while(ADGO)continue;
   return(ADRESH);   // return 8 MSB of the result
}

void main(void){
   unsigned char x;

   init_a2d();   // initialise the A2D module
   GIE=0;      // we don't want interrupts
   TRISB=0xF0;   // the lower four bits of POTRB will be used in output mode
   
   for(;;){
      x=read_a2d(1);      // sample the analog value on RA0
      PORTB = (1<<(x>>6));   // Use the 2 MS Bits of the result to select the bit position of the LED on PORTB
   }
}


com relação ao intervalo de tempo de leitura entre canais, sua rotina de display já o faz, mas tem sentido dar um tempo antes de ler.
Teste desconsiderar a primeira leitura como i=adcread();i=adcread();
Ah, e teste desabilitar ints (se tiver) durante a leitura.
abrç
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor jandom » 24 Out 2007 22:59

Obrigado galera pela ajuda de todos, mas faltava o delay antes da leitura!
jandom
Byte
 
Mensagens: 132
Registrado em: 03 Nov 2006 20:40


Voltar para PIC

Quem está online

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

x