Ir ao conteúdo
  • Cadastre-se

Dúvida pic18f/proteus


Posts recomendados

Amigos,

 

comecei a programar o PIC18F4520 hoje, estou utilizando o proteus para fazer a simulação do circuito e o CCS compiler para fazer a programação em C do PIC, tive alguns problemas durante a programação, segue abaixo os códigos.

 

int main (void)
 {
   // Write your code here
   
   while (1)
      
   if (!input(PIN_B0)) {
      output_bit(PIN_D0,1);
      } else {
     output_bit(PIN_D0,0);
      }
      
      if (!input(PIN_B1)) {
      output_bit(PIN_D1,1);
      } else {
     output_bit(PIN_D1,0);
      }
      ;
   return 0;
 }  

 

--> Esse primeiro código é um simples botão(2 botões) de liga e desliga de dois LEDS separados, quando o botão está pressionado ele liga seu respectivo LED, quando não esta pressionado ele desliga o respectivo LED, neste código o que não funcionou foi a lógica do segundo botão(apesar de estar igual a lógica do primeiro botão), quando ele é apertado o LED respectivo dele não liga, alguém sabe se é erro do programação/compilador ou é alguma particularidade do PIC18F4520 que deve ser colocada no código?

 

 

int main (void)
 {
   while (1)
      
   if (!input(PIN_B0)) {
      if (output_low(PIN_D3) && output_low(PIN_D2) && output_low(PIN_D1) && output_low(PIN_D0)){
     output_high(PIN_D3);
     } else if (output_high(PIN_D3) && output_low(PIN_D2) && output_low (PIN_D1) && output_low (PIN_D0)){
        output_low(PIN_D3);
        output_high(PIN_D2);
        } else if (output_low(PIN_D3) && output_high(PIN_D2) && output_low (PIN_D1) && output_low (PIN_D0)){
           output_high(PIN_D3);
           } else if (output_high(PIN_D3) && output_high(PIN_D2) && output_low (PIN_D1) && output_low (PIN_D0)){
         output_low(PIN_D3);
         output_low(PIN_D2);
         output_high(PIN_D1);
          } else if (output_low(PIN_D3) && output_low(PIN_D2) && output_high (PIN_D1) && output_low (PIN_D0)){
            output_high(PIN_D3);
             } else if (output_high(PIN_D3) && output_low(PIN_D2) && output_high (PIN_D1) && output_low (PIN_D0)){
            output_high(PIN_D2);
            output_low(PIN_D3);
            } else if (output_low(PIN_D3) && output_high(PIN_D2) && output_high (PIN_D1) && output_low (PIN_D0)) {
               output_high(PIN_D3);
               }else if (output_high(PIN_D3) && output_high(PIN_D2) && output_high (PIN_D1) && output_low (PIN_D0)){
                  output_low(PIN_D3);
                  output_low(PIN_D2);
                  output_low(PIN_D1);
                  output_high(PIN_D0);
               }    
     }
            ;
   return 0;
 }  

 

--> A minha segunda dúvida é sobre esse código acima, ele desempenha a função de um somador-binário 4 bits utilizando LEDS, acredito que a lógica esteja certa, a minha dúvida é: ele deve somar 1 bit sempre que o botão for pressionado, porém na minha lógica estou dizendo que se o estado do botão for 1 ele deve passar por todos esses "ifs" para fazer a soma, ai então percebi que se o botão ficar pressionado esses "ifs" vão ficar sendo executados sempre, existe algum código ou biblioteca que me resolva esse problema? Sintetizando minha dúvida: se eu deixar o botão apertado ele vai estar com estado lógico 1(ligado), isso não faria meu código ficar executando todos os 'ifs' durante esse tempo que o estado lógico dele está em 1 e consequentemente deixar o somador executando em loop enquanto o botão está pressionado?

 

 

Anexei uma foto do esquemático do Proteus.

 

Fico no aguardo de uma resposta.

Att

Iago Sestrem Ochôa

Acadêmico de Engenharia de Computação

Esquemático.jpg

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

dê uma olhadela no datasheet do bixo pra ver se tal pino pode ser saída. Alguns só podem ser entrada ou coletor aberto. Neste último caso, inverta o led com anodo pro vcc.

Outra.. acho que return 0 está sobrando...

 

Pro 2° problema (não analisei a lógica toda), uma alternativa é esperar apertar e SOLTAR o pino. Algo como

while (input(PIN_B0);//aperte

while (!input(PIN_B0);//tire o dedinho do botão (!)

 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

com + calma, percebo agora que sua lógica está um pouco... digamos.. incômoda. você analisa saídas sendo que o certo é analisar entradas = botões de calculadora. No caso só vejo 2

 

Outra...

14 horas atrás, Iago Sestrem Ochôa disse:

if (output_high(PIN_D3) && output_high(PIN_D2) && output_high (PIN_D1) && output_low (PIN_D0)){
                  output_low(PIN_D3);

você condiciona PIN_D3 pelo seu próprio estado... sinistro...

Nem sei porquê analisei isso pois não vou com a cara do ccs kk

Se não fosse ccs poderia te acompanhar mais. ok? sorry.

 

Penso que é melhor você saber o que exatamente quer fazer mas não sem antes dar uns passinhos pra trás e fazer um pisca led mais... digamos... evoluído

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

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