2016-03-26 9 views
0

いくつかの文脈では、私はArduinoプロジェクトのために基本的に「Simon」であることに取り組んでいます。 ATMEGA2560を使用し、Atmel Studio 6.1でコードを編集しています。このプロジェクトでは、乱数ジェネレータを使用してボタン入力のシーケンスを作成します。ここでは問題が発生しています。ATMega乱数生成

いくつかの分散を追加する私の現在の方法は、式を処理する数値を増やして、タイマー割り込みを使用して乱数をシードすることです。しかし、タイマーは機能しません。その数は増加しません。初期化に何か間違っているのですか、それとも何か不具合ですか?

コード:

#define F_CPU 1000000UL // 1 MHz, for timer 

#include <avr/io.h> // normal stuff 
#include <avr/interrupt.h> // timer interrupt 
#include <util/delay.h> // easy delay functions 
#include <stdlib.h> // random function 

// global var that timer uses 
volatile uint8_t count; 

// function prototypes 
int generateSeq(); // generates random number 
int getRandomNumber(); // also generates random number (?) 



int main(void) 
{ 

    // variables 
    int sequence[8] = {0, 0, 0, 0, 0, 0, 0, 0}; // actual sequence 
    int terms = 0; // terms in sequence 
    int gameState = 0; 
    int ifWrong = 0; // if sequence is wrong 


    // timer interrupt (WHAT AM I DOING WRONG) 
    TCCR0A |= (1<<CS02)|(1<<CS00); 
    TIMSK0 |= (1<<TOIE0); 
    TCNT0 = 0; 
    count = 1; 
    sei(); 

    while(1) 
    { 
    // actual "game" part 
    while(gameState == 1) 
    { 

     // generate term in sequence 
     // 1 = up, 2 = right, 3 = down, 4 = left 

     if(ifWrong == 0) 
     { 
     sequence[terms] = generateSeq(); // call sequence function 
     terms++; 
     } 
    } 
    } 
} 

// random seed for sequence generator (something wrong here?) 
ISR(TIMER0_OVF_vect) 
{ 
    count++; 

    if(count >= 255) 
    { 
    count = 1; 
    } 
} 

int generateSeq() // function to generate sequence 
{ 
    // equation is currently a placeholder 
    int r2 = (int)rand() * (int)count; 
    int num = r2 * count; 
    return (num % 4) + 1; 
} 
+0

これは、典型的なArduinoコードのようには見えません。それで、見出しのArduinoという言葉はちょっとミスリーディングです。これは通常、ハードウェアとソフトウェア/ツールチェーンの両方を指しています。 – Olaf

+0

'int generateSeq();'は有効な関数プロトタイプではありません! – Olaf

+0

タイマーの初期設定が間違っていることに気付きました。 ATmega2560のタイマ0のクロック選択フラグは、TCCR0AではなくTCCR0Bにあります。それ以外は、あなたのコードは正常に動作するはずです。さて、TIMER0_OVF_vectは既にArduinoの内部機能に使用されています。あなたがArduinoのSDKを使用しているようには見えないので、あなたにとって重要なことではありません。 Arduinoの代わりにATmegaであなたの質問にタグを付けると、より良い反応を得るかもしれないと思います。がんばろう。 – bot1131357

答えて

0

gameState 0であり、変更されたことがないので、generateSeq()コードのいずれも呼び出されません。

sequence[terms]に深刻な問題があります。termsが0から7の間であるかどうかをチェックしないことになります。