No se pudo llamar correctamente a la subrutina Microcontrolador PIC18F
-
13-12-2019 - |
Pregunta
Tengo un proyecto para programar un microcontrolador PIC18F, tengo que conectar un circuito de conmutación a la placa del microcontrolador, este circuito de conmutación tiene una cerradura eléctrica y un zumbador para conectarle.
La cerradura inicialmente recibe energía.Se supone que cuando envíe '1', el timbre se activará con una onda cuadrada y la cerradura se apagará.Cuando reciba '0', el timbre se apagará sin volver a encender la cerradura.Cuando recibe '2', la cerradura debe estar encendida, pero si el timbre estaba apagado antes, no debe volver a encenderse.
Mi confusión está en la última parte.Cuando envío '2' a través del hiperterminal y envié '0' antes, el timbre se enciende nuevamente.
Aquí está el código,
void buzzertest();
char uart_rd;
int buzzer;
void main() {
TRISB=0X00;
PORTB=0x00;
RB5_bit = 0xFF; //lock open
UART1_Init(9600); // Initialize UART module at 9600 bps
while (1) { // Endless loop
if (UART1_Data_Ready()) // If data is received,
{
buzzer=1;
uart_rd = UART1_Read(); // read the received data,
if(uart_rd =='1') {
RB5_bit = 0x00; //lock closed
buzzertest();
}
if(uart_rd =='0' ){ //disable buzzer
RB1_bit = 0x00; //buzzer
buzzer=0;
}//end if
buzzer=0;
if(uart_rd =='2'){ //disable lock
RB5_bit=0xFF;
if(buzzer!=1){
buzzertest();
}
}//end if
} //end outer if
} //end while
}//end main
void buzzertest(){
while(1){
RB1_bit = 0xFF; //buzzer
Delay_ms(1000);
RB1_bit = 0x00; //buzzer
Delay_ms(1000);
if (UART1_Data_Ready())
break;
}//end while loop
}
¿Alguien puede ayudarme a resolver esto?
Solución
estas configurando buzzer
a 0 fuera del if(uart_rd='0')
bloquear.Así que cuando vengas al if(uart_rd='2')
bloquear, buzzer
es siempre 0 y entonces el if(buzzer!=1)
El bloque siempre se llama.
¿Has intentado solucionar esto con un depurador?Este tipo de cosas se mostrarían fácilmente.También podrías cambiar esos if
bloquea ya sea a un switch
declaración o una serie de if
/ else if
declaraciones para evitar este tipo de problemas.
Otros consejos
Aquí está el código de ejecución:
void buzzertest();
char uart_rd;
int buzzer;
void main() {
TRISB=0X00;
PORTB=0x00;
RB5_bit = 0xFF; //lock open
UART1_Init(9600); // Initialize UART module at 9600 bps
while (1) { // Endless loop
if (UART1_Data_Ready()) // If data is received,
{
uart_rd = UART1_Read(); // read the received data,
if(uart_rd =='1') {
RB5_bit = 0x00; //lock closed
buzzertest();
buzzer=1 ;
}
else if(uart_rd =='0' ){ //disable buzzer
RB1_bit = 0x00; //buzzer
buzzer=0;
}//end else if
else if(uart_rd =='2'){ //disable lock
RB5_bit=0xFF;
if(buzzer==1){
buzzertest();
}
}//end else if
} //end outer if
} //end while
}//end main
void buzzertest(){
while(1){
RB1_bit = 0xFF; //buzzer
Delay_ms(1000);
RB1_bit = 0x00; //buzzer
Delay_ms(1000);
if (UART1_Data_Ready())
break;
}//end while loop
}