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
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.
@ 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
> 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#
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.
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
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.
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
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 | }
|
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.