Hallo oberallgeier,
um ein bischen beim verdauen zu helfen hier einmal die Kurzversion:
Der ADC wird NICHT im Free-Running-Mode gestartet.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 }
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
Lesezeichen