PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [Gelöst] NIBObee Zufallszahlen



m125
21.11.2010, 11:54
Hallo,

ich versuche gerade die LEDs zufällig blinken zu lassen. Im Internet habe ich dazu einen Code für Zufallszahlen gefunden.



int irand( int a, int e)
{
a=1;
e=2000;
double r = e - a + 1;
return a + (int)(r * rand()/(RAND_MAX+1.0));

}


Wenn ich diesen Code jedoch in mein Programm einbaue, dann blinkt die LED nicht zufällig, sondern in einem festen Rythmus, wie ein normales Blinklicht.



#include <nibobee/iodefs.h>
#include <nibobee/led.h>
#include <nibobee/delay.h>
#include <stdio.h>
#include <stdlib.h>

int main()
{

led_init();

while(1==1)
{

int irand( int a, int e)
{
a=1;
e=2000;
double r = e - a + 1;
return a + (int)(r * rand()/(RAND_MAX+1.0));

}


led_set(LED_L_RD, 1);
delay(irand);
led_set(LED_L_RD, 0);
delay(irand);


}
return 0;
}


Weiß jemand wo der Fehler liegt?

Viele Grüße,
Manuel

rossir
21.11.2010, 17:13
Nur mit Mühe bekommt man im Voraus raus an welcher konstanten Adresse ein C-Compiler/Linker eine C-Funktion abspeichert.

Später, im laufenden Programm, bekommt man diese konstante Adresse einfach geliefert. Beispiel:
delay(irand );

Möchtest Du einen überraschenden Funktionswert (diesmal nicht die Adresse) nutzen schreibt man:
delay(irand() );

Möchtest Du den Funktionswert für Deine geplanten Parameter haben schreibt man:
delay(irand(3, 100) );

m125
21.11.2010, 17:32
Danke,
das funktioniert jetzt.
Jetzt noch eine zweite Frage:
Ich will mehrere (alle) LEDs gleichzeitig zufällig blinken lassen. Wenn ich jedoch in diesen Code einfach alle LEDs einfüge, dann arbeitet er sie einzeln ab und es sieht nach einem Wechselblinker aus. Geht das, dass man alle gleichzeitig zufällig blinken lässt (Abstand dazwischen nicht länger als 200-250ms)?



#include <nibobee/iodefs.h>
#include <nibobee/led.h>
#include <nibobee/delay.h>
#include <stdio.h>
#include <stdlib.h>

int main()
{

led_init();

while(1==1)
{

int irand(int a, int e)
{
double r = e - a + 1;
return a + (int)(r * rand()/(RAND_MAX+1.0));

}

led_set(LED_L_RD, 1);
delay(irand(50,250));
led_set(LED_L_RD, 0);
delay(irand(50,250));

led_set(LED_L_YE, 1);
delay(irand(50,250));
led_set(LED_L_YE, 0);
delay(irand(50,250));

}
return 0;
}


Viele Grüße,
Manuel

rossir
21.11.2010, 23:45
Dazu muss man sich gedanklich anders aufstellen. Hier eine von vielen Möglichkeiten:


int rd0=0, rd1=0, ye0=0, ye1=0;
int i=0;
for(i=0; ;i++) {
if(i==rd1) { rd0=i+irand(50, 250); led_set(LED_L_RD, 1); };
if(i==rd0) { rd1=i+irand(50, 250); led_set(LED_L_RD, 0); };
if(i==ye1) { ye0=i+irand(50, 250); led_set(LED_L_YE, 1); };
if(i==ye0) { ye1=i+irand(50, 250); led_set(LED_L_YE, 0); };
delay(1);
}

m125
22.11.2010, 18:51
Danke,
jetzt funktioniert alles so, wie ich es mir vorstelle!

Viele Grüße,
Manuel