2016-03-26 11 views
0

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; 
} 
+0

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

+0

'int generateSeq();' ist kein gültiger Funktionsprototyp! – Olaf

+0

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

Antwort

0

gameState 0, und nie geändert, so dass keiner der generateSeq() Code genannt wird.

Sie haben auch ein ernstes Problem mit sequence[terms] in dem Sie nicht überprüfen, ob terms zwischen 0 und 7 ist. Sie werden über das Ende des Arrays laufen.

Verwandte Themen