Ja das mit dem A/D-Wandler, dem One-Shot-Modus und dem Noise-Reduction wird aus dem Datenblatt nicht klar.
Ich habe beim ATtiny13 die Dauer des Noise-Reduction-Mode gemessen und dabei Zeiten von unglaublichen 10 ADC-Takten ermittelt, obwohl ich ADCSRA.ADATE schön auf 0 gelassen habe und die Wandlung nur mit sleep einleite.
Das Testprogramm hatte ein festes Zeitschema, deshalb schwankte diese Zeit nicht; Erklärung folgt.
Des Rätsels Lösung: Der A/D-Wandler wird durch das Setzen von ADCSRA.ADSC immer in den kontinuierlichen Modus versetzt! Die erste Wandlung dauert 25 Takte, jede weitere 13* Takte. Dann kommen immer weiter Interrupts vom A/D-Wandler — und damit auch Messergebnisse. Bei gesperrten Interrupts, fest eingestelltem ADMUX und konstanter Spannung am Portpin fällt das gar nicht weiter auf.
Der Satz "The software may then set ADSC again, and a new
conversion will be initiated on the first rising ADC clock edge." stimmt also nicht. Allenfalls wird das Bit bei Interrupt wieder gelöscht.
ADCSRA.ADATE bewirkt demnach nur, dass man mit ADCSRB diesen Auto-Trigger auf einige Hardware-Ereignisse legen kann. Leider nicht auf Software. Habe ich nicht untersucht.
Richtig ist: sleep im Noise-Reduction-Mode legt alle synchrone Hardware lahm, insbesondere Timer, und damit bleiben PWM-Ausgänge stehen.
Und es setzt tatsächlich ADCSRA.ADSC. Was aber, wie oben angegeben, wirkungslos im kontinuierlichen Modus ist; genauer: Der Sampling-Zeitpunkt ist dann irgendwann davor, und das Umschalten von ADMUX oder einem externen Multiplexer ist wirkungslos weil zu spät.
Die beste Lösung, so scheint es mir, ist es, den A/D-Wandler nach einer Einzel-Wandlung explizit auszuschalten (ADCSRA.ADEN = 0).
Das bedeutet leider auch, dass der Zeitpunkt der Abtastung stets recht spät nach dem Start ist.
- Gemessen habe ich ziemlich exakte 13,5 Takte. Auch im Widerspruch zum Datenblatt. Aber wenigstens konstant. Beim ATmega328 waren es jedoch genau 13 Takte.