Hallo oberallgeier,

um ein bischen beim verdauen zu helfen hier einmal die Kurzversion:
Code:
// Dabei sind (in der Reihenfolge ihres Auftretens):
- "Zeit-Variablen"
  count36kHz und timebase (Asuro-LIB-Konform)
- "Logische-Kanal-Variable"
  sens_i.adc_do_akt
    Für den Begriff 'frei' wird ADC_DO_NICHTS benutzt
- "Verzögerungs-Variable"
  sens_i.adc_delay
- "Taster-Interrupt-Variable"
  interne Variable, die im Tasten-Interrupt gesetzt wird.
- ADMUX
  Ist das im AVR enthaltene Register

   Timer-Interrupt (1/36000 Sekunden)
   {
      Erhöhe "Zeit-Variable[n]"
      WENN "Logische-Kanal-Variable" 'frei' ist
       und (weitere Bedingungen)
      DANN
         Bestimme Wert für "Logische-Kanal-Variable"
           - Berücksichtige Batterie anhand "Zeit-Variable"
           - Berücksichtige Taster anhand "Taster-Interrupt-Variable"
         Setze ADMUX auf entsprechenden pysikalischen Kanal
         Setze "Verzögerungs-Variable"
      ENDE-WENN

      WENN "Logische-Kanal-Variable" NICHT 'frei' ist
       und "Zeit-Variable" > "Verzögerungs-Variable"
      DANN
         Speicher die Daten in den x0-Werten (für IR-Übertragung)
         Starte ADC-Wandler
      ENDE-WENN
   }

   ADC-Interrupt (Nur nach einem Start aus Timer-Interupt möglich)
                 (Oder etwas doch nicht?)
   {
      Hole 16-Bit-ADC-Ergebnis
      Speicher die Daten in den x1-Werten (für IR-Übertragung)
      CASE "Logische-Kanal-Variable"
         TASTER:
            ADC-Wert intern merken
         BATTERIE:
            Bilde Mittelwert und intern merken
         LINIE (4 logische Kanäle):
            Hell-/Dunkelmessung intern merken
         RAD (2 oder 4 logische Kanäle über ADC_RAD_VERHALTEN):
            Berechne TIK und speicher in internen Variablen
      ENDE-CASE
      Setze "Logische-Kanal-Variable" zurück auf 'frei' für Timer-Interrupt
   }
Der ADC wird NICHT im Free-Running-Mode gestartet.
Somit startet eine weitere Wandlung nur dann, wenn der Timer-Interrupt dies macht.
Auch die Änderung am ADMUX wird im Timer gemacht, und kann somit frühestens nach 1/36000 Sekunden erfolgen. Nämlich erst im nächsten Timer-Interrupt.
Das von dir angesprochenes Problem, dass eine Änderung am ADMUX direkt nach einem Start erfolgt, sollte somit nie auftreten.
Genau dieses 'Unschärfe' ist mir bekannt, und deshalb kontrolliere ich den ADC und das Timing komplett selber. (Zumindest versuche ich es)

Die 36kHz und die 200kHz haben meiner Meinung nach nichts miteinander zu tun.
Der Timer ackert so vor sich hin und startet eine ADC-Wandlung im "36kHz * 'Verzögerungs-Variable'"-Raster.
Dann kommt die ADC-Wandlergeschwindigkeit mit der konfigurierten Geschwindigkeit erst ins Spiel. Es dauert halt ein bisschen, bis der ADC-Interrupt sich meldet. Vor allem, da ich den Start der Wandlung ja künstlich in Timer-Einheiten verzögere.
In dieser ADC-Wandler-Zeit will/darf ich natürlich keine Änderungen an der Variablen "Logische-Kanal-Variable" und am Register ADMUX haben. Sonst bekäme ich ja genau das von dir angesprochene Problem.
Deshalb die Belegung der "Logische-Kanal-Variable" mit 'frei' bzw. bei dem Wunsch eine Wandlung zu starten mit dem im Timer bestimmten Wert für den logischen Kanal. Aber eben nur dann, wenn der ADC 'frei' ist.
Und erst nach der ADC-Wandlung im ADC-Interrupt wieder die 'frei'gabe.


Ich hoffe, dass dies etwas Überblick gebracht hat,
Trink nen leckeren Roten dazu. Am besten ein Glas für mich mit.

Gruß Sternthaler