exibir valor em 5 display

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

exibir valor em 5 display

Mensagempor cristian » 07 Dez 2009 11:56

galera veja se meu raciocionio esta certo

tenho 5 display onde vou exibir valores tipo 12.658

como faço para distribuir nos 5 display pensei no seguinte

d5=12658/10000 d5=1
d4=2658/1000 d4=2
d3=658/100 d3=6
d2=58/10 d2=5
d1=8 d1=8


esta certo ?????
cristian
Word
 
Mensagens: 570
Registrado em: 03 Nov 2006 08:15
Localização: serrinha-ba

Mensagempor Juliana Mariana » 07 Dez 2009 12:57

Se suas variaveis "d" forem do tipo inteiro, acredito q de certo.
Juliana Mariana
Bit
 
Mensagens: 10
Registrado em: 18 Ago 2009 10:09

Mensagempor ze » 07 Dez 2009 13:09

que tal...

dado=12658;
unsigned int dmil,mil,cen,dez,un;
dmil=dado/10000;
mil=(dado-dmil*10000)/1000;
cen=(dado-dmil*10000-mil*1000)/100;
dez=(dado-dmil*10000-mil*1000-cen*100)/10;
un=dado-dmil*10000-mil*1000-cen*100-dez*10;

...de nada...
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor Jozias del Rios » 07 Dez 2009 13:12

Isso aí!

Boa sorte nas divisões por 10^n. Tomare que vc faça isso em C, pq fazer em ASM dá um trabalho.. hehe

Normalmente se faz a divisão sucessiva por 10 apenas e aproveita-se o resto para indicar o algarismo e o quociente para o próximo digito

por exemplo:

12658 / 10 .... quociente = 1265, resto = 8 (push '8')
1265 / 10 .... quociente = 126, resto = 5 (push '5')
126 / 10 .... quociente = 12, resto = 6 (push '6')
12 / 10 .... quociente = 1, resto = 2 (push '2')
1 / 10 .... quociente = 0, resto = 1 (push '1')

quando o quociente é zero, para-se o processo.
E então exibe-se os digitos na ordem inversa com que foram obtidos.
Não sei se o seu compilador seria inteligente para aproveitar o resto e o quociente de uma mesma divisão... depende também do algoritmo que ele vai usar para realizar a divisão, se gera resto ou não. Mas o seu jeito não está errado, mas envolve divisões por diferentes valores e multiplicação pelos mesmos valores diferentes => código maior! enquanto a abordagem que eu indiquei, mais usada, é um loop.

Tem algoritmos mais específicos par PIC capazes de fazerem isso, com um método de divisão longa que faz tudo bonitinho. Talvez isso esteja implementado em alguma biblioteca do seu compilador (por exemplo no sprintf)...
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 msamsoniuk » 07 Dez 2009 13:22

eu fiz uma simulação disso em awk e ficou assim:

awk 'BEGIN { v=12658; k=10000; while(k) { d=int(v/k)%10; k=int(k/10); print d } }'

1
2
6
5
8

mas tem 3 divisoes... se vc fizer diferente:

awk 'BEGIN { v=12658; while(v) { print v%10; v=int(v/10); } }'

8
5
6
2
1

vc consegue fazer com apenas 2 divisoes, porem os numeros sao gerados na ordem contraria, pelo que seria necessario armazenar para inverter o conteudo. uma alternativa eh usar recursividade:

awk 'function f(v) { if(v) { d[v]=v%10; f(int(v/10)); print d[v] } } BEGIN { f(12658) } '

1
2
6
5
8

mas o desperdicio de espaco em stack de chamar uma funcao recursivamente meio que nao vale a pena, ficando pior que o segundo caso. se vc nao tem 5 bytes para gastar, entao eh melhor fazer as 3 divisoes.
Avatar do usuário
msamsoniuk
Dword
 
Mensagens: 2935
Registrado em: 13 Out 2006 18:04

Mensagempor Djalma Toledo Rodrigues » 07 Dez 2009 13:43

Jozias del Rios escreveu:Isso aí! Boa sorte nas divisões por 10^n. Tomare que vc faça isso em C, pq fazer em ASM dá um trabalho.. hehe
...

Ah dá e como dá

Da tanto trabalho que em ASM simplesmente se 'pega' o Digito converte via tabela abcdefg (dos 7 segmentos) e manda o Byte pro Mux

Ufa!! que trabalho que deu.

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

Mensagempor Jozias del Rios » 07 Dez 2009 13:57

Djalma Toledo Rodrigues escreveu:
Jozias del Rios escreveu:Isso aí! Boa sorte nas divisões por 10^n. Tomare que vc faça isso em C, pq fazer em ASM dá um trabalho.. hehe
...

Ah dá e como dá

Da tanto trabalho que em ASM simplesmente se 'pega' o Digito converte via tabela abcdef (dos 7 segmentos) e manda o Byte pro Mux

Ufa!! que trabalho que deu.

DJ


O problema é justamente esse verbo aí... 'pega'...

Te lanço um desafio: dou R$ 10,00, e quem quiser pode apostar mais...
desafio é fazer esse lance que ele precisa em ASM, que seja fácil, sem dar trabalho, sem complexidade...

input: um numero unsigned de 16 bits, por exemplo 12658 que é 0x3172
output: dígitos em ASCII, por exemplo '1', '2', '6', '5', '8'

Como estamos no fórum de PIC, que seja em ASM de PIC e o mais comum, série 16F...

então suponha que o número esteja em um register file:

Código: Selecionar todos
cblock 0x20

