Impossibile chiamare la sotto-routine correttamente microcontrollore PIC18F
-
13-12-2019 - |
Domanda
Ho un progetto per programmare un microcontrollore PIC18F, devo collegare un circuito di commutazione alla scheda Microcontroller, questo circuito di commutazione ha una serratura elettrica e un cicalino da collegare ad esso.
Il blocco è inizialmente alimentato.Si suppone che quando mando "1", il cicalino sarà alimentato con un'onda quadra e la serratura sarà spenta.Quando riceve '0', il cicalino verrà disattivato senza alimentare di nuovo il blocco.Quando riceve '2' la serratura deve essere alimentata ma se il cicalino non fosse imbottito prima, non dovrebbe essere di nuovo alimentato.
La mia confusione è nell'ultima parte.Quando mando "2" tramite l'iperterminale, e ho inviato '0' prima, il cicalino è di nuovo alimentato.
Ecco il codice,
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
}
.
può per favore qualcuno mi aiuti a risolvere questo?
Soluzione
Stai impostando buzzer
su 0 al di fuori del blocco if(uart_rd='0')
.Quindi, quando si arriva al blocco if(uart_rd='2')
, buzzer
è sempre 0 e quindi viene sempre chiamato il blocco if(buzzer!=1)
.
Hai provato a fare un passo con un debugger?Avrebbe mostrato questo genere di cose facilmente.È inoltre possibile modificare quei blocchi if
a un'istruzione switch
o una serie di istruzioni generatori di if
/ else if
per evitare questi tipi di problemi.
Altri suggerimenti
Ecco il codice di esecuzione:
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
}
.