1 | //###############################################################################################
|
2 | // Funktionsdefinitionen zur Erzeugung der Zufallszahl über Rauschen ############################
|
3 | //###############################################################################################
|
4 |
|
5 | // für ATMEGA644P, 8Mhz Quarz, ADC an PA0
|
6 |
|
7 | uint8_t Zufallszahl_erzeugen (void)
|
8 |
|
9 | {
|
10 |
|
11 | //DDRA &= ~( 1 << DDA0 ); // PA0 als Eingang definiert, logisch Null, für ADC Wandlung
|
12 | //PORTA &= ~( 1 << PA0 ); // PA0 auf Low, Pull-Up-Widerstände deaktiviert
|
13 |
|
14 | uint8_t low, high;
|
15 | uint8_t zeiger = 0, zufallszahl = 0;
|
16 |
|
17 | ACSR = 0x00; // Register ACSR und ADCSRA werden zur Sicherheit auf
|
18 | ADCSRA = 0x00; // logisch Null gesetzt
|
19 | ADCSRA |= (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0); // ADC aktiviert
|
20 | // Teilungsfaktor 128, der
|
21 | // Takt muss immer zwischen
|
22 | // (50-200)kHz liegen!
|
23 | // 8Mhz/128 = 62.5kHz
|
24 | ADMUX = 0x00;
|
25 | ADMUX |= (1 << REFS0) | (0 <<MUX2) | (0 <<MUX1) | (0 <<MUX0) ;
|
26 | // AVCC als Referenz - REFS0 = 1
|
27 | // ADC0 (PA0) als ADC-Eingang - Mux4...0 = 0
|
28 | // ADLAR Bit nicht gesetzt, daher 8 Bit im ADCL
|
29 | // und 2 Bit im ADCH
|
30 |
|
31 | // Messvorgang zum Warmlaufen, Ergebnis wird verworfen //////////////////////////////////////
|
32 |
|
33 | ADCSRA |= (1 << ADSC); // Messvorgang starten
|
34 | while (ADCSRA & (1 << ADSC)) // auf Abschluss der Konvertierung warten
|
35 | {
|
36 | }
|
37 | low = ADCL; // ADCL/H muss einmal gelesen werden, sonst wird das
|
38 | high = ADCH; // Ergebnis der nächsten Wandlung nicht übernommen.
|
39 | low = 0;
|
40 | high = 0;
|
41 |
|
42 | // Eigentlicher Messvorgang, dessen Ergebnis verwendet wird /////////////////////////////////////////
|
43 |
|
44 | int counter;
|
45 |
|
46 | for (counter=1; counter <=7; counter++)
|
47 | {
|
48 |
|
49 | ADCSRA |= (1 << ADSC); // Messvorgang starten
|
50 | while (ADCSRA & (1 << ADSC)) // auf Abschluss der Konvertierung warten
|
51 | {
|
52 | }
|
53 |
|
54 | // Es wird immer nur das niederwertigste Bit von ADCL geprüft
|
55 |
|
56 | if (ADCL & (1<<0)) // niederwertigstes Bit von ADCL ist 1, ADCL wird gelesen
|
57 | { // =(ADCL & (1<<Bit))schiebe "1" auf "Bit"-Stelle
|
58 | zufallszahl |= (1 << zeiger); // Zeiger auf Bit in zufallszahl, welches auf 1 gesetzt wird
|
59 | }
|
60 | else // ansonsten, niederwertigstes Bit von ADCL ist 0
|
61 | {
|
62 | zufallszahl &= ~(1 << zeiger); // Zeiger auf Bit in zufallszahl, welches auf 0 gesetzt wird
|
63 | }
|
64 |
|
65 | zeiger++;
|
66 |
|
67 | low = ADCL;
|
68 | high = ADCH; // ADCL/H müssen einmal gelesen werden, sonst
|
69 | // wird das Ergebnis der Wandlung nicht übernommen
|
70 | }
|
71 |
|
72 | ADCSRA = 0x00; // Register ADCSRA und ADMUX werden wieder auf logisch
|
73 | ADMUX = 0x00; // Null gesetzt, da momentan nicht mehr benötigt
|
74 |
|
75 | //DDRA = 0xff; // Port A als Ausgang definiert
|
76 | //PORTA = 0b00000000; // BS 170 Ebene 1 - 7 abschalten
|
77 |
|
78 | return zufallszahl;
|
79 | }
|