Also der Plan hinter dem sleep ist, diesen noise reduction-Modus zu
verwenden. Ich dachte mir, vielleicht ist das die Fehlerquelle. Mit ADIE
wird dieser eingestell und mit dem sleep gestartet. Sollte jetzt ein
anderer Interrupt die CPU vorzeitig wecken, dann schickt die Schleife
ihn so lange wieder schlafen, bis der ADC durch ist.
Meine Test-ISR ist folgende:
Da ich jedoch ADIF nicht setze, wird diese nicht angesprungen - soweit
mein Verständnis der Doku :)
Hier ohne sleep - die Ausgabe ist leider analog:
1 | ADMUX = (1<<REFS0) | (1<<MUX3) | (1<<MUX2) | (1<<MUX1) | (1<<MUX0); //internal reference
|
2 | ADCSRA = (1<<ADEN) | (1<<ADPS2) | (0<<ADPS1) | (0<<ADPS0); // adc on, prescaler = 8 => 125kHz
|
3 |
|
4 | int count = 0;
|
5 | while(1)
|
6 | {
|
7 | ADCSRA |= (1<<ADSC); // run adc
|
8 | while( ADCSRA & (1<<ADSC) ); // wait for adc
|
9 |
|
10 | uint8_t adcValueLow = ADCL; // low byte first
|
11 | uint8_t adcValueHigh = ADCH; // locked high byte
|
12 |
|
13 | uart_printf( "%d %d %d\r\n", count++, adcValueHigh, adcValueLow );
|
14 |
|
15 | long_delay(1000);
|
16 | }
|