サブルーチンの正しいマイクロコントローラPIC18Fを呼び出すことができませんでした

StackOverflow https://stackoverflow.com//questions/10700459

質問

マイクロコントローラ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
}
.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top