Ir ao conteúdo
  • Cadastre-se

Recommended Posts

Boa tarde galera, estou com um projeto utilizando pic e display grafico, consegui fazer algumas coisas, só que age eu fiz um setup de Ad para ler um lm35, porém na hora de imprimir na tela do display grafico esta com erro, eu fiz uma nova pesquisa e encontrei algo sobre casting, e fiz um casting de long para char, ex:temp = (char)valor// tempo e a variavel que vou imprimir no disp, e o valor e buffer do read adc(), mas mesmo assim nao consegui muita coisa... Estou usando o compilador Pic c da Ccs, 18f452, display 128x64. Grato se alguém puder me ajudar Falou...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Só pra esclarecer um pouco mais qual e minha duvida.. E que a biblioteca glcd do PIC C CCS, ela só imprime no display variáveis do tipo carácter, e o retorno do adc, como qualquer variavel Seria numérico, por isso acho que preciso fazer uma conversão para char, eu fiz essa conversão, ele começou a ler alguma coisa... Mas na conversão ele da o codigo correspondente da tabela asc2 mas ao comparar com a tabela o numero que retorna nao condiz com a tabela... Se alguém puder ajudar fico grato... Talvez se tiver uma forma mais fácil de fazer isso...

Compartilhar este post


Link para o post
Compartilhar em outros sites

amigo você está no caminho certo. Realmente funções para escrever preferem asc-ii (não 2). você pode tentar algo mastigado como a função sprintf() que converte de inteiro para string texto. Caso não se sinta confortável em usá-la (é xatinho mesmo), tem uma opção curiosa:

converter o int do adc em milhar,centena,dezena,unidade e de quebra converter para asc-ii (+0x30)

unsigned char milhar,centena,dezena,unidade;// se não funcionar faça com unsigned intadc=adc_read(0);//p.ex.milhar=adc/1000 + 0x30;centena=(adc-milhar*1000)/100 + 0x30;dezena=(adc-milhar*1000-centena*100)/10 + 0x30;unidade=(adc-milhar*1000-centena*100-dezena*10) + 0x30;

e depois enviar um a um para o display

putchar(milhar);putchar(centena);putchar(dezena);putchar(unidade);

Algo me diz que você vai preferir a sprintf() mas antes, claro, veja se seu compilador dá suporte à ela

Compartilhar este post


Link para o post
Compartilhar em outros sites
Então você quer converter um valor inteiro para o seu correspondente na tabela ASCII, certo?
Tipo:
3 Int -> '3' Char | 0 Int -> '0' Char ... 9 Int -> '9' Char
 
pedaço da tabela ASCII:
.__________.|Char | Dec| | 0   | 48 || 1   | 49 || 2   | 50 || 3   | 51 || 4   | 52 || 5   | 53 || 6   | 54 || 7   | 55 || 8   | 56 || 9   | 57 |'----------'
 
Para converter de Inteiro para Char, some 48 ao valor inteiro ai você terá o correspondente em Char.
valor_inteiro=3;              valor_char=valor_inteiro+48  //valor_char=51 que de acordo com a tabela ASCII é '3'
 
**Com esse método cada dígito (de 0 a 9) deverá ser convertido individualmente.
 
 
Do link acima:
#define   int_para_char(c)  ((int)((c)+'0')) //'0' = 48...valor_inteiro=3;valor_char=int_para_char(valor_inteiro);

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

amigo você está no caminho certo. Realmente funções para escrever preferem asc-ii (não 2). você pode tentar algo mastigado como a função sprintf() que converte de inteiro para string texto. Caso não se sinta confortável em usá-la (é xatinho mesmo), tem uma opção curiosa:

converter o int do adc em milhar,centena,dezena,unidade e de quebra converter para asc-ii (+0x30)

unsigned char milhar,centena,dezena,unidade;// se não funcionar faça com unsigned intadc=adc_read(0);//p.ex.milhar=adc/1000 + 0x30;centena=(adc-milhar*1000)/100 + 0x30;dezena=(adc-milhar*1000-centena*100)/10 + 0x30;unidade=(adc-milhar*1000-centena*100-dezena*10) + 0x30;

e depois enviar um a um para o display

putchar(milhar);putchar(centena);putchar(dezena);putchar(unidade);

