exibir valor em 5 display

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Mensagempor Andre_Cruz » 07 Dez 2009 15:34

No livro "Microcontroladores PIC Técnicas Avançadas" do Fabio Perreira, tem uma "função" em asm que converte dois bytes em unidade, dezena, centena, milhar e dezena de milhar.

É simples e objetiva a função !

E permite fazer isso sem muita complicação.

Vocês falam da velocidade em se contruir um fonte em ASM, pra quem ja programa em ASM faz tempo tem varias "funções" prontas, na hora de fazer um fonte é só pegar essas funções que são uma mão na roda e implementar o restante.

Abraço
Andre_Cruz
Word
 
Mensagens: 559
Registrado em: 03 Jan 2009 14:06

Mensagempor Djalma Toledo Rodrigues » 07 Dez 2009 17:21

cristian escreveu:o display é lcd ...


exibir valor em 5 display né ?

Bom vamos em frente.

Então fica valendo tudo que coloquei com exceção da Tabela abcdefg

já que agora será Código ASCII

DJ
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22

Mensagempor msamsoniuk » 07 Dez 2009 18:34

perae! vc converteu de base 16 para base 10 usando duas instrucoes?!? como isso? :)

olha o trampo para converter um byte:

http://www.engr.udayton.edu/faculty/jlo ... o_BCD.html

Djalma Toledo Rodrigues escreveu:Marcelo

O Cristian fala em Cinco Displays --- Subentendo que seja Display LEDs 7 Segmentos

Nada há ver com ASCII, este é para Display LCD

É óbvio que a Saída do ADC (Que aliáis ninguém ainda falou em ADC aqui) é Bánáriio e para se tranformar em Tensão necessita o "tratamento" com a respectiva Referência do ADC

Se a Referência for 4.096 V e o ADC 10 Bits tranquílo cada Bit 4 mV

RLF f,1
RLF f,1 ; Convertido para mV

Converte para BCD e tem os 2 Digitos 0 a 9 e 0 a 9 em cada Byte

Código: Selecionar todos
 Ex.: 12658 em BCD:
           00000001 (MSB)    00100110      01011000 (LSB)     


DJ
Avatar do usuário
msamsoniuk
Dword
 
Mensagens: 2935
Registrado em: 13 Out 2006 18:04

Mensagempor Jozias del Rios » 07 Dez 2009 19:09

Poisé, mas o desafio é pro DJ, que parece que ainda não se achou... então eu finalizo o desafio :D

tem como fazer de forma simples sim, mas exige raciocínio, saber como se implementa um algoritmo de divisão, por exemplo.

Mostra o do Fábio ae... ao menos a idéia geral, para não ter problemas com a lei...

tem uma forma (simples) de se fazer com subtrações sucessivas (por exemplo, subtrai 10000 até dar borrow, depois subtrai 1000, etc...) porém isso não é elegante, pois não é um único "loop"...
tem outra forma com long-division que usa bastante shifts/rotates bem elegante. Mas não tem forma com LUT (look-up table) hehehe... a menos que vc esteja querendo converter para escala LOG, fazer a divisão (que é uma subtração em log) e então retornar de LOG para escalar por outra LUT... hehe... interessante porém aproximado, além de caro (LUTs enormes)

DJ, veja que ele não disse que os digitos estavam em BCD, formato esse que nem é suportado diretamente no C, eu suponho. Então seria no mínimo errado escrever "12658/10" em linguagem C, se o 12658 estivesse representado em BCD na memória RAM!

É no mínimo conveniente demais esperar que esteja em BCD, só por causa da finalidade... e se ele quisesse dividir por 2? como vc faz isso em BCD de forma simples, Senhor Djalma? faria 12658/2 ?????

Coloquei o desafio para ASCII porque o desafio é relacionado com a implementação da função ANSI "sprintf" que converteria para ASCII.
Os vencedores são aqueles que sabem o que fazer se perderem.
Os perdedores são aqueles que não sabem o que fazer se ganharem.
Avatar do usuário
Jozias del Rios
Byte
 
Mensagens: 279
Registrado em: 31 Out 2009 03:36
Localização: SJCampos-SP

Mensagempor vtrx » 07 Dez 2009 19:40

Desafio esquisito,usando mls sabendo-se que em ASM usa-se abaixo de µs...
Olha um desafio bom,implemente a rotina erquivalente num DSPIC,mais eficaz(pois a citada fica lenta) em C doque o DSPIC pode fazer:
float velocidade = 1500;
long int k=0;
float perfil_vel=0;
float ciclo=20000000;

for (k=0;k<=555555;k++)
{
perfil_vel = velocidade/ciclo*k;
}


Em ASM:
Código: Selecionar todos
  MOV  0x0000,k
REPETE:
  MOV  velocidade,W0
  MOV  ciclo , W1
  DIV    W0,W1
  MOV   k,W2
  MUL    W1,W2
  MOV   W2,perfil_vel
  INC     k,F
  MOV     D'55555',W0
  CPFSEQ K
  BRA     REPETE


