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