Zufall.c


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
  }