Impossible d'appeler correctement le sous-programme Microcontrôleur PIC18F
-
13-12-2019 - |
Question
J'ai un projet de programmation d'un microcontrôleur PIC18F, je dois connecter un circuit de commutation à la carte du microcontrôleur, ce circuit de commutation possède une serrure électrique et un buzzer pour y être connecté.
La serrure est initialement alimentée.Il est supposé que lorsque j'envoie « 1 », le buzzer sera alimenté par une onde carrée et le verrou sera éteint.Lorsqu'il reçoit « 0 », le buzzer s'éteindra sans alimenter à nouveau la serrure.Lorsqu'il reçoit « 2 », la serrure doit être alimentée, mais si le buzzer n'était pas alimenté auparavant, il ne doit pas être alimenté à nouveau.
Ma confusion est dans la dernière partie.Lorsque j'envoie un '2' via l'hyperterminal, et que j'envoie un '0' avant celui-ci, le buzzer est à nouveau alimenté.
Voici le code,
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
}
Quelqu'un peut-il m'aider à résoudre ce problème ?
La solution
Vous définissez buzzer
à 0 en dehors du if(uart_rd='0')
bloc.Alors quand tu viens au if(uart_rd='2')
bloc, buzzer
est toujours 0 et donc le if(buzzer!=1)
le bloc est toujours appelé.
Avez-vous essayé de résoudre ce problème avec un débogueur ?Cela montrerait facilement ce genre de chose.Vous pouvez également les modifier if
bloque soit à un switch
déclaration ou une série de if
/ else if
déclarations pour éviter ce genre de problèmes.
Autres conseils
Voici le code d'exécution:
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
}