Forum: Mikrocontroller und Digitale Elektronik ATmega8 Zufalls LED Blinker


von Georg (Gast)


Lesenswert?

Hallo,


Ich möchte einen 8 fachen LED Blinker bauen, dieser sollte aber keine 
erkennbare regelmäßigkeit aufweisen, da es quasi eine blackbox in einem 
gerät wird, die einfach nur random blinkt, um die chinesen zu verwirren.

Ich habe mal angefangen avr zu programmieren, bin aber nicht über die 
grundsätze rausgekommen (keine zeit durch schule)

Wenn mir jemand das in etwa (oder natürlich gerne auch genau^^) erklären 
könnte wäre das schon nett ;)

MfG
Georg

von Marius W. (mw1987)


Lesenswert?

Wenn du wirklich Zufall willst, nimm ne Z-Diode, und miss die Spannung 
an der Z-Diode mit dem AD-Wandler des Megas. Die Z-Diode sollte genug 
Rauschen, damit du das LSB einer AD-Wandlung als Zufallssignal nehmen 
kannst.

Für jede LED eine Wandlung und dann alles zusammensetzen, fertig.

MfG
Marius

von U. K. (rauchendesdope)


Lesenswert?

Pseodozufallszahlengenerator gibts hier:
Beitrag "Zufallszahlen"

In der Forumsuche findet man genug zu diesem Thema

von Helpme (Gast)


Lesenswert?

Hier ist was:

1
#include <avr/io.h>
2
#include <stdio.h>
3
4
#ifndef F_CPU
5
#define F_CPU 10000000UL     /* Internal Quarz 10 Mhz*/
6
#endif
7
#include <util/delay.h> 
8
9
#define UPPPER_BOUND   1000 //1sekunde
10
11
12
//Random Erzeugung//
13
int myRand( int UpperBound )
14
{
15
  int x;
16
17
  while( (x = rand()) >= RAND_MAX - (RAND_MAX % UPPPER_BOUND) )
18
    ; 
19
  return x % UPPPER_BOUND;
20
}
21
22
23
//Dealy braucht konstanten Wert//
24
void delay( uint8_t ms )
25
{
26
  uint8_t i;
27
28
  for( i = 0; i < ms; ++i )
29
    delay_ms( 1 );
30
}
31
32
33
//MAIN///////////////
34
35
int main()
36
{
37
38
//::::::Port Configuration::::::
39
//PB3 Signalerzeugung (Output)
40
//PB0 (Input), 1 DigInput
41
42
//Port B Data Direction Register:
43
DDRB = (1 << DDB3); 
44
 
45
while(1)    //Endlosschleife
46
{
47
  
48
49
  ms = myRand();  //Zufallszahl Übergabe
50
51
  if ( PINB & (1<<PINB0) )   //Wenn am PortB0 High anliegt --> Rechtsdrehung
52
  {
53
54
55
  //PortB Pin 3/4 (Output) auf "High"
56
57
  PORTB |= (1<<PB3);    //PB3 Output auf High Potential gesetzt
58
  delay(ms); 
59
  PORTB &= ~(1<<PB3);    //PB4 Output auf High Potential gesetzt
60
  delay(ms); 
61
  
62
   }
63
64
    else ;  //Tue nichts
65
66
}
67
return 0;
68
69
70
}

von Helpme (Gast)


Lesenswert?

Kurze Änderung:

[c]

#include <avr/io.h>
#include <stdio.h>

#ifndef F_CPU
#define F_CPU 10000000UL     /* Internal Quarz 10 Mhz*/
#endif
#include <util/delay.h>

#define UPPPER_BOUND   1000 //1sekunde


//Random Erzeugung//
int myRand( int UpperBound )
{
  int x;

  while( (x = rand()) >= RAND_MAX - (RAND_MAX % UPPPER_BOUND) )
    ;
  return x % UPPPER_BOUND;
}


//Dealy braucht konstanten Wert//
void delay( uint8_t ms )
{
  uint8_t i;

  for( i = 0; i < ms; ++i )
    delay_ms( 1 );
}


//MAIN///////////////

int main()
{

//::::::Port Configuration::::::
//PB3 Signalerzeugung (Output)
//PB0 (Input), 1 DigInput

//Port B Data Direction Register:
DDRB = (1 << DDB3);

while(1)    //Endlosschleife
{


  ms = myRand();  //Zufallszahl Übergabe

  if ( PINB & (1<<PINB0) ) //Wenn Pin auf High//
  {


  PORTB |= (1<<PB3);    //PB3 Output auf High Potential gesetzt
  delay(ms);
  PORTB &= ~(1<<PB3);    //PB3 Output auf LOW Potential gesetzt
  delay(ms);

   }

    else ;  //Tue nichts

}
return 0;


}

von Rudolph R. (Gast)


Lesenswert?

Ich habe sowas mal für jemanden gemacht der "Sternen-funkeln" haben 
wollte.
Statt die Zufalls-Zahlen zu berechnen habe ich einfach eine grosse 
Tabelle aus zufälligen Zahlen per DOS Programm berechnen lassen, die 
wird einfach der Reihe nach schnell abgespult.
Bei 1024 Einträgen ist das schon zufällig genug und ergibt wenn man ein 
paar Dutzend Einträge pro Sekunde macht auch ein nettes "funkeln".

von dfj (Gast)


Lesenswert?

UPPER_BOUND sollte 1 sein und RAND MAX muss deklariert werden..

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.