Algo me diz que você vai preferir a sprintf() mas antes, claro, veja se seu compilador dá suporte à ela

 

Isadora, é que assim, o compilador PIC C CCS, ele usa um "printf" diferente para imprimir em display grafico, é uma biblioteca presente nele em que ele define assim ==> glcd_text57(3,55,variavel,2,1);// em que 3 é a posição "X" do disp, 55 posição "Y", variavel é a variavel do tipo string, ou seja char[]="25", que ele vai imprimir, 2 é o tamanho da fonte que ele vai imprimir no disp, e 1 é a cor do pixel, se colocasse 0 nessa posição ele nao "preenche" o pixel.

Ou seja, preciso pega minha variavel retornando valor numérico e transformá-la em char[]="variavel";, e para isso fiz dessa forma==> variavel = (char)read_adc();, que era pra retornar um valor numerico correpondente a tabela ascii, mas nao retorna , por exemplo eu con verto um numero 0, que depois da transformação era pra me dar um numero 048, ele nao me volta nada, se eu coloco 9 ele me volta uma conversão com o numero ":55", nao to conseguindo entender isso...

Grato!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então você quer converter um valor inteiro para o seu correspondente na tabela ASCII, certo?

Tipo:

3 Int -> '3' Char | 0 Int -> '0' Char ... 9 Int -> '9' Char
pedaço da tabela ASCII:

.__________.|Char | Dec| | 0   | 48 || 1   | 49 || 2   | 50 || 3   | 51 || 4   | 52 || 5   | 53 || 6   | 54 || 7   | 55 || 8   | 56 || 9   | 57 |'----------'
Para converter de Inteiro para Char, some 48 ao valor inteiro ai você terá o correspondente em Char.

valor_inteiro=3;              valor_char=valor_inteiro+48  //valor_char=51 que de acordo com a tabela ASCII é '3'
**Com esse método cada dígito (de 0 a 9) deverá ser convertido individualmente.

http://www.ccsinfo.com/forum/viewtopic.php?p=116027

Do link acima:

#define   int_para_char(c)  ((int)((c)+'0')) //'0' = 48...valor_inteiro=3;valor_char=int_para_char(valor_inteiro);

Compartilhar este post


Link para o post
Compartilhar em outros sites

Esta parte que você citou:

variavel = (char)read_adc();

não converte o valor lido para char.

 

 


[...] Preciso pega minha variavel retornando valor numérico e transformá-la em char[]="variavel";[...]

 

Com o exemplo do Isadora dava para você chegar ao resultado. O código fica mais ou menos assim:

 

  variavel=952;      milhar=variavel/1000;                     // -> milhar = 952 / 100 = 0      centena=(variavel-milhar*1000)/100;       // -> centena = (952 - 1000 * 0) / 100 = 9      dezena=variavel-milhar*1000-centena*100;  // -> dezena = 952 - 0 * 1000 - 9 * 100 = 52   dezena=dezena/10;                         //    dezena = 52 / 10 = 5 (dezena/=10)      unidade=variavel%10;                      // -> unidade = 952 % 10 = 2 (pega o resto da divisão)      string[0]=milhar+48;    // 0 + 48 = 48 = '0'   string[1]=centena+48;   // 9 + 48 = 57 = '9'   string[2]=dezena+48;    // 5 + 48 = 53 = '5'   string[3]=unidade+48;   // 2 + 48 = 50 = '2'   string[4]=0;            //NULL TERMINATION

 

Dica:

Se estiver simulando no Proteus carregue o PIC com o arquivo .cof e realize o passo a passo do código (usando o pause, step into e step over), assim você descobrirá onde está o erro.

 

Não tenho certeza mas acho que o código do Isadora possui um erro. Ele usa um dado em CHAR para realizar uma operação com dados em INT... A milhar fica Ok mas a partir daí ocorrem erros por causa do uso de um dado já convertido para CHAR em outras operações... 

 

Edit:

 

Outra forma (citada pelo Isadora):

 

variavel=952;sprintf(string,"%04lu",variavel);

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Esta parte que você citou:

variavel = (char)read_adc();

não converte o valor lido para char.

 

 

 

