Ir ao conteúdo
  • Cadastre-se

Como colocar saida em forma BCD


arh

Posts recomendados

pessoal tenho um projeto aqui que é basicaemnte o pic recebendo um sinal no canal AD e depois apresentar em um display duplo de 7 seg. através de um ci cd4543 segue ai o esquema do projeto. 1lDm9YB.jpg

a ideia do programa é assim

iniciar

receber sinal do canal ad

gravar valor em uma variavel

colocar saidas os valores, em forma de BCD.

segue o codigo: + / -

#include <16f877a.h> 

#device adc = 10
#fuses HS, nowdt,noprotect,nolvp

#use delay (clock = 10000000)
#use fast_io(a)
#use fast_io(
#use fast_io(c)
#use fast_io(d)
#define deci 0.02

void main()
{
float a;
int16 valor_1, valor_2, valor_3; // valor_2 é pra casa decimal.
set_tris_a (0xff);
set_tris_b (0x00);
set_tris_c (0xff);
set_tris_d (0xff);
setup_adc_ports(all_analog);
setup_adc(adc_clock_div_32);
enable_interrupts(global);

while(1)
{
set_adc_channel(1);
delay_us(40);
valor_1 = read_adc(); // aqui recebe do canal ad

a = 0.02 * valor_1 ; // aqui faz uma conversao para o que preciso

valor_3 = a; // armazena o valor a variavel

valor_2 = (a*100)-valor_3*(100); // aqui faz uma conversao para pegar o numero decimal e transformar em valor inteiro.


/*
o problema é que nao sei como colocar as saidas agora.
por exemplo o display 1 iria ficar com o valor da variavel (valor_3)
e o display 2 com o valor da variavel (valor_2)

por exe: digamos que o valor da variavel (valor_3 = 7) em BCD seria 0111
e digamos que o valor da variavel (valor_2 = 3) em BCD seria 0011

como jogaria isto na saida do pic?

*/
}
}

nao sei se deu pra explicar direitinho.

abraço a todos.

Link para o comentário
Compartilhar em outros sites

o problema é que fui burro e comprei anodo comum, ai eu economizaria nos pinos mas gastaria no espaço pois precisaria de varios transistores para operar como chave. e varios resistores.

mas se daqui um tempo eu nao conseguir o que quero vou refazer o hardware e colocar um display lcd que tenho aqui que vai ser BEM mais fácil.

Link para o comentário
Compartilhar em outros sites

arh.... Vi sua duvida, mas não entendi muito bem, o que você quer é gravar os valores de duas variáveis no mesmo port (dividindo entre o nible mais significativo e o menos significativo do port para cada variável), é isso??

Não manjo muito de CCS mas em mikroC eu gravaria o primeiro valor e depois rotacionaria e somaria o segundo valor, tipo assim:


char decimal, unidade;

portb=decimal; //grava o valor da casa decimal
portb=(portb<<4); //joga os 4 bits do decimal para o nible menos significativo
portb=port&unidade; //soma bit a bit com o valor da unidade

Para deixar o valor da unidade em 4 bits (mais significativos) basta você girar para um lado e depois para o outro, tipo assim:


unidade=(unidade<<4); //joga os menos significativos fora ficando 0bxxxx0000
unidade=(unidade>>4); //volta os 4 bists para a posição mais significativa 0b0000xxxx

Assim o portb ira ficar com o valor do decimal 0b0000xxxx

ai voce rotaciona: 0bxxxx0000

e soma a unidade bit a bit (logica AND): 0bxxxx0000 & 0b0000xxxx

e o resultado: 0bxxxxxxxx

Decimal no Nibble menos significativo (RB4 a RB7), e unidade no nibble mais significativo(RB0 a RB3)

Se quiser inverter a posição do decimal com a unidade, basta gravar a unidade primeiro e depois somar o decimal...

Pela logica AND onde tiver 1 vai ser sempre um, como o nibble menos significativo da unidade vai ser sempre 0 nai vai alterar o valor da suas casas decimais....

PS: Usei "x" para representar os bits da variável (estou esclarecendo isso porque na eletrônica digital x significa irrelevante, o que não é o caso!!!)...

Como eu disse isso seria no MikroC, não sei como o Operador shift L/R ( ou rotary) trabalha no CCS, mas creio que deve ser igual...

(Avise se der certo....hehe)

Espero ter ajudado...

