Ajuda com Display LCD caracter especial

Software e Hardware para ATMEL

Moderadores: 51, guest2003, brasilma

Ajuda com Display LCD caracter especial

Mensagempor tmarchesi2 » 12 Abr 2009 21:19

Pessoal, mais um problema simples que eu não estou conseguindo resolver.


Eu quero escrever este caracter no display lcd e não ° e não consigo. Estou fazendo um termometro com o lm35.


lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf("Temp: C");

ftoa(canal0,2,conversao0);
lcd_gotoxy(6,0);
lcd_putsf(conversao0);

lcd_gotoxy(12,0);
lcd_putsf('0xBA'); da erro character constant is too long


Compilador Code vision + atmega8.

Sei que deve ser algum detalhe bobo que eu nao estou conseguindo corrigir.

Grato a todos;

Vlw
tmarchesi2
Nibble
 
Mensagens: 69
Registrado em: 23 Fev 2007 13:45

Mensagempor tmarchesi2 » 12 Abr 2009 22:55

Galera, ficou assim o código:

lcd_gotoxy(0,0);
lcd_putsf("Temp: C ");

ftoa(canal0,2,conversao0);
lcd_gotoxy(6,0);
lcd_puts(conversao0);


lcd_gotoxy(12,0);
ascii = 0xDF; // caracter °
lcd_putchar(ascii); // da erro character constant is too long
delay_ms(2000);


Eu acredito que de pra melhorar o código, porém está primeira versão está funcionando.

Como dica do nosso amigo Ssandei aqui do forum, o pulo do gato foi pesquisar a tabela ascii para lcd, pois não sei até onde isso é padrão, pois na primeira tabela ascii que pesquisei para o mesmo caracter o codigo hexa era BA.

encontrei aqui a tabela:

http://www.ics.uci.edu/%7Eneslab/labs/lab2/lab2.html

Quem souber como melhorar isso, pode comentar;


Valeu;
tmarchesi2
Nibble
 
Mensagens: 69
Registrado em: 23 Fev 2007 13:45

Mensagempor guest2003 » 12 Abr 2009 23:12

Todo LCD (destes de caracter e tals...)

Tem se nao me engano 8 posicoes que voce pode programar o caracter que voce quiser...

Ai voce pode ate programar um °C junto no mesmo caracter pra ficar mais legal e ocupar uma posica na tela a menos... e garantir compatibilidade entre LCDs diferentes. (ja que 99% tem estas posicoes programaveis)

[]'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 brasilma » 13 Abr 2009 10:34

Marchesi,

Não existe esse caractere na tabela do LCD - consulte a tabela de caracteres disponíveis no data-sheet - já vi algumas pessoas usando o simbolo "quadradinho" para isso.

Se desejar pode criar o simbolo, como o Guest comentou existe espaço na memória do LCD para 8 caracteres do usuário.

Abraços.
" A Teoria orienta e a Prática decide" ;-)
Avatar do usuário
brasilma
Dword
 
Mensagens: 3621
Registrado em: 11 Out 2006 15:39
Localização: Planeta Terra

Mensagempor tmarchesi2 » 13 Abr 2009 13:03

Então,

No segundo post que eu fiz, eu consigui escrever o caracter "bolinha", ta funcionand legal, porém eu utilizei 3 prints no display.

lcd_putsf("Temp: xx.xx °C ");
lcd_puts(conversao0);
lcd_putchar(ascii);

Será que não tem como fazer isso de uma forma mais econômica ?


ABraço
tmarchesi2
Nibble
 
Mensagens: 69
Registrado em: 23 Fev 2007 13:45

Mensagempor styg » 13 Abr 2009 23:15

eu uso o o valor 0xDF pra esse simbolo de graus, é só mandar esse valor como data. acho que era dele que o brasilma tava falando.. (quadradinho)
Lucas
Avatar do usuário
styg
Word
 
Mensagens: 799
Registrado em: 16 Out 2006 08:24
Localização: Floripa abaixo de zero.

Mensagempor vohr56 » 30 Abr 2009 19:12

No projeto que fiz utilizei o 0XDF também, no codevision. Ficou assim:



lcd_gotoxy(0,0);
sprintf(temp_display,"Temp 1=%5.2f%cC ",temp,0xdf);
lcd_puts(temp_display);


