Mostrar valor A/D no LCD

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Mostrar valor A/D no LCD

Mensagempor Vonnilmam » 22 Jun 2016 21:28

Olha eu aqui denovo...

Olá a todos os amigos.

Rapazes, estou com um probleminha, tenho uma matriz arrays onde estão alocados posições em ASCII, quando desejo chamar uma determinada LETRA ou NUMERO nessa tabela, utilizo essa chamada: SCROLL_TEXTO ( " helo word ");

Agora como eu faço para colocar o valor colhido do A/D (tô usando resolução de 8 bits), como eu jogo essa variável afim de chamar os dados contidos na arrays, tipo:

Li no A/D o número 10, e armazenei isso numa variável chamada de: DADO (8bits), como eu mando essa informação chamar...

Tò perdidinho.

Obrigado, Há sim uso o mikroc.
VonNilmam "Assembler" e agora "C"
Avatar do usuário
Vonnilmam
Byte
 
Mensagens: 446
Registrado em: 19 Out 2006 14:25
Localização: espacial

Re: Mostrar valor A/D no LCD

Mensagempor KrafT » 23 Jun 2016 07:52

Bom dia, Vonnilmam.

Fosse contaminado pelo C. Nunca mais te livrarás dele... No fase terminal dessa doença, vais estar estudando Very High Difficult Language.

--------------------------------

Se tua Vref do AD for 5V, eu multiplicaria a leitura por 196, (ou 196078431372549... haja variável para receber o resultado), depois dividiria por 10000, 1000, por 100, por 10 e junto ao resto, jogaria na função do display.

Por exemplo:

Leitura do ADC 127 (+-2,5V em 8 bits com Vref de 5V).
Multiplicado por 196 = 24892. Dividindo por 10000, temos 2 e sobram 4892. Coloca o 2 em Resultado[4];
Dividindo 4892 por 1000, temos 4 e sobram 892. Coloca o 4 em Resultado[3];
Dividindo 892 por 100, temos 8 e sobram 92. Coloca o 8 em Resultado[2];
Dividindo 92 por 10, temos 9 e sobram 2. Coloca o 9 em Resultado[1];
Pega o resto (2) e coloca em Resultado[0];

Agora tens Resultado[]={24892};

Rearranja o termo para ter o ponto decimal (Resultado[]={2,4892}) e só mandar Resultado para a função SCROLL_TEXTO.

Depois vc incrementa a rotina para apagar os zeros à esquerda do resultado, colocar a virgula corretamente e limitar as casas decimais.

Obs: "Dividir" significar subtrair o valor em Loop e contar as iterações.

Tem várias formas de fazer isso que precisas, acho essa mais didática.
"..."Come to the edge," he said. And so they came. And he pushed them. And they flew."― Guillaume Apollinaire
Avatar do usuário
KrafT
Dword
 
Mensagens: 2228
Registrado em: 11 Out 2006 14:15
Localização: Blumenau -SC

Re: Mostrar valor A/D no LCD

Mensagempor xultz » 23 Jun 2016 08:23

Eu não uso mikroC, uso XC8, mas costumo usar a função sprintf prá esses casos. A menos que você tenha limitações muito sérias de memória, usar printf e assemelhados ajuda muito.
Prá isso, crie um array de variáveis char com tamanho suficiente prá receber os caracteres (de preferência, deixe sempre uns bytes sobrando prá não correr nenhum risco de estourar o buffer), tipo
char frase[10];

depois, use o sprintf prá formatar teu valor (que está guardado em dado)
sprintf(frase,"%d",dado);

e depois mande pro display
SCROLL_TEXTO(frase);

Note que o sprintf pode ter usos mais legais, tipo
sprintf(frase,"Sensor: %d",dado);
e coisas do tipo.

Mas sempre, SEMPRE, tenha um array de char com tamanho suficiente prá caber todos os caracteres que o sprintf vai gerar. Ele pode ser bem maior do que o que você precisa, não tem problema, só não pode ser menor.