Grato Luiz Gustavo.

Link para o comentário
Compartilhar em outros sites

Calma .... se comprou display de anodo comum e quiser fazer multiplex é só fazer isto :

- O transistor vai ser PNP, e ligado entre o +5V e o anodo do display. Tipo BC557.

- Quando voce quiser acionar o transistor do display, vai ter de mandar nivel 0 .

- E os segmentos que voce quiser acender, tem de mandar também nivel 0, ou seja, inverta o byte que voce enviaria se fosse catodo comum.

Simples !

Paulo

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

aphawk

então parceiro, tudo tranquilo?

na parte de hardware eu nao tenho dificuldades, ja pensei nos transistores e tudo mais.

mas o problema que ai eu teria que ter varios transitores e dezenas de resistores.

e iria ocupar MUITO espaço, e o hardware ja esta montado como no esquema.

acredito que com a logica do luiz ja irie conseguir, so estou sem tempo aqui pra mexer no projeto.

aphawk o uC é capaz de drenar corrente necessária ai pra ligar leds?

pois no caso ai ele teria que drenar a corrente vinda dos display.

ou voce esta sugerindo um transistor pra cada pino do display?

Link para o comentário
Compartilhar em outros sites

acredito entre o +5v e o anodoé o que esta escrito!!

acredito entre o +5v e o anodo do display!!

naquele site existe o codigo nos videos em espanhol também falando sobre bit abit << >> deslocameto a esquerda adireita

é nos videos microcontroladores basicos e avançados!! fala coisas legais ao respeito...

Link para o comentário
Compartilhar em outros sites

nao use 8 portas...

use 6, faca os 2 displays alternarem na saida do pic bem rápido que eles ficam acesos(piscando estão rápido q parecem q estão acesos)

aqui segue um esqueminha pra você

sqoo.png

tipo assim vei

CBLOCK 0x20 ;Endereço inicial da memória

flag1

display_alterna

ENDC

#DEFINE porta_unidade_dezena FLAG1,0

#DEFINE gate_transistor_unidade PORTx,0

#DEFINE gate_transistor_dezena PORTx,1

display_muda

DECFSZ display_alterna ;contador para alternar entre unidade e dezena

RETURN

MOVLW d'10'

MOVWF display_alterna ;contador para alternar entre unidade e dezena

BTFSC porta_unidade_dezena ;bit que checa se esta acionado display da unidade ou dezena

goto $+5 ;esta acionado dezena, vai acionar unidade

BSF porta_unidade_dezena ;esta acionado unidade então vai acionar dezena

BCF gate_transistor_unidade ;limpa bit que aciona o gate da unidade

BSF gate_transistor_dezena ;seta bit que aciona o gate da dezena

RETURN

BCF porta_unidade_dezena ;esta na acionado dezena então vai acionar unidade

BCF gate_transistor_dezena ;limpa bit que aciona o gate da dezena

BSF gate_transistor_unidade ;seta bit que acina o gate da unidade

RETURN

Link para o comentário
Compartilhar em outros sites

aphawk

então parceiro, tudo tranquilo?

na parte de hardware eu nao tenho dificuldades, ja pensei nos transistores e tudo mais.

mas o problema que ai eu teria que ter varios transitores e dezenas de resistores.

e iria ocupar MUITO espaço, e o hardware ja esta montado como no esquema.

acredito que com a logica do luiz ja irie conseguir, so estou sem tempo aqui pra mexer no projeto.

aphawk o uC é capaz de drenar corrente necessária ai pra ligar leds?

pois no caso ai ele teria que drenar a corrente vinda dos display.

ou voce esta sugerindo um transistor pra cada pino do display?

Fala ARH, beleza ?

Tranquilo aqui.... seguinte, voce só vai usar dois transistores , para selecionar qual dos displays vai acender, e coloque apenas um resistor para dar uma limitada de corrente entre as saídas do pic e os segmentos dos displays. Se voce calcular o resistor para uma corrente de cerca de 20 mA por segmento, vai totalizar 140 mA, que está bem tranquilo para o PIC. Se me lembro bem , eles suportam 200 mA

Se ligar igual ao que o amigo PATOASSADO sugeriu, sem os resistores, também funciona porque os pics tem limitação de corrente, mas a vida útili do PIC será muito menor, e logo podem falhar pinos aleatórios dele.

Para calcular o resistor, sugiro assim :

