サブルーチンの正しいマイクロコントローラPIC18Fを呼び出すことができませんでした
-
13-12-2019 - |
質問
マイクロコントローラPIC18Fをプログラムするプロジェクトは、スイッチング回路をマイクロコントローラボードに接続しなければならず、このスイッチング回路は電動ロックとそれに接続されるブザーを有する。
ロックは最初に電力を供給されます。「1」を送信すると、ブザーに方形波で電源が入り、ロックが消灯します。'0'を受信すると、ロックを再度電源を入れずにブザーがオフになります。それが '2'を受け取るとき、ロックは電力を供給されるべきですが、ブザーが以前に電源を供給された場合、それは再び電源を供給されるべきではありません。
私の混乱は最後の部分にあります。私がハイパーターミナルを介して '2'を送るとき、そして私はそれの前に '0'を送りました、ブザーは再び電力を供給されます。
これはコード、
です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
}
.
誰もがこれを解決するのを手伝ってくれる?
解決
buzzer
ブロックの外側にif(uart_rd='0')
を0に設定しています。そのため、if(uart_rd='2')
ブロックに入った場合、buzzer
は常に0、そのためif(buzzer!=1)
ブロックは常に呼び出されます。
デバッガでこれをステップスルーしようとしましたか?それは簡単にこのようなものを現れるでしょう。これらの種類の問題を回避するために、if
ステートメントまたは一連のswitch
/ if
ステートメントのいずれかを変更することもできます。
他のヒント
これは実行されているコードです:
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
}
. 所属していません StackOverflow