Der ADC von meinem Atmega 8 gibt, obwohl der entsprechende Pin über
einen Widerstand an VCC hängt nur 1023 aus, hängt er an GND bekomme ich
0.
Aber: Wenn der Pin in der Luft hängt bekomme ich was von ~500.
1 | uint16_t ReadChannel(uint8_t mux){
|
2 | uint8_t i;
|
3 | uint16_t result;
|
4 |
|
5 | ADMUX = mux; // Kanal waehlen
|
6 | ADMUX |= (1<<REFS0); // AVCC Referenzspannung nutzen
|
7 |
|
8 | ADCSRA = (1<<ADEN) | (1<<ADPS1) | (1<<ADPS0); // Frequenzvorteiler
|
9 | // setzen auf 8 (1) und ADC aktivieren (1)
|
10 |
|
11 | /* nach Aktivieren des ADC wird ein "Dummy-Readout" empfohlen, man liest
|
12 | also einen Wert und verwirft diesen, um den ADC "warmlaufen zu lassen" */
|
13 | ADCSRA |= (1<<ADSC); // eine ADC-Wandlung
|
14 | while ( ADCSRA & (1<<ADSC) ) {
|
15 | ; // auf Abschluss der Konvertierung warten
|
16 | }
|
17 | result = ADCW; // ADCW muss einmal gelesen werden,
|
18 | // sonst wird Ergebnis der nächsten Wandlung
|
19 | // nicht übernommen.
|
20 |
|
21 | /* Eigentliche Messung - Mittelwert aus 4 aufeinanderfolgenden Wandlungen */
|
22 | result = 0;
|
23 | for( i=0; i<4; i++ )
|
24 | {
|
25 | ADCSRA |= (1<<ADSC); // eine Wandlung "single conversion"
|
26 | while ( ADCSRA & (1<<ADSC) ) {
|
27 | ; // auf Abschluss der Konvertierung warten
|
28 | }
|
29 | result += ADCW; // Wandlungsergebnisse aufaddieren
|
30 | }
|
31 | ADCSRA &= ~(1<<ADEN); // ADC deaktivieren (2)
|
32 |
|
33 | result /= 4; // Summe durch vier teilen = arithm. Mittelwert
|
34 |
|
35 | return result;
|
36 | }
|