Se teu sensor tiver uma relação bem quebrada, por exemplo, você estiver lendo uma temperatura e quiser mostrar ela com uma casa decimal, tem a possibilidade de trabalhar com valores tipo float, a matemática fica toda a cargo do compilador, e o sprintf consegue apresentar os valores do jeito que você quiser. Quando fizer isso, não vai pensar em assembly nunca mais...
98% das vezes estou certo, e não estou nem aí pros outros 3%.
Avatar do usuário
xultz
Dword
 
Mensagens: 3001
Registrado em: 13 Out 2006 18:41
Localização: Curitiba

Re: Mostrar valor A/D no LCD

Mensagempor Vonnilmam » 23 Jun 2016 12:04

Bom dia a todos os amigos,

Então rapaziadas, o velho vonnilmam tá gostando dessa coisa de C...Mas ainda sou apaixonado pelo assembler, hehe...

Vem cá, eu agradeço a dica de vocês dois, mas eu acho que não soube me expressar corretamente.

Veja só, vamos ver se consigo agora descrever melhor o que quero fazer e peço desculpas por eu ser tão cabeça dura, rss.

FONTE.c aqui eu tenho arrays que vou utilizar numa matriz de leds.

scroll_texto ( " meus amigos ") aqui temos a chamada da tabela, observe que o texto escrito esta entre haspas e contém um espaço no começo e outro no final.
esse espaço é necessário para que a mensagem transcorra passando até o final na matrix visual linearmente.

Se eu colocar conforme esta acima, funciona tudo beleza, mas eu tenho que escrever isso no programa e compilar, o que eu quero fazer é poder montar esse texto e transmitir ele por uma serial, exemplo colher o dado do AD, ler um RTC e ai por diante. Eu não tô conseguindo é fazer isso...

Esse projetinho peguei na net aqui nesse endereço e aqui também tem um link do que eu fiz aqui...

Será que eu conseguir me expressar direito, nossa tô até com vergonha. Peço desculpas, rss.

MATRIX-PIC18.c

FONT.c
Você não está autorizado a ver ou baixar esse anexo.
VonNilmam "Assembler" e agora "C"
Avatar do usuário
Vonnilmam
Byte
 
Mensagens: 446
Registrado em: 19 Out 2006 14:25
Localização: espacial

Re: Mostrar valor A/D no LCD

Mensagempor Vonnilmam » 23 Jun 2016 12:09

O que eu fiz,
https://www.youtube.com/watch?v=I-xDMex0Adk
Os programas foram no anexo anterior, desculpem.

obrigado
VonNilmam "Assembler" e agora "C"
Avatar do usuário
Vonnilmam
Byte
 
Mensagens: 446
Registrado em: 19 Out 2006 14:25
Localização: espacial

Re: Mostrar valor A/D no LCD

Mensagempor KrafT » 23 Jun 2016 13:25

" meus amigos " vai ter 14 caracteres, pq o compilador vai colocar um caractere de fim.

Sem usar strcpy, printf e coisas malucas, vc pode fazer do modo mais difícil.

char Meutexto[14];

Meutexto[13]=' ';
Meutexto[12]='m';
Meutexto[11]='e'
Meutexto[10]='u';
Meutexto[9]='s';
Meutexto[8]=' '
Meutexto[7]='a';
Meutexto[6]='m';
Meutexto[5]='i';
Meutexto[4]='g';
Meutexto[3]='o';
Meutexto[2]='s';
Meutexto[1]=' '
Meutexto[0]=0;

Aí se vc fizer:
Código: Selecionar todos
 scroll_texto ( Meutexto);
, vai escrever a frase " meus amigos ".

Agora tua recepção serial tem que alimentar a varável "MeuTexto" com a informação que você quer mostrar, pode ser da forma penosa que mostrei acima.

