Forum: Mikrocontroller und Digitale Elektronik Atmega 8 - Zufallszahlen 1-8


von Frischling (Gast)


Lesenswert?

Hallo

ich versuche grade mich in die Welt der Mikrokontroller.
Wie man eine LED zum Blinken bekommt und auch ein lauflicht , das weis 
ich mittlerweile.
was ich jetzt versuche und suche ist einen Zufallsgenerator, der Wahllos 
die LED´s blinken lässt.
Vieles versucht , das was ich gefunden, funzte nicht so wie ich mir das 
dachte.
Jetzt versuche ich das hier mal.

Kann jemand helfen ?


Gruss

von Teo D. (teoderix)


Lesenswert?

Frischling schrieb:
> Vieles versucht , das was ich gefunden, funzte nicht so wie ich mir das
> dachte.

Teil uns doch mal mit, wo ran's gehackt hat.

von Dennis X. (Gast)


Lesenswert?

uint8_t temp = (rand()%8)+1;

von Frischling (Gast)


Lesenswert?

@ Teo Derix

Danke für deine Frage

Die Problme lagen daran das Mein AVR-Studio die Datei time.h nicht hat.
das andere war hat, das die Zahlen um die es ging jenseits von Gut und 
Böse waren.

@Dennis
dir auch danke aber es führte nicht so zum erfolg

Hier mal den Code ... denke mal das man es auch einfacher machen kann.
Wie gesagt .... ich bin ein Frischling
1
/*
2
 * Flasher.c
3
 *
4
 * Created: 11.05.2014 23:30:11
5
 *  Author: Frischling
6
 */ 
7
8
#define F_CPU 8000000UL
9
#include <avr/io.h>
10
11
12
int main(void)
13
{
14
15
16
  DDRD=0b11111111;
17
  while(1)
18
  {
19
// Flash 0
20
    PORTD=0b11111111;
21
    _delay_ms(500);
22
    PORTD=0b01111111;
23
    _delay_ms(30);
24
    PORTD=0b11111111;
25
    _delay_ms(30);
26
    PORTD=0b01111111;
27
    _delay_ms(30);
28
    PORTD=0b11111111;
29
    _delay_ms(30);
30
    PORTD=0b01111111;
31
    _delay_ms(30);
32
// Flash 1
33
    PORTD=0b11111111;
34
    _delay_ms(500);
35
    PORTD=0b10111111;
36
    _delay_ms(30);
37
    PORTD=0b11111111;
38
    _delay_ms(30);
39
    PORTD=0b10111111;
40
    _delay_ms(30);
41
    PORTD=0b11111111;
42
    _delay_ms(30);
43
    PORTD=0b10111111;
44
    _delay_ms(30);
45
// Flash 2
46
    PORTD=0b11111111;
47
    _delay_ms(500);
48
    PORTD=0b11011111;
49
    _delay_ms(30);
50
    PORTD=0b11111111;
51
    _delay_ms(30);
52
    PORTD=0b11011111;
53
    _delay_ms(30);
54
    PORTD=0b11111111;
55
    _delay_ms(30);
56
    PORTD=0b11011111;
57
    _delay_ms(30);
58
// Flash 3
59
    PORTD=0b11111111;
60
    _delay_ms(500);
61
    PORTD=0b11101111;
62
    _delay_ms(30);
63
    PORTD=0b11111111;
64
    _delay_ms(30);
65
    PORTD=0b11101111;
66
    _delay_ms(30);
67
    PORTD=0b11111111;
68
    _delay_ms(30);
69
    PORTD=0b11101111;
70
    _delay_ms(30);
71
// Flash 4
72
    PORTD=0b11111111;
73
    _delay_ms(500);
74
    PORTD=0b11110111;
75
    _delay_ms(30);
76
    PORTD=0b11111111;
77
    _delay_ms(30);
78
    PORTD=0b11110111;
79
    _delay_ms(30);
80
    PORTD=0b11111111;
81
    _delay_ms(30);
82
    PORTD=0b11110111;
83
    _delay_ms(30);
84
// Flash 5
85
    PORTD=0b11111111;
86
    _delay_ms(500);
87
    PORTD=0b11111011;
88
    _delay_ms(30);
89
    PORTD=0b11111111;
90
    _delay_ms(30);
91
    PORTD=0b11111011;
92
    _delay_ms(30);
93
    PORTD=0b11111111;
94
    _delay_ms(30);
95
    PORTD=0b11111011;
96
    _delay_ms(30);
97
// Flash 6
98
    PORTD=0b11111111;
99
    _delay_ms(500);
100
    PORTD=0b11111101;
101
    _delay_ms(30);
102
    PORTD=0b11111111;
103
    _delay_ms(30);
104
    PORTD=0b11111101;
105
    _delay_ms(30);
106
    PORTD=0b11111111;
107
    _delay_ms(30);
108
    PORTD=0b11111101;
109
    _delay_ms(30);
110
// Flash 7
111
    PORTD=0b11111111;
112
    _delay_ms(500);
113
    PORTD=0b11111110;
114
    _delay_ms(30);
115
    PORTD=0b11111111;
116
    _delay_ms(30);
117
    PORTD=0b11111110;
118
    _delay_ms(30);
119
    PORTD=0b11111111;
120
    _delay_ms(30);
121
    PORTD=0b11111110;
122
    _delay_ms(30);
123
  }
124
}