Com o exemplo do Isadora dava para você chegar ao resultado. O código fica mais ou menos assim:

 

  variavel=952;      milhar=variavel/1000;                     // -> milhar = 952 / 100 = 0      centena=(variavel-milhar*1000)/100;       // -> centena = (952 - 1000 * 0) / 100 = 9      dezena=variavel-milhar*1000-centena*100;  // -> dezena = 952 - 0 * 1000 - 9 * 100 = 52   dezena=dezena/10;                         //    dezena = 52 / 10 = 5 (dezena/=10)      unidade=variavel%10;                      // -> unidade = 952 % 10 = 2 (pega o resto da divisão)      string[0]=milhar+48;    // 0 + 48 = 48 = '0'   string[1]=centena+48;   // 9 + 48 = 57 = '9'   string[2]=dezena+48;    // 5 + 48 = 53 = '5'   string[3]=unidade+48;   // 2 + 48 = 50 = '2'   string[4]=0;            //NULL TERMINATION

 

Dica:

Se estiver simulando no Proteus carregue o PIC com o arquivo .cof e realize o passo a passo do código (usando o pause, step into e step over), assim você descobrirá onde está o erro.

 

Não tenho certeza mas acho que o código do Isadora possui um erro. Ele usa um dado em CHAR para realizar uma operação com dados em INT... A milhar fica Ok mas a partir daí ocorrem erros por causa do uso de um dado já convertido para CHAR em outras operações... 

 

Edit:

 

Outra forma (citada pelo Isadora):

 

variavel=952;sprintf(string,"%04lu",variavel);

 

Esta parte que você citou:

variavel = (char)read_adc();

não converte o valor lido para char.

 

 

 

Com o exemplo do Isadora dava para você chegar ao resultado. O código fica mais ou menos assim:

 

  variavel=952;      milhar=variavel/1000;                     // -> milhar = 952 / 100 = 0      centena=(variavel-milhar*1000)/100;       // -> centena = (952 - 1000 * 0) / 100 = 9      dezena=variavel-milhar*1000-centena*100;  // -> dezena = 952 - 0 * 1000 - 9 * 100 = 52   dezena=dezena/10;                         //    dezena = 52 / 10 = 5 (dezena/=10)      unidade=variavel%10;                      // -> unidade = 952 % 10 = 2 (pega o resto da divisão)      string[0]=milhar+48;    // 0 + 48 = 48 = '0'   string[1]=centena+48;   // 9 + 48 = 57 = '9'   string[2]=dezena+48;    // 5 + 48 = 53 = '5'   string[3]=unidade+48;   // 2 + 48 = 50 = '2'   string[4]=0;            //NULL TERMINATION

 

Dica:

Se estiver simulando no Proteus carregue o PIC com o arquivo .cof e realize o passo a passo do código (usando o pause, step into e step over), assim você descobrirá onde está o erro.

 

Não tenho certeza mas acho que o código do Isadora possui um erro. Ele usa um dado em CHAR para realizar uma operação com dados em INT... A milhar fica Ok mas a partir daí ocorrem erros por causa do uso de um dado já convertido para CHAR em outras operações... 

 

Edit:

 

Outra forma (citada pelo Isadora):

 

variavel=952;sprintf(string,"%04lu",variavel);

 

 

Então, tipo eu usei seu exemplo da tabela ascii, de soma 48, vou anexar meu programa pra você entender

 

 

 

char l,c;

void limpa_3()

{

      for(l=99;l<116;l++)

      {

            for(c=55;c<64;c++)

            {

                  glcd_pixel(l,c,0);//limpa posição de temperatura

            }

      }

}

void main()

