colocando ponto decimal

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

colocando ponto decimal

Mensagempor geraldomelo » 13 Mai 2008 06:51

Ola pessoal estou lendo o ad do pic , mas eu queria apresentar o valor no lcd , na forma , por exemplo o valor eh de 125 , eu queria apresentar esse valor no lcd assim , 12.5 ... .. tipo o valor 68 , tem que aparecer no lcd 6.8 ai como eu faço ?? não queria usar float ... aho que eh dar tiro de canhão em passarinho ... como vou ter que fazer isso hein ..

ah , outras coisas , já que estamos falando em lcd tbm , minha rotina apaga o lcd a cada 500m_s , ou seja , fica uma piscação muito chata , se eu abaixo muito , ai tbm fica piscando mais rápido ainda e os valores lidos do ad ficam variando demais ... certo vou fazer uma somatorio para diminuir isso ...

outra coisa , como faço para mandar os comando para o lcd , como por exemplo o comando para desligar o cursor ..... ...... eu to usando o CCS ...

abs

Geraldo
geraldomelo
Byte
 
Mensagens: 267
Registrado em: 14 Out 2006 16:53
Localização: Ribeirão preto - SP

Mensagempor ze » 13 Mai 2008 07:46

comandos pro lcd:
http://www.geocities.com/dinceraydin/lcd/commands.htm
¿pra que apagar lcd mesmo? psi disso não, siô! (a não ser que ruídos o sujem e precise reescrever : pig, but works)
-imprimir com ponto:
d=68;
printf("%s",d/10); //ODEIO prinf!!!!
printf("%s",".");//ODEIO prinf!!!!
printf("%s",d%10);//ODEIO prinf!!!! e nem lembro+ se a sintaxe é assim! foi só pra teres 1 idéia. printf não é um canhão, mas é bazuca pra matar um passarinho.
provavelmente o ccs (éca!) deve ter exemplos de acionamento de display lcd

abrç
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor geraldomelo » 13 Mai 2008 21:55

Então , não deu certo não Lellis ....

obs : estou usando a biblioteca do Fábio Pereira .... oque eu queria fazer eh o seguinte ..... vamos por partes nas duvidas :

1 - pegar o valor do Ad do pic (0 até 1023) e multiplicar por 3 ( estou medindo uma tensão que vai até 30V , que já esta devidamente acondicionado de 0 a 5V para o ad do pic) , então o valor ira de 0 até 3069 .. eu queria fazer era colocar o ponto decimal assim 30.69 .... lógico que quando ele sair dos 3 algarismos , ele tem que colocar o ponto no lugar certo tbm , tipo 7.68 .... ejtenderam ?? to achando que vou ter separar a variavel mesmo não eh pessoal .... ps .. não queria usar float , pois ocupa muita memória ... to me enrolando aqui no printf ... heheheh ... mesmo com float , só para teste , tá ruim de fazer aparecer o ponto onde eu quero .....

2 - vc disse que eu não preciso ficar apaando o lcd toda hora ... tbm concordo , mas se eu não faço isso , quando ele sai de um algarismo de 4 digitos e vai mostrar um de 3 , ele bagunça tudo , pois ele não apaga o algarismo que já não faz mais parte da leitura ... ai bagunça tudo .... alguma idéia ?? q q eu não to sabendo usar ??

3 - por ultimo , analizando a biblioteca , existe a diretiva "lcd_escreve('\f');" , que apaga o display , ela na verdade chama a outra função : "lcd_envia_byte(0,1);" .... essa ultima , no lugar da primeira , funciona perfeitamente , pois "são a mesma coisa" , mas ai eh que tá , esses outros comandos abaixo eu não consigo usar com a função "lcd_envia_byte" ... :

FE, 1 Clear display
' $FE, 2 Return home
' $FE, $0C Cursor off
' $FE, $0E Underline cursor on
' $FE, $0F Blinking cursor on
' $FE, $10 Move cursor left one position
' $FE, $14 Move cursor right one position
' $FE, $80 Move cursor to beginning of first line
' $FE, $C0 Move cursor to beginning of second line