Talvez ainda não tenha te entendido. Talvez eu tenha errado a ordem o texto e caractere de fim, dentro da variável.
"..."Come to the edge," he said. And so they came. And he pushed them. And they flew."― Guillaume Apollinaire
Avatar do usuário
KrafT
Dword
 
Mensagens: 2228
Registrado em: 11 Out 2006 14:15
Localização: Blumenau -SC

Re: Mostrar valor A/D no LCD

Mensagempor xultz » 23 Jun 2016 13:39

Desculpe, Von Nilmann, mas eu ainda não entendi o que você quer fazer e onde está se batendo. Eu sou tanso mesmo, se não explicar tintin por tintin eu não consigo entender mesmo.
98% das vezes estou certo, e não estou nem aí pros outros 3%.
Avatar do usuário
xultz
Dword
 
Mensagens: 3001
Registrado em: 13 Out 2006 18:41
Localização: Curitiba

Re: Mostrar valor A/D no LCD

Mensagempor Vonnilmam » 23 Jun 2016 14:13

Oi, galera.

O Craft, conseguiu me entender...é isso ai mesmo, só que eu quero é entender como fazer isso de forma dinâmica, ou seja poder enviar essas frases pelo serial por exemplo

Eu quero é ter um buffer onde eu posso colocar os textos através da serial, esse buffer é que eu to quebrando a cabeça para implementar, ou seja essa interface
entre as strings que chegam da serial e o ponteiro da tabela...

Aqui o único íngua aqui sou eu mesmo...kkkk

obrigado
VonNilmam "Assembler" e agora "C"
Avatar do usuário
Vonnilmam
Byte
 
Mensagens: 446
Registrado em: 19 Out 2006 14:25
Localização: espacial

Re: Mostrar valor A/D no LCD

Mensagempor Vonnilmam » 23 Jun 2016 15:23

Resolvendo isso acho que já dá para dar prosseguimento...se eu entendi bastaria eu ler a string da serial e carregar esse buffer texto[] individualmente, mas se alguém tiver uma forma melhor de fazer isso dentro dum loop por exemplo seria bom...rs

Eu coloquei o seguinte texto:

char texto[3];

texto[2]=' '; //espaço
texto[1]='A'; //string
texto[0]=' '; //espaço

scroll_text (texto); // chama a tabela da matriz.

Funciona certinho, mas aparece ao fim do texto um caracter desconhecido, o que pode ser?
vejam:
https://www.youtube.com/watch?v=7vPoYHj ... e=youtu.be

PS. só para exclarece, se eu colocar o texto direto em scroll_text desta forma scroll_text (" a "); fica normal sem o borrão.
VonNilmam "Assembler" e agora "C"
Avatar do usuário
Vonnilmam
Byte
 
Mensagens: 446
Registrado em: 19 Out 2006 14:25
Localização: espacial

Re: Mostrar valor A/D no LCD

Mensagempor KrafT » 23 Jun 2016 15:29

Aumenta a variável para:

char texto[4];

Tens que botar o valor zero em texto[0], ou texto[3], não sei a ordem de momento.. Testa aí:

texto[3]=0; //Fim da string indicado pelo conteúdo zero.
texto[2]=' '; //espaço
texto[1]='A'; //string
texto[0]=' '; //espaço

Ou

texto[3]=' '; //espaço
texto[2]='A'; //string
texto[1]=' '; //espaço
texto[0]=0; //Fim da string indicado pelo conteúdo zero.
"..."Come to the edge," he said. And so they came. And he pushed them. And they flew."― Guillaume Apollinaire
Avatar do usuário
KrafT
Dword
 
Mensagens: 2228
Registrado em: 11 Out 2006 14:15
Localização: Blumenau -SC

Re: Mostrar valor A/D no LCD

Mensagempor andre_luis » 23 Jun 2016 16:17

Vonnilmam escreveu:Funciona certinho, mas aparece ao fim do texto um caracter desconhecido, o que pode ser?


