2016-03-26 25 views
0

Bazı bağlam için, bir Arduino projesi için temel olarak “Simon” üzerinde çalışıyorum. ATMEGA2560 kullanıyorum ve kodu Atmel Studio 6.1 ile düzenliyorum. Proje, sorun yaşadığım düğme girişi için sıra oluşturmak üzere rasgele sayı üretecini kullanıyor.ATMega rasgele sayı üretimi

Benim şu anki değer ekleme yöntemim, bir denklemle işlenecek bir sayıyı artırarak rasgele sayıyı tohumlamak için bir zamanlayıcı kesmesi kullanmaktır. Ancak, zamanlayıcı sadece işe yaramıyor - ve sayı artmıyor. Başlatmada yanlış bir şey yapıyorum mu, yoksa başka bir şey mi var?

Kodu:

#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

Bu, tipik Arduino kodu gibi görünmüyor. Bu yüzden, başlığın içindeki Arduino terimi, hem donanım hem de yazılım/araç zincirini ifade ettiği için biraz yanıltıcıdır. – Olaf

+0

'int generateSeq();' geçerli bir işlev prototipi değil! – Olaf

+0

Sayaç başlatmanızın yanlış olduğunu farkettiniz. ATmega2560'ın Timer0 için saat seçim bayrakları TCCR0B'de değil TCCR0A'da bulunur. Bunun dışında kodunuz iyi çalışmalı. Bir yana, TIMER0_OVF_vect Arduino'nun iç işlevi için zaten kullanılıyor. Arduino'nun SDK'sını kullanmaktansa, sizin için önemli değil. Sorunu Arduino yerine ATmega ile etiketlemenin daha iyi bir yanıtı olabileceğini düşünüyorum. İyi şanslar. – bot1131357

cevap

0

gameState 0 ve asla değişti, o yüzden generateSeq() kod hiçbiri denir.

sequence[terms] ile de terms'un 0 ile 7 arasında olup olmadığını kontrol etmediğinizde ciddi bir sorunla karşılaşırsınız. Dizinin sonunu kesersiniz.