Zitat Zitat von Auf Seite 197 in der ATmega8-Doku
Changing Channel or Reference Selection
The MUXn and REFS1:0 bits in the ADMUX Register are single buffered through a temporary
register to which the CPU has random access. This ensures that the channels
and reference selection only takes place at a safe point during the conversion. The
channel and reference selection is continuously updated until a conversion is started.
Once the conversion starts, the channel and reference selection is locked to ensure a
sufficient sampling time for the ADC. Continuous updating resumes in the last ADC
clock cycle before the conversion completes (ADIF in ADCSRA is set). Note that the
conversion starts on the following rising ADC clock edge after ADSC is written. The user
is thus advised not to write new channel or reference selection values to ADMUX until
one ADC clock cycle after ADSC is written.
If both ADFR and ADEN is written to one, an interrupt event can occur at any time. If the
ADMUX Register is changed in this period, the user cannot tell if the next conversion is
based on the old or the new settings. ADMUX can be safely updated in the following
ways:
1. When ADFR or ADEN is cleared.
2. During conversion, minimum one ADC clock cycle after the trigger event.
3. After a conversion, before the Interrupt Flag used as trigger source is cleared.
When updating ADMUX in one of these conditions, the new settings will affect the next
ADC conversion.
Punkt 1 ist klar, hier soll ADFR gesetzt sein.

Punkt 2 ist ein Timing um der S/H-Schaltung Zeit zu geben. Kein Einflus, da das Timing ja über den ADC-Interrupt kommt und wir dort ja den MUX 'umschalten' wollen. Und zwar möglichst schnell. ABER: 'Once the conversion starts, the channel and reference selection is locked' dies wird bestimmt auf das Timing achten!?!?

Punkt 3. Hier stehe ich etwas im Regen. Ich verstehe das so: Conversion ist fertig; Interrupt noch nicht ausgelösst; Unser Programm löscht das ADIF-Flag. Das aber kann nicht im Interrupt passieren, da er ja nicht ausgelösst wurde, und somit verstehe ich es so, das 'aus versehen' ein loopendes Hauptprogramm das Flag 'so nebenbei' zurücksetzt.
Das sollte unsere Loop also nicht unbedingt machen.


Gut; soweit lese ich hieraus, was im internen Ablauf in der CPU, zu welchem Zeitpunkt passiert, um die in ADMUX gesetzten Bits überhaupt zu berücksichtigen.

Nun folgendes aus der Doku:
Zitat Zitat von Auf Seite 198 in der ATmega8-Doku
ADC Input Channels
When changing channel selections, the user should observe the following guidelines to
ensure that the correct channel is selected:
In Single Conversion mode, always select the channel before starting the conversion.
The channel selection may be changed one ADC clock cycle after writing one to ADSC.
However, the simplest method is to wait for the conversion to complete before changing
the channel selection.
In Free Running mode, always select the channel before starting the first conversion.
The channel selection may be changed one ADC clock cycle after writing one to ADSC.
However, the simplest method is to wait for the first conversion to complete, and then
change the channel selection. Since the next conversion has already started automatically,
the next result will reflect the previous channel selection.
Subsequent conversions
will reflect the new channel selection.
Nicht dass ihr denkt, ich hätte das selbst geschrieben. Englisch war nicht unbedingt mein Lieblingsfach. Das lesen ist aber noch OK, so hoffe ich. Manchmal hapert es halt an der Interpretation.

Frage:
Warum läuft Weja's Bibliothek-Funktion? (Hier habe ich leider tatsächlich eine Vermutung. Trotz meiner Vermutung, ist sie aber in genau der vorliegenden Form funktionsfähig. Später mehr dazu bei Bedarf.)
Aber es kann ja noch folgende Frage beantwortet werden:
Was habe ich nicht an der Doku verstanden?