ATmega8 Zufalls LED Blinker

Gast #1238017
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
#1238069
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
Gast #1238091
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
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
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

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.