Ir ao conteúdo
  • Cadastre-se
Brunomartins

PIC Pic 16f628a não executa o código corretamete

Recommended Posts

Olá, estou trabalhando em um projeto onde aperto um botão, o pic mande o sinal pra ponte h mandar um motor girar num sentido, atinge um sensor, o motor gira no outro sentido, e quando atinge o segundo sensor o motor volta por dois segundos, para e aguarda até que o botão seja pressionado novamente começando o cilclo novamente.

 

Estou usando o pic 16f628a

O ci de ponte h é o L293D

 

Fiz um pequeno código que funciona perfeitamente no proteus, más quando montei o circuito, o pic fez algo totalmente diferente do programado ele não estava obedecendo a função "if"

Estou aprendendo ainda a linguagem C.

Segue o código que fiz no mikro c e o esquema no proteus.

Obs.: o esquema já ta pronto pra montagem na pcb

 

 #define start RB0_bit                           // Define RB0_bit como start
 #define revert RB1_bit                          // Define RB1_bit como revert
 #define stop RB2_bit                            // Define RB2_bit como stop
 #define cc RB3_bit                              // Define RB3_bit como cc
 #define cw RB4_bit                              // Define RB4_bit como cw
 #define motor_enable RB5_bit                    // Define RB5_bit como motor_enable

 bit flagB0, flagB1, flagB2;                     // Configura as variaveis

void main()
{


 TRISB0_bit = 1;                                 // Define RB0 como entrada
 TRISB1_bit = 1;                                 // Define RB1 como entrada
 TRISB2_bit = 1;                                 // Define RB2 como entrada

 

 TRISB3_bit = 0;                                 // Define RB3 como saida
 TRISB4_bit = 0;                                 // Define RB4 como saida
 TRISB5_bit = 0;                                 // Define RB5 como saida
 
 RB3_bit = 0;                                      // Define o valor inicial de RB3 como 0
 RB4_bit = 0;                                      // Define o valor inicial de RB4 como 0
 RB5_bit = 0;                                      // Define o valor inicial de RB5 como 0

  for(;;)                                                // Loop Infinito
  {
  if ((start == 1) && (flagB0 == 0))               // Se o botao start for pressionado, verifica se a flagB0 esta em "0"
     {
      delay_ms(50);                                       // Delay de para reduzir o bounce
       if ((start == 1) && (flagB0 == 0))          // Verifica se o botao start continua pressionado e se a flagB0 continua em "0"
       motor_enable = 1;                                // Habilita o motor
       cc = 1;                                                  // Coloca o pino "RB3" em nivel logico alto
       cw = 0;                                                 // Coloca o pino "RB4" em nivel logico baixo
       flagB0 = 1;                                           // Define a flagB0 em "1"
       flagB2 = 0;                                           // Define a flagB2 em "0"

      }

  if ((revert == 1)&& (flagB1 == 0))              // Se o botao revert for pressionado,verifica se a flagB1 esta e "0"
      {
       delay_ms(50);                                      // Delay para reduzir o bounce
       if ((revert == 1) && (flagB1 == 0))        // Verifica se o botao revert continua pressionado e se a flagB1 continua em "0"
       cc = 0;                                                  // Coloca o pino "RB3" em nivel logico baixo
       cw = 1;                                                 // Coloca o pino "RB4" em nivel logico alto
       flagB1 = 1;                                           // Define a flagB1 em "1"
      }
  if ((stop == 1) && (flagB2 == 0))               // Se o botao stop for pressionado,verifica se a flagB2 esta e "0"
      {
       delay_ms(50);                                    // Delay para reduzir o bounce
       if ((stop == 1) && (flagB2 == 0))         // Verifica se o botao stop continua pressionado e se a flagB2 continua em "0"
       cc = 1;                                                 // Coloca o pino "RB3" em nivel logico alto
       cw = 0;                                                // Coloca o pino "RB4" em nivel logico baixo
       delay_ms(2000);                                 // Aguarda 2 segundos
       cc = 0;                                                 // Coloca o pino "RB3" em niveç logico baixo
       motor_enable = 0;                               // Desabilita o motor
       flagB0 = 0;                                           // Define a falgB0 em "0"
       flagB2 = 1;                                           // Define a falgB2 em "1"

      }

     }
}

 

image.png

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom Dia , 

 

Ja exprimentou retirando aquele delay , entendo o porque de você colocar ele , mas na pratica ele pode fazer com que nao entres no ciclo.

 

Abraço

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro 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 publicações 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

×