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 | }
|