mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATmega8 Zufalls LED Blinker


Autor: Georg (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Marius Wensing (mw1987)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: U. K. (rauchendesdope)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Pseodozufallszahlengenerator gibts hier:
Beitrag "Zufallszahlen"

In der Forumsuche findet man genug zu diesem Thema

Autor: Helpme (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier ist was:


#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 am PortB0 High anliegt --> Rechtsdrehung
  {


  //PortB Pin 3/4 (Output) auf "High"

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

    else ;  //Tue nichts

}
return 0;


}


Autor: Helpme (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;


}

Autor: Rudolph R. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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".

Autor: dfj (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
UPPER_BOUND sollte 1 sein und RAND MAX muss deklariert werden..

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.