Não foi possível chamar a sub-rotina corretamente Microcontrolador PIC18F
-
13-12-2019 - |
Pergunta
Tenho um projeto para programar um microcontrolador PIC18F, tenho que conectar um circuito de comutação na placa do microcontrolador, esse circuito de comutação possui uma fechadura elétrica e uma campainha para ser conectada a ele.
A fechadura é inicialmente alimentada.Supõe-se que quando eu enviar '1', a campainha será alimentada com onda quadrada e a fechadura será desligada.Ao receber '0', a campainha será desligada sem reativar a fechadura.Ao receber '2' a fechadura deverá ser energizada, mas se a campainha estiver desligada antes, não deverá ser energizada novamente.
Minha confusão está na última parte.Quando envio '2' através do hiperterminal e enviei '0' antes dele, a campainha é ligada novamente.
Aqui está o 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
}
Por favor, alguém pode me ajudar a resolver isso?
Solução
Você está configurando buzzer
para 0 fora do if(uart_rd='0')
bloquear.Então, quando você vier para o if(uart_rd='2')
bloquear, buzzer
é sempre 0 e então o if(buzzer!=1)
bloco é sempre chamado.
Você já tentou passar por isso com um depurador?Esse tipo de coisa apareceria facilmente.Você também pode alterá-los if
bloqueia para um switch
declaração ou uma série de if
/ else if
declarações para evitar esse tipo de problema.
Outras dicas
aqui está o código em execução:
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
}