Das Unterprogramm konnte nicht korrekt aufgerufen werden. Mikrocontroller PIC18F
-
13-12-2019 - |
Frage
Ich habe ein Projekt zum Programmieren eines Mikrocontrollers PIC18F. Ich muss einen Schaltkreis an die Mikrocontrollerplatine anschließen. Dieser Schaltkreis verfügt über ein elektrisches Schloss und einen Summer, die daran angeschlossen werden müssen.
Das Schloss ist zunächst mit Strom versorgt.Es wird angenommen, dass, wenn ich „1“ sende, der Summer mit einer Rechteckwelle betrieben und das Schloss ausgeschaltet wird.Wenn es „0“ empfängt, wird der Summer ausgeschaltet, ohne dass das Schloss erneut mit Strom versorgt wird.Wenn es „2“ empfängt, sollte das Schloss mit Strom versorgt werden. Wenn der Summer jedoch zuvor nicht mit Strom versorgt wurde, sollte er nicht erneut mit Strom versorgt werden.
Meine Verwirrung liegt im letzten Teil.Wenn ich „2“ über das Hyperterminal sende und davor „0“ sende, wird der Summer wieder eingeschaltet.
Hier ist der 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
}
Kann mir bitte jemand bei der Lösung dieses Problems helfen?
Lösung
Du stellst ein buzzer
auf 0 außerhalb der if(uart_rd='0')
Block.Also, wenn Sie zum kommen if(uart_rd='2')
Block, buzzer
ist immer 0 und so if(buzzer!=1)
Block wird immer aufgerufen.
Haben Sie versucht, dies mit einem Debugger durchzugehen?So etwas würde leicht auftauchen.Sie könnten diese auch ändern if
Blöcke entweder zu a switch
Aussage oder eine Reihe von if
/ else if
Anweisungen, um solche Probleme zu vermeiden.
Andere Tipps
Hier ist der laufende Code:
generasacodicetagpre.