Abraços!!
vohr56
Bit
 
Mensagens: 22
Registrado em: 30 Nov 2006 10:36

Mensagempor tmarchesi2 » 03 Mai 2009 19:07

Fala Vorh;

No seu método está economizando mais linhas, fica mais interessante programar assim. Eu só preciso entender melhor como este sprintf funciona. Eu acredito que no manual do C.V. dever ter mais parametros explicando.

Grato pela ajuda, era isso que eu estava procurando, vou tentar implementar.


Tmarchesi
tmarchesi2
Nibble
 
Mensagens: 69
Registrado em: 23 Fev 2007 13:45

Mensagempor guest2003 » 03 Mai 2009 19:29

Vale lembrar que nem sempre menos linhas de programa equivalem a menos memoria ou melhor performance...

em alguns casos é o contrario...

Inclusive vi que você esta usando ponto flutuante, em ambiente embarcado sempre que possivel fuja disso !!

por exemplo, faça a conta com inteiros e depois ajuste a virgula...

Quer dividir um valor por 1.567 ... multiplique a entrada por 1000 e divida pelo inteiro 1567 e nao utilize ponto flutuante... vai ver que seu consumo de codigo / performance vão mudar muito... (se precisar de casa decimais, multiplique a entrada mais ainda... 10000 ou 100000)

ai na resposta voce apenas ajusta a virgula...

digamos 100 / 1.23 ... ai voce faz 100000 (100x1000) / 123 (1.23x100)

isso resulta em 813 que equivale a 81.3 ... pois temos que deslocar 1 casa na virgula (1000/100)

[]'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 vohr56 » 04 Mai 2009 13:22

tmarchesi2 escreveu:Fala Vorh;

No seu método está economizando mais linhas, fica mais interessante programar assim. Eu só preciso entender melhor como este sprintf funciona. Eu acredito que no manual do C.V. dever ter mais parametros explicando.

Grato pela ajuda, era isso que eu estava procurando, vou tentar implementar.


Tmarchesi


A sintaxe do sprintf é :

sprintf(string,"format",argumentos);

ele pega o texto formatado com os argumentos e joga-os para a string.
Logo no exemplo que fiz a string temp_display vai receber o texto formatado ja com o valor da temperatura e com o símbolo º.



guest2003:

Eu sabia que o float gasta muita memória, mas ainda não tinha pensado nesta sua implementação. Agora, coo poderia implementar este ajuste da virgula?
vohr56
Bit
 
Mensagens: 22
Registrado em: 30 Nov 2006 10:36

Mensagempor tmarchesi2 » 05 Mai 2009 08:07

Vorh56

Qual formato de variável eu devo especificar para o caso da variável temp_display ? ou qual tipo de dado ela pode carregar ? (char , float int).

Está semana se tudo der certo, eu já implemento no tcc.


Abraço;
tmarchesi2
Nibble
 
Mensagens: 69
Registrado em: 23 Fev 2007 13:45

Mensagempor tmarchesi2 » 05 Mai 2009 09:53

Deu certo;

Ja fiz os testes aqui. Consegui manipular o caracter da forma que eu precisava.


Se alguém precisa eu posto o trecho código.
Tem um exemplo no C.v com o DS1820, também ajuda pra quem precisar.


Grato;

Abraço a todos
tmarchesi2
Nibble
 
Mensagens: 69
Registrado em: 23 Fev 2007 13:45

Mensagempor Ander_sil » 06 Mai 2009 16:03

Só para dar minha contribuição:

Eu já fiz isso da seguinte maneira usando sprintf:

Código: Selecionar todos
// No inicio do programa declarei a variavel simbolo da seguinte forma:
// Notem que o primeiro byte da string é espaço;
char xdata simbolo[]=" C";

// Antes de formatar no buffer coloco o simbolo de grau:
simbolo[0]=223;

// Formato a string no buffer usando sprintf:
sprintf((char*)buffer,"TEMP = %.1f%s", (((float)(ADC0.channel0 * VREF) / 255) - 0.400) / 0.0195, simbolo);

// Envio para o LCD na linha 2 centralizado:
LCD_printf(buffer,LINHA2,CENTRO);