input_value : 2
output_digits : 5

endc


como vc faz a conversão desse jeito que não dá trabalho ao programador?

[/ironymode]
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 14:17

obs: limitado á 1ms de tempo de execução, rodando à 1MIPs
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 msamsoniuk » 07 Dez 2009 14:20

dificil fazer em 10 minutos em assembler... ainda pior se for fazer em asm em um processador sem multiplicacao e divisao! ateh eh possivel, mas sem registro de 32 bits fica bem tora o negocio...imagina expandir isso ae usando carry? eh nessas horas que a gente ve como faz diferenca um processador 32 bits com instrucao de divisao e multiplicacao! :)

Código: Selecionar todos
void f(int i)
{
    unsigned int j,k;
    if(i)
    {
        f(j = (i + (i<<3) + (i<<4) + (i<<7) + (i<<8) + (i<<11) + (i<<12))>>16);
        putchar(i-((j<<1)+(j<<3))+'0');
    }
}

int main()
{
    f(0x3172);
}
Avatar do usuário
msamsoniuk
Dword
 
Mensagens: 2935
Registrado em: 13 Out 2006 18:04

Mensagempor Djalma Toledo Rodrigues » 07 Dez 2009 14:23

Jozias del Rios escreveu: ... O problema é justamente esse verbo aí... 'pega'...

Te lanço um desafio:
input: um numero unsigned de 16 bits, por exemplo 12658 que é 0x3172


Pô como vocês "cansam a minha beleza" ( Depois daquela da Juliana ... )

Hexadecimal e representação.

Dentro do µC, ou do µP, é tudo Binário , Bináááriooo.

Em BCD um Byte contem 2 digitos "coladinhos" --- Des_Niblando ...

UFA!

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

Mensagempor vtrx » 07 Dez 2009 14:25

Então,existe PROGRAMADORES e programadores.
Faz isso em basic que não da trabalho...
ASM é muito 'trabalhoso' para isso,'...procure em alguma bibliotec...'
Avatar do usuário
vtrx
Dword
 
Mensagens: 2240
Registrado em: 20 Abr 2008 21:01

Mensagempor msamsoniuk » 07 Dez 2009 14:31

opa! mas dae vc deu um oleh no "desafio" hein! :)

suponha que vc tem a aquisicao de um AD de 16 bits e chega para vc o 0x3172, mas o cara quer que mostre no display um "12658" bonitinho... eu nao vejo forma de sair desse 0x3172 e extrair os digitos separadamente para passar para ascii sem passar por uma conversao de base, o que acaba caindo em divisao por 10.

mas se complicar demais vc sempre pode jogar a toalha e apelar para um printf("%d",0x3172) ;D hehehe

Djalma Toledo Rodrigues escreveu:
Jozias del Rios escreveu: ... O problema é justamente esse verbo aí... 'pega'...

Te lanço um desafio:
input: um numero unsigned de 16 bits, por exemplo 12658 que é 0x3172


Pô como vocês "cansam a minha beleza" ( Depois daquela da Juliana .. )

Hexadecimal e representação.

Dentro do µC ou do µP é tudo Binário , Bináááriooo.

Em BCD um Byte contem 2 digitos "coladinhos" --- Des_Niblando ...

UFA!

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

Mensagempor ze » 07 Dez 2009 14:38

a djalma está confundida e adiantada. estes dados (bytes) só serão pegos depois de separados amiga. aí sim pode indexar a tabela. mesmo assim em c fica + fácil e o compilador tende a deixar = ao asm

mas juntando minha mente doentia com a mente diabólica do m.sansung óçó o trabaião que deu prum pic16f876:

com o algoritimo

Código: Selecionar todos
unsigned int dmil,mil,cen,dez,un;
dmil=dado/10000;
mil=(dado-dmil*10000)/1000;
cen=(dado-dmil*10000-mil*1000)/100;
dez=(dado-dmil*10000-mil*1000-cen*100)/10;
un=dado-dmil*10000-mil*1000-cen*100-dez*10;

ficou:
Código: Selecionar todos
Summary:
    Program space        used   17Fh (   383) of  2000h words   (  4.7%)
    Data space           used    19h (    25) of   170h bytes   (  6.8%)

com o do sansonic:

Código: Selecionar todos
#define un s[0] //só pra melhor identificar em alguma função
#define dez s[1]
#define cen s[2]
#define mil s[3]
#define dmil s[4]
unsigned int s[5]; //global
void separa(unsigned int dado)
{
unsigned char i=0;
while(dado)
   {
   s[i]=dado%10;
   dado/=10;
   i++;
   }   
}

ficou:
Código: Selecionar todos
Summary:
    Program space        used    8Dh (   141) of  2000h words   (  1.7%)
    Data space           used    14h (    20) of   170h bytes   (  5.4%)


+ enxuto ainda. parabens m.semsunga! cabrão! (cabra bão)

editei pra num causar + raiva da minha animação: acho que o dj precisa se achar (no bom sentido amigo. no sentido de estar perdido, entende?)
com calma tu entra nos eixos
Editado pela última vez por ze em 07 Dez 2009 14:52, em um total de 1 vez.
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor Djalma Toledo Rodrigues » 07 Dez 2009 14:43

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
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22

Mensagempor cristian » 07 Dez 2009 15:33

o display é lcd

ja converto o valro ADC para 5000

passo mais detalhes a noite
cristian
Word
 
Mensagens: 570
Registrado em: 03 Nov 2006 08:15
Localização: serrinha-ba

Próximo

Voltar para PIC

Quem está online

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

x