, ou mesmo , como eu envio os comandos da tabela que vc mesmo enviou Lellis .....

abs pessoal

Geraldo
geraldomelo
Byte
 
Mensagens: 267
Registrado em: 14 Out 2006 16:53
Localização: Ribeirão preto - SP

Mensagempor fabim » 13 Mai 2008 22:23

amigo se estiver trabalhando com 10 bits.

word to string . var word >> string[5] .. né ?

calculanho, só proce intender.

c = adc_read(1).

X = C * (5.00 / 1024). conversão explicita só pra acompanhar o racio.

X agóra vai ser entre 0000 e 4995.

olha a string de 5 casas
1,2,3,4,5
4 9 9 5 0
byte 5 = byte 4
byte 4 = byte 3
byte 3 = byte2
byte 2 = ',' ou '.'

resu.
4.995

tendeu ?

Disposi só jogar isso pro display.

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 ze » 14 Mai 2008 11:01

parte teoria, parte prática (de 1 fonte meu). Num vai querer que eu faça teste neah??

Código: Selecionar todos
#define LCD_RS RC1
#define LCD_EN RC0
#define LCD_STROBE
#define lin1 0x80
#define lin2 0xc0
unsigned int mil,cen,dez,un;
LCD_EN=1;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(50);
}
void separa(unsigned int dado)
{
mil=dado/1000;
cen=(dado-mil*1000)/100;
dez=(dado-mil*1000-cen*100)/10;
un=dado-mil*1000-cen*100-dez*10;
}
void escreve_decimal(unsigned char lc, unsigned char dado)
{
LCD_RS=0; //em 0 = comando
lcd_write(lc);//posiciona cursor
LCD_RS=1;//dado
lcd_write(dado+0x30); //+0x30 pra achar na tab ascii
}

exemplificando:

Código: Selecionar todos
...
ad=1234
separa(ad);
escreve_decimal(lin1+0,mil);
escreve_decimal(lin1+1,cen);
escreve_decimal(lin1+2,dez);
lcd_write('.');
escreve_decimal(lin1+3,un);
lcd_write(' ');
//display=123.4
...

inicializar o dsp pra 4 bits primeiro.
talvez possa desmembrar com a função separa() e remembrar com + "." strcat() ou strcopy(). Tem tbém a sprintf (desta eu gosto) que monta string. Talvez consiga colocar o ponto. Num me lembro a sintaxe. Estude-as minino!!...
(atchimmmmm!) ainda.....!
abrç
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor geraldomelo » 15 Mai 2008 08:23

Valeu fabim e lellis ..... vou testar aqui ... Fabim , não entendi direto como vc fez com a varialvel word ... como eu faço para converter uma variavel (no caso a variavel do ad) que eh uma int16 por exemplo , para umachar ou string ??

obs : estou usando o C CCS ... parece que o ex. que vc deu tá em picbasic ??

outra coisa , ainda não consegui mandar os comandos com a função lcd_envia_byte ... alguém poderia me ajudar ?? por exemplo , quero enviar o comando :

$FE, $0F Blinking cursor on

abs

Geraldo.
geraldomelo
Byte
 
Mensagens: 267
Registrado em: 14 Out 2006 16:53
Localização: Ribeirão preto - SP

Mensagempor fabim » 15 Mai 2008 08:32

cara eu só Bostei o procedimento a ser aplicado.
Né linguagem nenhuma, apenas matematica.
Mais olhe isso em C deve te dar uma luz.

Código: Selecionar todos

 #include"built_in.h"

unsigned char ch;
unsigned int t;
char a[17], *tc;
long tlong;