A rotina em C fica inviável para audio em tempo real.
Avatar do usuário
vtrx
Dword
 
Mensagens: 2240
Registrado em: 20 Abr 2008 21:01

Mensagempor Djalma Toledo Rodrigues » 07 Dez 2009 20:22

Marcelo Samsoniuk escreveu:perae! vc converteu de base 16 para base 10 usando duas instrucoes?!? como isso? :)


Não foi nada disso

Veja bem, Quando se faz a Conversão no ADC o Número Binário que se obtem
é Admencional, é apenas o Conteúdo de um Contador ( Contador de Aproximação
Sucessíva mas, Contador )
Para que ele se Transforme em um Valor de Tensão que é a finalidade da Conversão
há que relacionar com a Tensão de Referência do ADC

Concordam ?

Então eu supuz uma Tensão de Referência de 4.096 V que dividida por 1024
do ADC de 10 Bits da Exato 4 mV por Bit. Lógico que se há que Multiplicar
por 4 para obter a tensão em mV

Daí as duas Instruções RLF Faltou é bem verdade esclarecer que é Word,
Rotacionar para a Esquerda o Word duas vezes.

Para "converter" para Volts no Display não há necessidade de Cálculo, basta apenas
deslocar o Ponto Decimal Ex.: 4096 mv 4.096 V 40.96 V

-- Conforme ja coloquei aqui no Forum em outro Tópico.
O Humano julga pelo deslocamento do DP que esta sendo Multiplicado ou Dividido por 10
(Coisa de Cinema rs )


DJ
Editado pela última vez por Djalma Toledo Rodrigues em 08 Dez 2009 15:41, em um total de 2 vezes.
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22

Mensagempor msamsoniuk » 07 Dez 2009 20:47

eu soh achei estranho vc ter usado float na versao em C e no dspic utilizou os registros diretamente... deve ser muito mais rapido neh, mas segundo o datasheet (nao manjo de dspic) desse cara os registros sao para inteiros de 16 bits, entao o codigo nao deve funcionar, certo?

vtrx escreveu:Desafio esquisito,usando mls sabendo-se que em ASM usa-se abaixo de µs...
Olha um desafio bom,implemente a rotina erquivalente num DSPIC,mais eficaz(pois a citada fica lenta) em C doque o DSPIC pode fazer:
float velocidade = 1500;
long int k=0;
float perfil_vel=0;
float ciclo=20000000;

for (k=0;k<=555555;k++)
{
perfil_vel = velocidade/ciclo*k;
}


Em ASM:
Código: Selecionar todos
  MOV  0x0000,k
REPETE:
  MOV  velocidade,W0
  MOV  ciclo , W1
  DIV    W0,W1
  MOV   k,W2
  MUL    W1,W2
  MOV   W2,perfil_vel
  INC     k,F
  MOV     D'55555',W0
  CPFSEQ K
  BRA     REPETE


A rotina em C fica inviável para audio em tempo real.
Avatar do usuário
msamsoniuk
Dword
 
Mensagens: 2935
Registrado em: 13 Out 2006 18:04

Mensagempor msamsoniuk » 07 Dez 2009 21:02

nao me leve a mal mas soh consigo pensar em uma resposta para isso:

Imagem

jah comeca que normalmente as tensoes de referencia sao 5V, 3.3V ou qq coisa que *nunca* vai ser 2^n para vc resolver a vida assim facil com um par de shifts hehehe e vc continua tendo o valor do adc em base 16, daih vai ter q converter para base 10 do mesmo jeito usando divisoes e multiplicacoes! :)

no fundo eu acho que vcs andam fumando demais... o cara soh queria converter um base 16 para base 10 para poder imprimir no lcd!

Djalma Toledo Rodrigues escreveu:
Marcelo Samsoniuk escreveu:perae! vc converteu de base 16 para base 10 usando duas instrucoes?!? como isso? :)


Não foi nada disso

Veja bem, Quando se faz a Conversão no ADC o Número Binário que se obtem
é Admencional, é apenas o Conteúdo de um Contador ( Contador de Aproximação
Sucessíva mas, Contador )
Para que ele se Transforme em um Valor de Tensão que é a finalidade da Converção
há que relacionar com a Tensão de Referência do ADC

Concordam ?

Então eu supuz uma Tensão de Referência de 4.096 V que dividida por 1024
do ADC de 10 Bits da Exato 4 mV por Bit. Lógico que se há que Multiplicar
por 4 para obter a tensão em mV

Daí as duas Instruções RLF Faltou é bem verdade esclarecer que é Word,
Rotacionar para a Esquerda o Word duas vezes.

Para "converter" para Volts no Display não há necessidade de Cálculo, basta apenas
deslocar o Ponto Decimal Ex.: 4096 mv 4.096 V

-- Conforme ja coloquei aqui no Forum em outro Tópico.
O Humano julga pelo deslocamento do DP que esta sendo Multiplicado ou Dividido por 10
(Coisa de Cinema rs )


