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
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
Pseodozufallszahlengenerator gibts hier: Beitrag "Zufallszahlen" In der Forumsuche findet man genug zu diesem Thema
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 | }
|
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; }
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".
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.