ATmega8 Zufalls LED Blinker

Gast #1238017
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
Gast #1238091
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
}
Gast #1238092
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;


}
Gast #1238192
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".

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren