Ir ao conteúdo

PIC Transformar entrada bit para saída em um codificador


Ir à solução Resolvido por 1hsouza1,

Posts recomendados

Postado

Pessoal gostaria de transformar a entrada dos botões nos pinos B para um codificador, estou com 2 problemas:

O 1° é que eu fiz variáveis separadas a, b, c, d, e . Logo depois preciso junta-las e converter para decimal

O 2° problema é que eu preciso converter na porta C na forma output_c(0x..) ; Que não faço a menor ideia em como fazer isso !

Meu código ficou da seguinte forma:

 

#include <16F877A.h>
#device adc = 8
#use delay(clock = 20MHz)
#include <lcd.c>

int a, b, c, d, e, decimal;

void main(void){
   lcd_init();
     
   while(TRUE){
      
      if(input(PIN_B0) == 1){
         a = 1;
      }else{ a = 0;}
      
      if(input(PIN_B1) == 1){
          b = 1;
      }else{ b = 0; }
      
      if(input(PIN_B2) == 1){
         c = 1;
      }else{ c = 0;}
      
      if(input(PIN_B3) == 1){
         d = 1;
      }else{ d = 0;}
      
      if(input(PIN_B4) == 1){
         e = 1;
      }else{ e = 0;}
      
      //decimal = a, b, c, d; junta esses bits e converte em decimal 
      printf(lcd_putc,"\fBINARIO = %u%u%u%u%u \nDECIMAL = %u"a, b, c, d, e, decimal);
      delay_ms(200);
      
      output_c(0x07); // aqui preciso imprimir o decimal (substituir o 0x07 pelo decimal como exemplo)
   }
}

 

 

1.gif

  • Membro VIP
Postado

Basta ler direto do port amigo

b=PORTB; // veja como seu compilador lê o byte todo da porta

e depois escrever no display cada bit. Usando sua desconhecida  função (caso ela sinistramente tenha funcionado):

printf(lcd_putc,"\fBINARIO = %u%u%u%u%u \nDECIMAL = %d",(b>>4)&1,(b>>3)&1,(b>>2)&1,(b>>1)&1,(b>>0)&1, b);

 

Obs.. testei...

// Online C compiler to run C program online
#include <stdio.h>

int main() {
    unsigned char b=0xaa;
    // Write C code here
    printf("Hello world\n");
    printf("\fBINARIO = %u%u%u%u%u \nDECIMAL = %d",(b>>4)&1,(b>>3)&1,(b>>2)&1,(b>>1)&1,(b>>0)&1, b);
    
    return 0;
}

em...

https://www.programiz.com/c-programming/online-compiler/

😉

e pra escrever no port c , você deve descobrir como seu compilador escreve o byte todo no port

output_c(b); // seria só isso! (?)

🙃

  • Membro VIP
Postado
3 minutos atrás, 1hsouza1 disse:

na compilação em C funcionou, porém em CCS C compiler para microcontroladores não funcionou ! 

Isso é muito pouca informação pro meu tico e teco processar meu querido. Fale+.. muito+.. E se achou que ctrl-c ctrl-v ia resolver sua vida, receba um cóqui virtual, ok?. Além do + , releia isso..

7 horas atrás, .if disse:

sua desconhecida  função (caso ela sinistramente tenha funcionado)

13 horas atrás, 1hsouza1 disse:

printf(lcd_putc,"\fBINARIO = %u%u%u%u%u \nDECIMAL = %u"a, b, c, d, e, decimal);

Sua função tá muito lôka pro padrão c que conheço, ok? nunca vi printf desta forma. Talvez só mesmo no seu compilador doidão.

 

Ah e desculpe a demora em responder 😁

  • Membro VIP
Postado

Desculpe minha burrice mas tá meio confuso pra mim. Se me permite vou passar uma quantidade de informação proporcional às do seu retorno: em c puro dá pra fazer com struct, unions, campos de bit e afins (google it).

 

Mas vou quebrar seu galho e te mostrar uma outra maneira manêra de distribuir os bits numa variável (considerando que a...e são char e o bit0 é o dado)

_byte=(a<<4) | (b<<3) | (c<<2) | (d<<1) | (e<<0);

 

Tem compilador pra mc que facilita pra nós: dá pra escrever o bit direto no pino. P.ex. distribuir os bits em pinos diferentes:

15 horas atrás, 1hsouza1 disse:

Ex: a = 1, b = 0, c = 0, d = 1, e = 1; 

RB0=a; RC2=b; RA1=c; RD7=e;

E claro o mesmo princípio para o mesmo port.

De novo, descubra como seu compilador escreve direto no port ou no pino. São várias formas...

b=1;

digitalwrite(pino,b);

output(pino,b);

pino=b; //esta é a + inteligente

😁

  • Membro VIP
Postado
1 hora atrás, 1hsouza1 disse:

Obrigado !

Disponha.

Já que publicou o fonte dúvida, publique também o fonte solução. Além de agregar conhecimento ao forum, pode ajudar quem tiver dúvida semelhante no futuro.

1 hora atrás, 1hsouza1 disse:

funcionou 100% da forma que eu quero ! 👍

 

  • Solução
Postado

@.if

#include <16F877A.h>
#device adc = 8
#use delay(clock = 20MHz)
#use fast_io(b)
#include <lcd.c>

unsigned int8 a, b, c, d;   
byte decimal;

void main(void){
   lcd_init();
   
   while(TRUE){
      
      if(input(PIN_B0) == 1){
         a = 1;
      }else{ a = 0; }
      
      if(input(PIN_B1) == 1){
          b = 1; 
      }else{ b = 0;}
      
      if(input(PIN_B2) == 1){
         c = 1;
      }else{ c = 0; }
      
      if(input(PIN_B3) == 1){
         d = 1; 
      }else{ d = 0; }
                                    
      decimal = (a<<3)|(b<<2)|(c<<1)|(d<<0);
            
      output_c(decimal);
            
      printf(lcd_putc,"\fBINARIO = %u%u%u%u  \nDECIMAL = %u"a, b, c, d, decimal);
      delay_ms(200);
            
   }
}

 

 

1726681687_gifdecodificador2.gif

  • Membro VIP
Postado

Bacana que autosolucionou o problema. Pra quem achar que conectar a chave direto no display seria mais óbvio, permita-me observar que a ideia foi criar algum tipo de controle, monitoramento e condicionamento processado dos dados foi muito válida.

Permita-me também o registro abaixo que daria o mesmo resultado

a=input(PIN_B0);

b=input(PIN_B1);

c=input(PIN_B2);

d=input(PIN_B3);

Mas claro pode ficar pra sua fase seguinte. Por hora... parabéns pela sua autosolução 😉

 

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...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!