Pena que voce dividiu o topico, senão daria pra acompanhar o código anterior mais fácil...

De qualquer modo, embora eu não tenha certeza que possas ser isso, é importante saber que toda String, em C insere automaticamente um caratere NULL no final do array. Se você fizer isso SCROLL_TEXTO ( " helo word "); com uma variavel dentro ao invez da String, TALVEZ não seja inserido esse caractere, mas enfim, fica a informação.
"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

Re: Mostrar valor A/D no LCD

Mensagempor ze » 23 Jun 2016 16:48

para enviar texto pela serial pra ver no terminal eu fazia algo assim com zero lib gulosa...
Código: Selecionar todos
void meu_putc(unsigned char d)
{
TXREG=d; while(!TRMT); //vais ter que setar e entender um pouco o hw do mc
}

void meu_printf(const char *s)
{
while(*s) meu_putc(*s++);
}

meu_printf("para enviar texto pela serial pra ver no terminal eu fazia algo assim com zero lib gulosa");
meu_printf("karem e wesley preferem fugir ao inves de jantar para pergar o melhor abacaxi");//todas as letras do alfabeto.. acho


e assim...

Código: Selecionar todos
void decimal_serial(unsigned int d) //nada impede de tentar outros tipos de variável inteira
{
meu_putc(d%10 + 0x30);
d/=10;
meu_putc(d%10 + 0x30);
d/=10;
meu_putc(d%10 + 0x30);
d/=10;
meu_putc(d%10 + 0x30);
d/=10;
meu_putc(d%10 + 0x30);
}

decimal_serial(adcread(0));


também eu enviava os dados do conversor ad ou outro qualquer até 65535 que pra mim tava bão pra kct

Pode não ter nada a ver mas também pode não ser totalmente inútil...
1/2 que digito online
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Re: Mostrar valor A/D no LCD

Mensagempor Vonnilmam » 23 Jun 2016 18:23

Boa noite ao amigos,

Caramba, como apanhei desse trem sô.

Então o correto mesmo é fazer como o sugerido.

char texto[3];

texto[3]=0;
texto[2]=' ';
texto[1]="A";
texto[0]=" ";

Funcionou legal, saiu aquelo borrão medonho...rs

MUITO OBRIGADO A COLABORAÇÃO DE TODOS OS AMIGOS, pelo menos essa etapa foi transposta,

Agora vou tentar bolar uma forma mais enxuta de carregar esses buffers...aff

Obrigado
VonNilmam "Assembler" e agora "C"
Avatar do usuário
Vonnilmam
Byte
 
Mensagens: 446
Registrado em: 19 Out 2006 14:25
Localização: espacial

Re: Mostrar valor A/D no LCD

Mensagempor KrafT » 23 Jun 2016 18:58

Vonnilmam escreveu:char texto[3];


É:
Código: Selecionar todos
 char texto[4];


Mas que bom que deu certo. No início não dá para adotar as soluções mais elegantes (e abstratas), que vc vai se apavorar e voltar aso assembly. Um passo de cada vez.
"..."Come to the edge," he said. And so they came. And he pushed them. And they flew."― Guillaume Apollinaire
Avatar do usuário
KrafT
Dword
 
Mensagens: 2228
Registrado em: 11 Out 2006 14:15
Localização: Blumenau -SC

Re: Mostrar valor A/D no LCD

Mensagempor Vonnilmam » 24 Jun 2016 11:35

Bom dia Kraft, prazer em te rever.

Pois é, eu tô tendo que aderir ao C, é a modernidade...rss

Viu obrigado pela observação,
VonNilmam "Assembler" e agora "C"
Avatar do usuário
Vonnilmam
Byte
 
Mensagens: 446
Registrado em: 19 Out 2006 14:25
Localização: espacial


Voltar para PIC

Quem está online

Usuários navegando neste fórum: Google [Bot] e 1 visitante

x