Depois no Keil 8051 eu fiz minha função de printf para LCD, mas não sei se funciona no CodeVision porque acho que ele não é ANSI-C mas vou postar mesmo assim.

Código: Selecionar todos
//------------------------------------------------------------------------
// Parameters:
// IN  row:     LCD display row     (1 to 4)
// IN  column:  LCD display column  (1 to 40)
// IN  *fmt:    format string
// Return: 0 if OK or -1 if error
//------------------------------------------------------------------------
int Printf_LCD(char linha, char coluna, const char *fmt,...)
{
   char xdata lcdstring[DISPLAY_MAX_COLUMNS+1];
   unsigned int xdata j=0;
   va_list arg_ptr;   

   if((linha == 0) || (linha > DISPLAY_MAX_RAWS) || coluna > DISPLAY_MAX_COLUMNS)
   {
      return (-1);
   }

   va_start(arg_ptr,fmt);   
   j += vsprintf(lcdstring + j, fmt,arg_ptr);
   LCD_goto_xy(linha, coluna);
   LCD_EnviaString(lcdstring);
   va_end(arg_ptr);
   return 0;
}


É preciso incluir a biblioteca:
#include <stdarg.h>

Ex: Para colocar a hora na primeira linha coluna 3 " 00:00:00 "
Código: Selecionar todos
Printf_LCD(1,3,"%02d:%02d:%02d",DateTimer.hora,DateTimer.min,DateTimer.seg);

ou
Código: Selecionar todos
if(Printf_LCD(1,3,"%02d:%02d:%02d",DateTimer.hora,DateTimer.min,DateTimer.seg))
               ErroAoEscreverLCD();

// No exemplo de Temperatura lá no começo não precisa do sprintf fica assim:
Printf_LCD(2,1,"TEMP = %.1f%s", (((float)(ADC0.channel0 * VREF) / 255) - 0.400) / 0.0195, simbolo);


é isso ai

falow!
Anderson Chrispim da Silva
chrispimdasilva@gmail.com
Ander_sil
Byte
 
Mensagens: 368
Registrado em: 30 Out 2006 09:58
Localização: Campinas - SP

Mensagempor vohr56 » 07 Mai 2009 20:08

guest2003 escreveu:Vale lembrar que nem sempre menos linhas de programa equivalem a menos memoria ou melhor performance...

em alguns casos é o contrario...

Inclusive vi que você esta usando ponto flutuante, em ambiente embarcado sempre que possivel fuja disso !!

por exemplo, faça a conta com inteiros e depois ajuste a virgula...

Quer dividir um valor por 1.567 ... multiplique a entrada por 1000 e divida pelo inteiro 1567 e nao utilize ponto flutuante... vai ver que seu consumo de codigo / performance vão mudar muito... (se precisar de casa decimais, multiplique a entrada mais ainda... 10000 ou 100000)

ai na resposta voce apenas ajusta a virgula...

digamos 100 / 1.23 ... ai voce faz 100000 (100x1000) / 123 (1.23x100)

isso resulta em 813 que equivale a 81.3 ... pois temos que deslocar 1 casa na virgula (1000/100)

[]'s


guest2003:

Gostaria de saber como que você faz para ajustar a virgula como você disse acima. O processo de multiplicar por 1000, 10000 e etc eu entendi. só não sei como ajustar a vírgula após isso.

Abraços!
vohr56
Bit
 
Mensagens: 22
Registrado em: 30 Nov 2006 10:36

Mensagempor guest2003 » 07 Mai 2009 20:58

Veja,

Não existe virgula, certo ?!!? estamos fugindo do ponto flutuante...

Existe sim uma "virgula virtual" :) pois voce esta trabalhando com os numeros multiplicados por um fator...

ou seja... sua variavel vai conter o valor 31415927... porém no display voce exibe PI = 3.1415927 (ou seja, você sabe onde a virgula deve estar)

Por exemplo, se esta trabalhando com fator de 100x a virgula esta 2 casas deslocadas... se a variavel esta com o valor 123 isso equivale (para exibição em display por ex) a 1.23

Não sei se deu pra entender a ideia... qquer coisa avisa !

[]'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

Próximo

Voltar para AVR

Quem está online

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

cron

x