Für einige Kontext arbeite ich an, was im Grunde "Simon" für ein Arduino-Projekt ist. Ich benutze einen ATMEGA2560 und bearbeite den Code mit Atmel Studio 6.1. Das Projekt verwendet den Zufallszahlengenerator, um die Sequenz für die Tasteneingabe zu erstellen, wo ich Probleme habe.ATMega Zufallsgenerierung
Meine aktuelle Methode zum Hinzufügen einiger Varianz besteht darin, einen Timer-Interrupt zu verwenden, um die Zufallszahl zu setzen, indem eine Zahl erhöht wird, die durch eine Gleichung verarbeitet werden soll. Der Timer funktioniert jedoch einfach nicht - und die Nummer wird nicht erhöht. Mache ich etwas falsch mit der Initialisierung, oder ist etwas anderes schuld?
Code:
#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;
}
Das sieht nicht wie typischer Arduino-Code aus. So ist der Begriff Arduino in der Überschrift ein wenig irreführend, da dies typischerweise sowohl die Hardware als auch die Software/Toolchain betrifft. – Olaf
'int generateSeq();' ist kein gültiger Funktionsprototyp! – Olaf
Beachten Sie, dass Ihre Timer-Initialisierung falsch ist. Clock-Select-Flags für ATmega2560s Timer0 befinden sich in TCCR0B und nicht in TCCR0A. Ansonsten sollte Ihr Code gut funktionieren. Nebenbei wird TIMER0_OVF_vect bereits für die interne Funktion von Arduino verwendet. Nicht, dass es Ihnen etwas ausmacht, da Sie Arduino's SDK nicht zu benutzen scheinen. Ich denke, dass Sie eine bessere Antwort bekommen könnten, indem Sie Ihre Frage mit ATmega anstelle von Arduino markieren. Viel Glück. – bot1131357