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;
}
これは、典型的なArduinoコードのようには見えません。それで、見出しのArduinoという言葉はちょっとミスリーディングです。これは通常、ハードウェアとソフトウェア/ツールチェーンの両方を指しています。 – Olaf
'int generateSeq();'は有効な関数プロトタイプではありません! – Olaf
タイマーの初期設定が間違っていることに気付きました。 ATmega2560のタイマ0のクロック選択フラグは、TCCR0AではなくTCCR0Bにあります。それ以外は、あなたのコードは正常に動作するはずです。さて、TIMER0_OVF_vectは既にArduinoの内部機能に使用されています。あなたがArduinoのSDKを使用しているようには見えないので、あなたにとって重要なことではありません。 Arduinoの代わりにATmegaであなたの質問にタグを付けると、より良い反応を得るかもしれないと思います。がんばろう。 – bot1131357