danke schon mal für die hilfe

von g457 (Gast)


Lesenswert?

> Hier mal den Code

Autsch. Willst Du nicht vielleicht noch etwas in [0] schmökern? Und in 
einem Buch über C?

Nix für ungut

[0] http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#

von Dennis X. (Gast)


Lesenswert?

Was in deinem Anhang ist der Ansatz für die Zufallszahlen? Also 
Pseudozufall bekommst du mit meiner Zeile genug... Und das sogar noch 
fast geschenkt.

von Karl H. (kbuchegg)


Lesenswert?

Frischling schrieb:

> Die Problme lagen daran das Mein AVR-Studio die Datei time.h nicht hat.

Ist egal. Dann machst du eben keinen srand am Anfang, in dem der 
Generator mit der aktuellen Zeit initialisiert wird.
Das hat, zumindest erst mal für dich, den Vorteil, dass du immer die 
gleiche Sequenz bekommst. Wenn du dann in deinen C Studien weiter bist, 
findest du noch viele andere Möglichkeiten, wie man diesen Teil auf 
einem AVR mit den dort vorhandenen Mitteln realisieren kann. Also stör 
dich erst mal nicht an diesem relativ unwichtigen Detail, dass du den 
Generator nicht 'zufällig' initialisiert bekommst.

> das andere war hat, das die Zahlen um die es ging jenseits von Gut und
> Böse waren.

Nö. Das ist genau definiert.
rand() liefert Zahlen zwischen 0 und RAND_MAX.
Und mit Zahlen kann man rechnen. Überhaupt dann, wenn man ein Computer 
ist.

Du solltest tatsächlich ein C-Buch lesen. Denn auf Dauer wird das 
nichts, wenn du immer nur mit Viertelwissen an die Dinge ran gehst, das 
du dir im Web zusammengesucht hast. Programmiersprachen sind komplex und 
voll mit kleinen Details, die man zum Grossteil alle wissen muss, wenn 
man programmieren will.

> dir auch danke aber es führte nicht so zum erfolg

Doch das tut es.
Aber dein Problem liegt viel tiefer.
Dein Problem liegt darin, dass dein ganzer Lauflichtansatz nicht 
brauchbar ist.
Das wieder ist auf mangelnde C Kentnisse zurückzuführen und darauf, dass 
du nicht mit Bitoperationen umgehen kannst.
Auch hier wieder: fehlende Kenntnisse kann man nicht durch Copy&Paste 
Programmierung und dem ändern von ein paar Zahlenwerten ersetzen!

