Projeto com encorde PIC16F877A e BCD - AJUDA

Started by otton, 12 de December de 2013, as 21:02:07

Previous topic - Next topic

otton

**
Freqüente
Posts: 362
rock in roll
  1. ottonguilherme@hotmail.com
Location: linhares
Logged
Pessoal :tup

Meu professor de sistemas digitais me passou um trabalho utilizando encoder.
O problema é o seguinte: quando eu girar o encoder no sentido horário tenho que incrementar uma variável e se girar no sentido anti-horário tenho que decrementar a mesma. Se o valor da variável for maior que 100 ou menor que 0 tenho que acender um led de aviso.

Até aqui já fiz o programa e o professor disse que está beleza mas ai que surge o problema: ele quer que eu mostre o valor da variável utilizando os BCD's da bancada, mas não tenho ideia de como vou fazer isso  )>| )>|.
Se vocês puderem ajudar fico grato.

Estou utilizando o programa MPLAB, o compilador HI-TECH e o PIC16F877A para fazer o código fonte, que seque abaixo:
[spoiler]
int RODA = 50;
int A = 1;
int B = 1;

void main(void) {
    TRISB4 = 1;
    TRISB5 = 1;
    INTCON = 0;
    TRISB0 = 0;
    TRISD0 = 0;
    RBIE = 1;
    GIE = 1;
   
    while (1);
}

void interrupt Bayblade(void) {
    RBIF = 0;

    if ((A == 1) && (B == 1)) {

        if ((RB4 == 0) && (RB5 == 1)) {
            RODA++;
         
            if (RODA > 100) {
                RD0 = 1;
            }
        }


        if ((RB5 == 0) && (RB4 == 1)) {
            RODA--;

            if (RODA < 0) {
                RD1 = 1;
            }
        }
    }
    A=RB4;
    B=RB5;
}[/spoiler]

xformer

Administrator
******
DIY Freak
Posts: 6,393
e^(i x pi)+1=0
Logged
O que você quer dizer com "BCD´s da bancada" ?
O que se escreve com "facilidade" costuma ser lido com dificuldade pelos outros. Se quiser ajuda em alguma coisa, escreva com cuidado e clareza. Releia sua mensagem postada e corrija os erros.

otton

**
Freqüente
Posts: 362
rock in roll
  1. ottonguilherme@hotmail.com
Location: linhares
Logged
xformer BCD's sao aqueles Displays que tem aqui na bancada do laboratório
são displays que mostram números de 0 a 9 cada um então vou ter que utilizar 3
mas não sei implementar isso no programa

http://en.wikipedia.org/wiki/Binary-coded_decimal
http://img2.mlstatic.com/display-led-7-segmentos-vermelho-anodo-comum-23-polegadas_MLB-O-237299430_3488.jpg


otton

**
Freqüente
Posts: 362
rock in roll
  1. ottonguilherme@hotmail.com
Location: linhares
Logged
Dexter não tive exito ao acessar o site fui direcionada pra pagina principal
quanto ao bcd e esse mesmo de 7 seguimentos na bancada só tem os 4 pinos
para ligar uma saída digital de 8 bits, a parte de conversão de binário pra decimal
já ta tudo embutido na bancada.

eu quero saber como faço no programa (os codigos que tenho que usar) para mostrar
o numero da variável no bcd pois vou ligar alguma porta de saida do pic nesse display
abraços [beer]
   

xformer

Administrator
******
DIY Freak
Posts: 6,393
e^(i x pi)+1=0
Logged
#5
Ok. O que você tem na sua bancada são conjuntos de displays acionados por decodificadores BCD para 7 segmentos (provavelmente CD4511).

BCD quer dizer Binary Coded Decimal. ou decimal codificado para binário.  Pra representar números decimais de 0 a 9 precisa de 4 bits, de 0000 a 1001.  Cada conjunto display-decodificador precisa então de 4 bits da dados.  O seu PIC vai precisar fornecer então 12 bits para 3 conjuntos display-decoder.

Sua variável RODA pode variar de 0 a 100, então o que você tem que fazer é criar 3 outras variáveis: CENTENA, DEZENA e UNIDADE e retirar da variável RODA quantas centenas inteiras ela tem, do resto das centenas, quantas dezenas inteiras e o restante vai para as unidades. Você sabe fazer isso né ?  (basta dividir RODA por 100, pegar a parte inteira e jogar na CENTENA, do resto dividir por 10, jogar a parte inteira e jogar na DEZENA e o resto jogar na UNIDADE).  Isso é básico e faz parte da teoria das bases numéricas.
Cada variável CENTENA, DEZENA e UNIDADE deve ser repassada para 4 bits de uma porta qualquer do PIC que serão ligadas aos conjuntos display-decoder, por ex. jogue a variável UNIDADE nas portas B0 a B3, DEZENA nas portas B4 a B7 e por fim CENTENA nas portas C0 a C3 (na verdade, só precisa de um bit, pois a centena não vai passar de 1, e aterrar os outros 3 bits do decoder BCD).

Só isso.
O que se escreve com "facilidade" costuma ser lido com dificuldade pelos outros. Se quiser ajuda em alguma coisa, escreva com cuidado e clareza. Releia sua mensagem postada e corrija os erros.

Dexter

Guest
Logged
O principio de funcionamento é o mesmo, a diferença é que você vai conectar somente 4 pinos do uC. Com 4 pinos/bits temos valores de 0 a 15 (0  a F), mas o BCD só reconhece os dez primeiros valores, portanto somente números.

Os "valores" são ligados aos pinos de entrada do BCD, você deve ligar (através de software) cada um dos dígitos por vez em alta velocidade (10 ms, por exemplo) assim você terá a impressão de estarem todos ligados.

Outra forma é você usar 4 bits menos significativos para representar a unidade e os 4 bits mais significativos para representar a dezena.
Nos dois casos converta o valor hexa para decimal de 2 bytes, mostre um valor por vez se usar o primeiro tipo de conexão (alternar os valores do display), ou rotacione 4 bits para esquerda o valor da dezena e faça lógica OU com a unidade e jogue para a porta, se estiver usando os 8 pinos de uma porta para ligar os BCDs.

A rotina de conversão Hexa/Decimal já existe por aí.

Esquema

http://www.cheers4all.com/2012/02/dsiplaying-two-bcd-on-one-port-of-pic16f877-2/


Rotina

http://www.piclist.com/techref/microchip/math/radix/index.htm

otton

**
Freqüente
Posts: 362
rock in roll
  1. ottonguilherme@hotmail.com
Location: linhares
Logged
valeu Dexter :tup
vou tentar aqui o trabalho e pra ser entregue na terça
ate la eu consigo vou ver se consigo gravar e mostra aqui
abraços

otton

**
Freqüente
Posts: 362
rock in roll
  1. ottonguilherme@hotmail.com
Location: linhares
Logged
Salve salve galera
venho informar que o projeto funcionou  (aplaus2)
obrigado a todos que me ajudaram