ADC_Test.c


1
#include <avr/io.h>
2
#define BAUD 9600L
3
#define F_CPU 12000000L
4
#define UBRR_VAL ((F_CPU+BAUD * 8)/(BAUD*16)-1)      
5
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))         //reale Baudrate
6
7
volatile uint16_t result;
8
volatile uint16_t wert;
9
10
uint8_t i;
11
12
13
14
15
void usart_init(void)
16
{
17
    UCSRB = (1<<TXEN);            // UART TX einschalten
18
    UCSRC = (1 << URSEL) | (1 << UCSZ1) | (1 << UCSZ0); // Asynchron 8N1 
19
 
20
    UBRRH = UBRR_VAL >> 8;
21
    UBRRL = UBRR_VAL & 0xFF;
22
}
23
24
25
void put(uint16_t wert)
26
{
27
  while (!(UCSRA & (1<<UDRE)))  /* warten bis Senden moeglich */
28
    {
29
    }                 
30
  UDR = wert;
31
  
32
}
33
34
volatile uint16_t adc(uint8_t mux)
35
{
36
  
37
  ADMUX = mux;
38
  ADMUX |= (1<<REFS0);         // AVcc nutzen
39
    ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1);   // Frequenzvorteiler setzen auf 64 und ADC aktivieren
40
 
41
    /* nach Aktivieren des ADC wird ein "Dummy-Readout" empfohlen, man liest
42
       also einen Wert und verwirft diesen, um den ADC "warmlaufen zu lassen" */
43
    ADCSRA |= (1<<ADSC);                      // eine ADC-Wandlung 
44
    while ( ADCSRA & (1<<ADSC) );             // auf Abschluss der Konvertierung warten 
45
    result = ADCW;  // ADCW muss einmal gelesen werden, sonst wird Ergebnis der nächsten Wandlung nicht übernommen.
46
 
47
    /* Eigentliche Messung - Mittelwert aus 4 aufeinanderfolgenden Wandlungen */
48
    result = 0; 
49
     for( i=0; i<4; i++ )
50
    {
51
    ADCSRA |= (1<<ADSC);            // eine Wandlung "single conversion"
52
      while ( ADCSRA & (1<<ADSC) );     // auf Abschluss der Konvertierung warten
53
      result += ADCW;            // Wandlungsergebnisse aufaddieren
54
    }
55
    ADCSRA &= ~(1<<ADEN);               // ADC deaktivieren
56
 
57
    result /= 4;                       // Summe durch vier teilen = arithm. Mittelwert
58
 
59
  return result;
60
}
61
62
void main(void)
63
{
64
  wert = adc(0);
65
  put(wert);
66
}