Perda no transistor VCEsat : 0,3 Volts

tensão do led vermelho = 1,7 volts

Portanto R = ( 5-0,3-1,7)/0,020 = 3/0,02 = 150 OHMS

E para acionar a base do transistor, use um resistor de 4K7 que tá de bom tamanho.

Resumindo , voce vai precisar disto aqui :

- 2 BC557

- 2 resistor 4K7

- 7 resistor 150 ohms

- 2 displays de 7 segmentos.

Paulo

Link para o comentário
Compartilhar em outros sites

Conseguiiiiiiiii.

bom, como ja disse antes o hardware ja esta montado, caso nao ai partiria para a idiea da multiplex...

irmão LuizGBarrio desde o começo a ideia do programa era seguinda a sua linha de raciocínio so que esto mei enferrujado e seu post foi fundamental valeu irmão.

Pela logica AND onde tiver 1 vai ser sempre um,

na verdade a logica que faz isto é a OR

segue aqui parte do programa.

void main()
{
float a;
int saida, valor_2a;
int16 valor_1, valor_2, valor_3; // valor_2 é pra casa decimal.
set_tris_a (0xff);
set_tris_b (0x00);
set_tris_c (0xff);
set_tris_d (0xff);
setup_adc_ports(all_analog);
setup_adc(adc_clock_div_32);
enable_interrupts(global);

while(1)
{
set_adc_channel(1);
delay_us(40);
valor_1 = read_adc();
//valor_1 = 210; // aqui foi o teste.
a = 0.02 * valor_1 ;
valor_3 = a;
valor_2 = (a*10)-valor_3*(10);
saida = valor_3;
saida = (valor_3<<4);
saida = (saida | valor_2);

output_b (saida);

delay_ms(500);


}
}

agora é so colocar uns IF pra fazer umas coisinhas a mais, mas a ideia principal ja esta OK. VALEU a todos ai.

grande aphawk dessa vez nao deu pra fazer multiplexado mas futuramente irei fazer, e me veio uma duvida aqui no caso da drenagem, no caso ai como fica configurado o TRIS ?

abraço.

Link para o comentário
Compartilhar em outros sites

ARH.... Valeu por avisar do erro.... Parece que também estou meio enferrujado... :P

Fico feliz que tenha dado certo para você, é muito gratificante ver uma pessoa superar um obstaculo e ainda mais com a nossa ajuda....

Qualquer coisa estamos ai ...hehe.... XD

Grato Luiz Gustavo.

Link para o comentário
Compartilhar em outros sites

  • 6 anos depois...
  • Membro VIP

Um que precisa de apenas um de ajuste é o

MAX7219-pinout-datasheet.gif

 

Voltando ao seu, permita-me... Se já tens tal ci, penso que pra sua idade, não compensa fazer esta economia🐖. Sim precisa dos R's mas...

 

Há quem coloque apenas um resistor...

pu_6PaGbJgHsW17ACWJ_OsO84NOfJ0V0t9mFHak4

 

Também há os que colocam algo como uma fonte de corrente...

s201181961817247.gifpra tentar equilibrar o brilho

 

E há quem não coloque resistor algum mas tem um controle absoluto da largura do pulso aplicada a cada segmento. Mas como ninguém em sã consciência faz isso, ainda não há histórias de desenhos disso na net

 

Link para o comentário
Compartilhar em outros sites

@Juliano Lopes Ciecielski ,

 

Bom... não sei se você previu ou não usar resistores kkkkkkkkkk mas creio que foi um daqueles famosos erros do corretor do celular .... enfim :

 

Já ví usarem esse CI sem nenhum resistor limitador de corrente, desde que alimentado com 5V.

 

O circuito controlava o brilho de uma maneira curiosa : os Leds iam ligados à saída de um LM317 que regulava a tensão de saida entre 1,5 a 5 V.

 

Esse tipo de ligação funciona porque esse CI tem uma saída híbrida, ele pode alimentar vários tipos de displays de tecnologias diferentes, mas existe dentro algum tipo de limitador embutido, pode-se observar a curva de sink de corrente no Datasheet e percebe-se que será em torno de 5mA em cada segmento para 5V de alimentação.

 

Como no Datasheet nada é falado sobre a necessidade de se limitar a corrente externamente, alguns na prática usam dessa maneira.

 

Paulo

 

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário 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 comunidades 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

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!