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"
}
}
}