Ein Lauflicht könnte zb so aussehen, auch wenn das im Prinzip keine gute 
Lösung ist. Aber darum geht es nicht. Es geht darum, dass dieser Ansatz 
vollkommen anders aussieht als deiner. Er ist kürzer, er ist 
übersichtlicher und er birgt den Grundstock, wie du die Sache auch mit 
Zufallszahlen pimpen kannst.
1
#define F_CPU 8000000UL
2
#include <avr/io.h>
3
#include <util/delay.h>
4
5
int main()
6
{
7
  uint8_t i;
8
9
  DDRD = 0xFF;
10
11
  PORTD = 0xFF;
12
  i = 7;
13
14
  while( 1 )
15
  {
16
    PORTD &= ~( 1 << i );
17
    _delay_ms( 300 );
18
    PORTD |= ( 1 << i );
19
20
    if( i == 0 )
21
      i = 7;
22
    else
23
      i--;
24
  }
25
}

: Bearbeitet durch User
von Kein Troll (Gast)


Lesenswert?

Wenn man wissen will was effektiv bei Zufallszahlen geschieht und nicht 
einfach einer aufgeblaehten library glauben will, nimmt man linear 
rueckgekoppelte schieberegister, sogenannte LFSR, die machen das 
definiert, mit wenig code.

von Karl H. (kbuchegg)


Lesenswert?

Kein Troll schrieb:
> Wenn man wissen will was effektiv bei Zufallszahlen geschieht und nicht
> einfach einer aufgeblaehten library glauben will


rand() ist keineswegs aufgebläht

LFR liefern meist qualitativ bessere Zufallszahlen als rand(), aber 
darum gehts hier in erster Linie gar nicht.
Für den Hausgebrauch ist es völlig wurscht, ob man aus rand() eine Zahl 
zurück bekommt oder aus einer Funktion lfr(). Zahl ist Zahl und die 
Frage wie es dann mit dieser Zahl im Programm weiter geht ist völlig 
unabhängig davon, wie diese Zahl zustande kam und ob die generierte 
Zufallsverteilung Spielbank-Ansprüchen genügt oder doch nicht ganz.

: Bearbeitet durch User
von Frischling (Gast)


Lesenswert?

Hallo Zusammen,

Erstmal danke für die antworten

Wenn ich dran denke wie das war, als der C64 in die Haushalte eingezogen 
ist und heute! ... Es ist viel mehr machbar und das Blöde ist, das macht 
sogar noch spass ! :)

Anyway...

Ich habe das mal hier gestecktbrettert und bischen rumgetüftelt!
So wie das aussieht und auch Funktioniert, gefält mir das schon mal sehr 
gut.

Meine Frage ist nun, ist es möglich das Flashen der einzelnen ausgängen 
unabhängig zu machen ?
Meine das jeder Kanal zeitlich unabhängig blinkt!

Zur zeit sieht das so aus !
1
#define F_CPU 8000000UL
2
#include <avr/io.h>
3
#include <util/delay.h>
4
#include <stdlib.h>
5
6
int main()
7
{
8
  uint8_t i;
9
10
  DDRD = 0xFF;
11
  PORTD = 0xFF;
12
13
  i = 4;
14
  while( 1 )
15
  {
16
    PORTD &= ~( 1 << i );
17
    _delay_ms( 40 );
18
    PORTD |= ( 1 << i );
19
    _delay_ms( 40 );
20
    PORTD &= ~( 1 << i );
21
    _delay_ms( 40 );
22
    PORTD |= ( 1 << i );
23
    _delay_ms( 40 );
24
    PORTD &= ~( 1 << i );
25
    _delay_ms( 40 );    
26
    PORTD |= ( 1 << i );
27
    _delay_ms( 40 );
28
    PORTD &= ~( 1 << i );
29
    _delay_ms( 200 );
30
  
31
    if( i == 0 )
32
    i = (rand()%4)+1;    
33
  
34
    else
35
    i--;
36
  }
37
}

von Mike (Gast)


Lesenswert?

Frischling schrieb:
> Zur zeit sieht das so aus !

Nicht schooohn wieder.
Setze dich in deinem C-Buch mal mit Schleifen auseinander.

> Meine Frage ist nun, ist es möglich das Flashen der einzelnen ausgängen
> unabhängig zu machen ?

Ja, indem du z.B. mit einem Timer erstmal eine feste Zeitbasis aufbaust 
und dann die LEDs unabhängig über Zustandsautomaten steuerst. Du trennst 
dabei Programmzyklus und LED-Zyklus, so dass du auch mehrere unabhängig 
voneinander laufen lassen kannst.

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.