{

   

   char hora[] = "10:55";// assim imprime corretamente no display..

   char data[] = "22/05/15";

   char temp[];// aqui eu preciso modificar, aqui é a variavel que recebe o valor para imprimir no display

   long temperatura;

   float valor;

   int temp_2 [3] = "29";// abaixo apenas variaveis de teste...

   char km[] = "110";

   char un[] = "Km/h";

   

   

   

   

   setup_adc(ADC_CLOCK_INTERNAL);

   setup_adc_ports(AN0_VREF_VREF);

   set_adc_channel(0);

   

   glcd_init(ON);   //inicializa o display

   glcd_fillScreen(0); //limpa display inteiro

   

   glcd_fillScreen(0); //limpa display inteiro

   glcd_imagem(1);

   glcd_line(0,43,128,43,1);// linha horizontal, linhas que fiz de moldura no meu projeto

   glcd_line(37,43,37,64,1);//primeira linha vertical

   glcd_line(90,43,90,64,1);// segunda linha vertical

   

   while(1)

   {

   temperatura = read_adc();//lendo o conversor AD

   valor = (temperatura*0.0488);//logica realizada para pegar uma referência de +5V para o conversor do LM35

   valor = valor+48;// exemplo citado pelo test man do forum Clube do Hardware

   temp =(char)valor;// conversão float para char, peguei de uma apostila de uma faculdade...

   

   glcd_text57(3,55,hora,1,1);

   glcd_text57(40,55,data,1,1);

   glcd_text57(100,55,temp,1,1);// mostra valor de temp.

   glcd_circle(117,51,2,0,1);

   delay_ms(1500);

   printf("%f \n \n \n \n \n",valor);

   printf("%c",temp);

   delay_ms(500);

   printf("\f");

   limpa_3();//aqui seria o while onde limpa os visores inferiores

   valor=0;

   temp=0;

   

   // O programa assim esta funcionando para imprimir o 9

   //, mas o resto dos caracteres não...

   //porém no hiperterminal que coloquei no proteus a variavel temp assume o valor correto..

   //só o display que imprime umas coisas nada a ver

   // à o programa ta meio bagunçado porque to testando ainda...

 

tipo o hiperterminal do proteus ta dando o resultado certinho so que o display grafico nao, começa a imprimi umas coisas nada a ver quando varia a temperatura do lm35, só o 9 graus que ele imprime certo....

só pra ressaltar os printf... é da função rs232 que usei o hiperterminal para ver se tava certo a variavel que converte em char, o display é a função GLCD_text57 que imprime... como disse pelo hiperterminal ta tudo certooo

Compartilhar este post


Link para o post
Compartilhar em outros sites

no terminal assume o valor correto pois a função print formata pra você. Na verdade envia formatando. Por isso que mencionei a função sprintf pois ela envia formatando pra "string" (e não pro teminal) sua variável unsigned int do adcread()

 

perceba o que o amigo@test man*~ tentou exemplificar...

 

variavel=adctead();
sprintf(string,"%04lu",variavel);

 

abç

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá.

Separei algumas linhas de um programa onde tive que fazer essa conversão. Conforme já foi citado, usei o sprintf.

char Tempf[6] = "\0";signed int siTempInt;//Converte o conteúdo da variavel siTempInt(signed int) para char//e preenche o array Tempf tipo charsprintf(Tempf, "%3d", siTempInt);//Apresenta no GLCDglcd_text57(41, 41, &Tempf, 3, 1);

beleza!

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ok, deixe me ver se entendi, a funcao sprintf, ela apenas formata o valor em string, e pelo contrario do que pensei ela nao da saida para o terminal isso ... porque achei que sprintf seria o mesmo que printf porém para uma string.... é que faz algum tempo que nao programo... ai to meio frio nessas funcoes.. vou tentar este exemplo do sprintf então... valeu mesmo galera... se der certo eu retorno aqui valeu...

Compartilhar este post


Link para o post
Compartilhar em outros sites
Sim é isso, eu queria que você testasse e descobrisse 
 


temperatura = read_adc();valor = (temperatura*0.0488);//valor = valor+48;                                                 sprintf(string,"%.2f",valor);     // -> se temperatura é 23.74 (float) será armazenado na string 23.74\0 (char).                                 //    \0 é a terminação NULL que a função glcd_text57 pede..glcd_text57(100,55,string,1,ON);  

 

Continua a dica em... Se estiver usando o proteus carregue o PIC com a arquivo .cof use o pause, step into e step over para debugar o código.

 

v53T3KO.png

 

Se quiser saber o que uma função do CCS faz clique no ícone "?" no canto superior direito - depois em "index" - selecione a aba Índice - digite o nome da função.

 

kUirW0q.png

 

Falou ai...

 

õ/

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Galera... valeu mesmo pela ajuda... Eu usei a função sprintf e consegui resolver..valeu mesmo pela atenção de todos...agr vou continuar o projeto para integrar o ds1307 no projeto... valeu

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×