Hallo Leute, ich bins mal wieder =)
Hab mich jetzt mal an Sensoren gewagt, genauer gesagt Infrarotsensoren.
Die kann ich ja problemlos über den ADC auslesen. Als Controller
verwende ich einen Atmega 88. Hier ist meine ADC Initialisierung:
1 | void init_ADC()
|
2 | {
|
3 | /* ADC einschalten */
|
4 | ADCSRA |= (1<<ADEN);
|
5 |
|
6 | /* interne Referenzspannung; GND = Eingangspin */
|
7 | ADMUX |= (1<<REFS1) | (1<<REFS0) | (1<<MUX3) | (1<<MUX2) | (1<<MUX1) | (1<<MUX0);
|
8 |
|
9 | /* Prescaler von 128 */
|
10 | ADCSRA |= (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);
|
11 |
|
12 | dummyReadout();
|
13 |
|
14 | /* ADC Starten*/
|
15 | ADCSRA |= (1<<ADSC);
|
16 | }
|
17 |
|
18 |
|
19 | void dummyReadout()
|
20 | {
|
21 | uint8_t result;
|
22 |
|
23 |
|
24 | ADCSRA |= (1<<ADSC); // eine ADC-Wandlung
|
25 | while ( ADCSRA & (1<<ADSC) )
|
26 | {
|
27 | ; // auf Abschluss der Konvertierung warten
|
28 | }
|
29 | result = ADCW; // ADCW muss einmal gelesen werden,
|
30 | // sonst wird Ergebnis der nächsten Wandlung
|
31 |
|
32 | }
|
Das Register mit den Werten lese ich mittels eines Timers alle par
Millisekunden so aus:
1 | if(ADCCounter >= 30000)
|
2 | {
|
3 | ADCCounter = 0;
|
4 |
|
5 | /* ADC Register auslesen */
|
6 | distance = ADCL;
|
7 | distance += (ADCH<<8);
|
8 |
|
9 | char buffer[7];
|
10 | itoa( distance, buffer, 10 );
|
11 | putString(buffer);
|
12 |
|
13 | itoa( distance+8, buffer, 10 );
|
14 | putString(buffer);
|
15 | }
|
und schick es an den Computer. Dort bekomme ich aber nur immer 08080808.
Praktisch steht im ADC Register immer 0 ( die 8 addier ich so dazu).
Kann mir bitte jemand sagen was ich falsch gemacht habe?
MfG Atmega168