2012-01-05 26 views
1

私はARMのボード上でLCD画面上で動作するC言語のポン型ゲームを作成しています。ゲームの要件の一部は「魔法の時間」と呼ばれるものです。ARM組み込みCプログラミングのタイマーの使用

「魔法の時間」の期間は、5~10秒の間のランダムな間隔、すなわち最後の「魔法の時間」の後の5~10秒の間に起こり、ランダムな持続時間は2~10秒間続きます。

+0

「magicTime == magicTimeLength;」の目的は何ですか?ブール値と整数(それ自体が問題です)を比較しますが、どこにでも結果を格納しません。 –

+3

これはQ&Aサイトです。あなたは質問をし、答えます。あなたの質問は何ですか? –

+1

タイマはARMコアの一部ではありません(ARM Cortex-M SYSCLKは例外ですが、Cortex-Mコードではありません)。 ARMベースのマイクロコントローラのペリフェラルデバイスは、ベンダーによって定義されています。どのベンダーからどのARM部品を正確に指定する必要があります。おそらくRTOSを使ってシステム全体を簡素化することができます。 – Clifford

答えて

2

私は本当にあなたの質問(あなたがタイマ割り込みを経由して、毎秒、このコードを実行し、またはか?)を理解していないが、私は一目で見多少の誤差があります。

while (magicTime == true) { 
    magicTimeLength++; 
    magicTime == magicTimeLength; 
} 

最後の行は、 (magicTime == magicTimeLength;)は何もしません。magicTimemagicTimeLengthと等しいかどうかを単に評価するので、デッドループに入ります。

私はあなたがこれをしたいと思います:

  1. 初期magicTimeOccurenceランダムな値を持つ5と10
  2. 初期magicTimeLength内のランダムな値を2と10
  3. 内毎秒、magicTimeOccurence場合が0より大きい場合は、値を1減らして を減らします。
  4. magicTimeOccurenceヒット0になると、magicTimeLengthの値が に1減少します。
  5. magicTimeLengthが0より大きいかどうかを確認します。可能であれば、それは魔法の です(したがって、magicTimeフラグをtrueに設定してください)。デクリメント magicTimeLength
  6. magicTimeLengthの場合は、あなたが1秒の周期であなたのtimer0割り込みを初期化する必要がありますfalsemagicTimeを設定し、1

に進みます。

/* Set timer 0 period */ 
T0PR = 0; 
T0MR0 = SYS_GetFpclk(TIMER0_PCLK_OFFSET)/(TIMER0_TICK_PER_SEC); 

だが、1秒ごとにトリガーされるようにしてください。

ここにサンプルコードがありますが、それは私の言いたいことを示すはずです。

/* In  void InitTimer0Interrupt() */ 

... 
T0TCR_bit.CE = 1;  /* Counting Enable */ 

magicTimeOccurence = 5+(rand()%5); 
magicTimeLength = 2+(rand()%8); 
magicTime = false; 

    __enable_interrupt(); 
} 

/* In  void Timer0IntrHandler (void) */ 

void Timer0IntrHandler (void) { 


    /* clear interrupt */ 
    T0IR_bit.MR0INT = 1; 
    VICADDRESS = 0; 
    if(magicTimeOccurence > 0) 
    { 
     magicTimeOccurence--; 
    } 
    else if(magicTimeLength > 0){ 
     magicTime = true; 
     magicTimeLenght--; 
    } 
    else{ 
     magicTime = false; 
     magicTimeOccurence = 5+(rand()%5); 
     magicTimeLength = 2+(rand()%8); 
    } 

    /* take action on timer interrupt */ 
} 
+0

はい、メインクラスのtimerinterruptを使用して毎秒実行されます。 私は自分のロジックがどのように欠陥があるかを理解しました。ブール値を時間の長さに設定しようとしていました。 お返事ありがとうございます、私は自分のコードを書き換えて返信します。 – user1080390

+0

問題はありません、幸運!私は私の答えにサンプルコードを追加しました。 –

+0

これは動作しますか?私は印象に残っていたので、whileループを呼び出して、値が増減するようにしなければならないでしょうか? または、timerinterruptのためにifステートメントを実行し続けますか? – user1080390

関連する問題