void main() {
  INTCON = 0;                        // disable all interrupts
  LCD_Init(&PORTD);                  // initialize  (4-bit interface connection)
  LCD_Cmd(LCD_CURSOR_OFF);           // send command to LCD (cursor off)
  LCD_Cmd(LCD_CLEAR);                // send command  to LCD (clear LCD)

  tc = "mikroElektronika";           // assign text to string a
  LCD_Out(1,1,tc);                   // print string a on LCD, 1st row, 1st column
  tc = "LCD example";                // assign text to string a
  LCD_Out(2,1,tc);                   // print string a on LCD, 2nd row, 1st column

  OPTION_REG  = 0x80;
  ADCON1     = 0x82;                 // configure VDD as Vref, and analog channels
  TRISA      = 0xFF;                 // designate porta as input
  TRISC  = 0;
  TRISD  = 0;
  Delay_ms(2000);
  tc  = "voltage:";                  // assign text to string a
  while (1) {
    t  = ADC_read(2);                // get ADC value from 2nd channel
    LCD_Out(2,1,tc);                 // print string a on LCD, 2nd row, 1st column

    tlong  = t * 5000;               // use (int) multiplication instead of (long)
    asm {                            //   and fill the upper two bytes manually
      MOVF STACK_2,W
      MOVWF _tlong+2
      MOVF STACK_3,W
      MOVWF _tlong+3
    }
    t = tlong >> 10;

    ch     = t / 1000;               // prepare value for diplay
    LCD_Chr(2,9,48+ch);              // write ASCII at 2nd row, 9th column
    LCD_Chr_CP('.');

    ch    = (t / 100) % 10;
    LCD_Chr_CP(48+ch);

    ch    = (t / 10) % 10;
    LCD_Chr_CP(48+ch);

    ch    = t % 10;
    LCD_Chr_CP(48+ch);
    LCD_Chr_CP('V');

    Delay_ms(1);
  }
}//~!
 


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 ze » 15 Mai 2008 08:55

de int para string:

Código: Selecionar todos
char* itoa(unsigned int value, char *string)
{
sprintf(string, "%5u", value); //%u=unsigned, %d=signed 5 caract. sprintf eu gostio.
return string;
}
...
char txt[10];
int t1;
t1=12345;
itoa(t1,txt);
...
lcdout(1,1,txt);//txt=string
...

se estás a começar, comece com mikroc. Num me lembro, mas acho que já tem um itoa() pronto.
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor fabim » 15 Mai 2008 10:25

pascal;
var
X : word;
y : real;
n : string[5];

begin
while true do
begin
x := ad_read(ad a ser lido);
y := X * (tensão de referencia 2.500 exemplo / 1024);
x := y; //conversão inplicita.
IntToStr(x,n);// converte inteiro word para string 5 casas
n[5] := n[4];
n[4] := n[3];
n[3] := n[2];
n[2] := '.';

LCD_out(linha, coluna, n);

end;
end.

Aí dispois o Pirex fala que eu sou o unico no mundo a programar em pascal, porque será eim ?rsrs

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 geraldomelo » 15 Mai 2008 22:16

Ok pessoal , vou testar aqui oque vcs falaram ... já deu pra entender , e estou estudando as funções .....

bom , mas agora oque eu não consigo mesmo eh mandar esses comandos pro lcd :

FE, 1 Clear display
' $FE, 2 Return home
' $FE, $0C Cursor off
' $FE, $0E Underline cursor on
' $FE, $0F Blinking cursor on
' $FE, $10 Move cursor left one position
' $FE, $14 Move cursor right one position
' $FE, $80 Move cursor to beginning of first line
' $FE, $C0 Move cursor to beginning of second line

qq estou fazendo errado hein ???
geraldomelo
Byte
 
Mensagens: 267
Registrado em: 14 Out 2006 16:53
Localização: Ribeirão preto - SP

Mensagempor ze » 16 Mai 2008 09:53

vamo lá:
enviar COMANDOS: sua linha lcd_RS tem que estar em 0 (zero)
enviar DADOS: sua linha lcd_RS tem que estar em 1 (hum)
ex:
0x01 Clear display: os DADOS (8 bits) estão em PORTC. O lcd_RS em RB7 e o lcd_EN em RB6:
//inicialise display primeiro por favor

PORTC=0x01; //limpa display
RB7=0; //comando
RB6=1;RB6=0; //pulso

quer que faça um desenho?? rs
Rotinas prontas como printf, putc, scanf é pra frutinhas. Crie suas próprias. Analise as que bostemos. Já tá tudo mastigado lá. Só falta engolir.
abrç
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32


Voltar para PIC

Quem está online

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

cron

x