DJ
Avatar do usuário
msamsoniuk
Dword
 
Mensagens: 2935
Registrado em: 13 Out 2006 18:04

Mensagempor Jozias del Rios » 07 Dez 2009 21:14

vtrx escreveu:Desafio esquisito,usando muls sabendo-se que em ASM usa-se abaixo de µs...


Errr... PIC16F* não tem MUL
logo não é esquisito
;-)
Os vencedores são aqueles que sabem o que fazer se perderem.
Os perdedores são aqueles que não sabem o que fazer se ganharem.
Avatar do usuário
Jozias del Rios
Byte
 
Mensagens: 279
Registrado em: 31 Out 2009 03:36
Localização: SJCampos-SP

Mensagempor Djalma Toledo Rodrigues » 07 Dez 2009 21:22

Marcelo Samsoniuk escreveu:...jah comeca que normalmente as tensoes de referencia sao 5V, 3.3V ou qq coisa que *nunca* vai ser 2^n para vc resolver a vida assim facil ...


Existe Componentes para Referência de ADC de 1.024 V / 2.048 V / 4.096 V

http://www.farnellnewark.com.br/cismref ... 0,643.aspx

http://focus.ti.com/lit/ds/symlink/lm4040d82.pdf

.
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22

Mensagempor Jozias del Rios » 07 Dez 2009 21:27

Djalma Toledo Rodrigues escreveu:Então eu supuz uma Tensão de Referência de 4.096 V que dividida por 1024 do ADC de 10 Bits da Exato 4 mV por Bit. Lógico que se há que Multiplicar por 4 para obter a tensão em mV


Então vamos relançar um novo desafio para o DJ!! dessa vez eu aposto R$ 20!! Para o mesmo PIC16F* com no máximo 1ms @ 1MIPs e sem usar os truques matemáticos que já foram postados por outros membros se não o próprio DJ.

Seja um conversor ADC do PIC que cospe resultados em dois registradores ADCH e ADCL (formando uma word de 16 bits), sendo o valor de 0 à 4095 (isto é, conversor 12 bits) e a referência está calibradíssima em 4.096V.

Quero que ele converta o par ADCL e ADCH em quatro valores ASCII (pode ser?) que correspondem ao valor da tensão lido.

Por exemplo, se a tensão é 3.5000V então:
ADCH = 0x0D
ADCL = 0xAC

Como você (DJ) faz esses dois valores "virarem" os digitos '3', '5', '0' e '0' necessários a serem mostrados no display futuramente?
Os vencedores são aqueles que sabem o que fazer se perderem.
Os perdedores são aqueles que não sabem o que fazer se ganharem.
Avatar do usuário
Jozias del Rios
Byte
 
Mensagens: 279
Registrado em: 31 Out 2009 03:36
Localização: SJCampos-SP

Mensagempor Jozias del Rios » 07 Dez 2009 21:40

vtrx escreveu:Olha um desafio bom, implemente a rotina erquivalente num DSPIC,mais eficaz(pois a citada fica lenta) em C doque o DSPIC pode fazer:

Código: Selecionar todos
float velocidade = 1500;
long int k=0;
float perfil_vel=0;
float ciclo=20000000;

for (k=0;k<=555555;k++)
{
perfil_vel[k] = velocidade/ciclo*k;
}



Código: Selecionar todos
float velocidade = 1500;
long int k=0;
float perfil_vel=0;
float ciclo=20000000;

perfil_vel[0] = velocidade/ciclo;

for (k=1;k<=555555;k++)
{
perfil_vel[k] = perfil_vel[k-1] + perfil_vel[0];
}


e possibilidade de se fazer um pouco de loop unrolling!
Os vencedores são aqueles que sabem o que fazer se perderem.
Os perdedores são aqueles que não sabem o que fazer se ganharem.
Avatar do usuário
Jozias del Rios
Byte
 
Mensagens: 279
Registrado em: 31 Out 2009 03:36
Localização: SJCampos-SP

Mensagempor Djalma Toledo Rodrigues » 07 Dez 2009 21:58

Jozias del Rios escreveu: ... Então vamos relançar um novo desafio para o DJ!! dessa vez eu aposto R$ 20!! Para o mesmo PIC16F*

Desculpe mas, não estou interessado em desafio

DJ
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22

Mensagempor Jozias del Rios » 07 Dez 2009 22:17

nem em R$ ???
Os vencedores são aqueles que sabem o que fazer se perderem.
Os perdedores são aqueles que não sabem o que fazer se ganharem.
Avatar do usuário
Jozias del Rios
Byte
 
Mensagens: 279
Registrado em: 31 Out 2009 03:36
Localização: SJCampos-SP

Mensagempor Djalma Toledo Rodrigues » 07 Dez 2009 22:22

Detesto jogo , apostas, além do mais, Jozias del Rios, seria desvirtuar o Fórum.
Não é mesmo ?

DJ
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22

AnteriorPróximo

Voltar para PIC

Quem está online

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

cron

x