2016-04-05 9 views
-1

私はこのプログラミングには非常に慣れていて、PICに接続されたボタンを使用してアラームを追加、マイナス、設定するためにプロテウスでプロジェクトをセットアップしようとしています。問題は、whileループの後でカウントが保存されず、リセットされていることです。 - ボタン1 = ADD、button2を= MINUS、ボタン1 + 2 + 3 = ALARM - すべてのヘルプはwhileループで値がリセットされています

#include <main.h> 
#ZERO_RAM 

int a = 0; 
int state; 
char data = 'y'; 
short int flags[3]; 
char uart_rd; 

void main() 
{ 
    setup_wdt(WDT_1MS); //~1.0 ms reset 

    port_a_pullups(0xFF); // Defining PORTA as pullup Resistors 

    printf("program start" nr); //<------keeps resetting value to 0 HERE 

    while (TRUE) // infinite loop 
    { 
     if (!input(PIN_A1)) // add button 
     { 
      if (!flags[0]) 
      { 
       flags[0] = 1; 
       a++; // add one to overall count 
       printf("ADDED, Total= %dnr", a); // prints count 
      } 
     } 
     else 
     { 
      flags[0] = 0; 
     } 
     if (!input(PIN_A2)) // minus button 
     { 
      if (!flags[1]) 
      { 
       flags[1] = 1; 
       a--; // take away 1 from count 
       printf("MINUS, Total= %dnr", a); // print count 
      } 
     } 
     else 
     { 
      flags[1] = 0; 
     } 
     if ((!input(PIN_A1)) && (!input(PIN_A2)) && (!input(PIN_A3))) // all buttons  equal alarm 
     { 
      printf("ALARM HAS BEEN SETnr"); // if all buttons are held constant alarm 
      // is printed through Terminal 
     } 
     else 
     { 
      flags[2] = 0; 
      output_high(PIN_A0); // led goes high 
      delay_ms(500); // flashing LED every cycle 
      output_low(PIN_A0); // led goes low 
      printf("Overall Count= %dnr", a); // printf overall count 
     } 
    } 
} 
+8

インデントを修正してください。 – OMGtechy

+0

*値をリセットしておきますか?何を「数える」? –

+0

読みにくいです。次に... –

答えて

1

素晴らしいだろうあなたは次のバグを持っている - 全体のカウントが0 にリセットされている理由を理解カント:

  • どこでもflagsを初期化することはありません。確かに、静的記憶期間変数は、規格によってゼロに初期化されることが要求される。しかし、組み込みシステムでは、起動コードから「ゼロアウト」部分を削除する、非常に一般的で非標準的な拡張があります。プロジェクトを作成するときに、「最小起動」または「標準C」というオプションが表示されることがよくあります。したがって、使用する前に、常に実行時にすべての変数を手動で初期化してください。堅牢な組み込みコードは、変数のデフォルト値については、.dataでも.bssセグメントでもないと仮定していません。

  • あなたはデバウンスを実装していません。 電気機械信号バウンスの問題を避けるために、組み込みシステムのボタンを読む方法についての初心者のチュートリアルを確認してください。信号のバウンスによりコードflags[0] = 0;が実行されます。

  • 誰かがボタンを押すたびに、ボタンを押している限り、カウンタを増加させる条件は真のままです。マイクロコントローラは、遅い人間がボタンを押したままにしている間に、そのコードを何千回も実行するのに十分高速です。代わりに、ボタンが非アクティブからアクティブになるときにだけカウンタを増やす必要があります。明らかに、これを実行するコードは、のデバウンス後にに配置する必要があります。

関連する問題