Gerhard H. schrieb:
> Nun habe ich das Problem was ich programmiertechnisch tun muss um
> zBps wenn ich ADC0 ausgelesen habe bei Bedarf auf ADC2 umschalte um
> dort den Wert auszulesen.
Das ist (für jemanden wie dich) tatsächlich garnicht so einfach. Man
muss nämlich drei Sachen zu (bis zu) drei verschiedenen Zeitpunkten tun:
1) Umschalten von ADMUX vom "Normalkanal" auf den ausnahmsweise
gewünschten Kanal. Das ist trivial und kann (zumindest theoretisch)
jederzeit problemlos erfolgen. Praktisch allerdings nicht, dazu später
mehr.
2) Zurückschalten von ADMUX auf den "Normalkanal". Das ist ziemlich
kitzlig, denn dass darf nicht zu früh erfolgen und nicht zu spät. Das
Zeitfenster für die Umschaltung entspricht genau einem Zyklus des
AD-Wandlers. Das Zeitfenster beginnt beim Eintreffen des ersten
Wandlerergebnisses nach 1) und endet KURZ VOR dem Eintreffen des zweiten
Wandlerergebnisses nach 1).
3) Abfischen des einen richtigen Samples für den ausnahmsweise
gewünschten Kanal aus dem Strom der Samples für den Normalkanal. Das
eine richtige Sample ist genau das, was als ZWEITES nach 1) eintrifft.
Hört sich sehr kompliziert an? Ist es auch. Mit deinem Programmieransatz
ist sowas nämlich praktisch kaum zuverlässig lösbar. Zuverlässig wird es
erst, wenn man die gesamte AD-Wandlung auf einen interruptbasierten
Ansatz hebt und die Wahl der Kanäle mit der Arbeit der Wandlerhardware
über die ISR synchronisiert.
Dann gibt es nämlich nur noch einen Zeitpunkt im Wandlerzyklus, an dem
irgendetwas passiert: der Zeitpunkt des ADC-Interrupts. Das vereinfacht
alles extrem. Es bleibt aber leider immer noch ein wenig kompliziert,
man muss in parallelen Vorgängen denken können, um das richtig zu
handhaben.
Der Trick besteht aus zwei Teilen:
1) Einzig und allein die ISR wählt den Wandlerkanal der Hardware. Man
muss die Kanalwahl also erstmal im RAM puffern, wenn man sie zu jeder
beliebigen Zeit vornehmen will. Erst die ISR tut es (die Einstellung von
ADMUX) dann im richtigen Moment tatsächlich.
2) Einzig und allein die ISR holt die Ergebnisse vom AD-Wandler und
ordnet sie den Kanälen zu, denn nur sie kann wissen, zu welchem Kanal
welches Ergebnis gehört. Es ist nämlich dann genau der Kanal, der exakt
ZWEI Wandlerzyklen zuvor durch sie selber gewählt wurde.
Das ist nur das Grundkonzept. Das variiert man dann. Für das Szenario,
dass es einen "Normalkanal" gibt und nur gelegentlich einzelne Samples
eines anderen Kanals benötigt werden, würde die ISR z.B. ganz anders
aussehen als in einem Szenario, in dem mehrere Kanäle mit konstanter
Samplerate gewandelt werden sollen.
Alles in allem: das ist schon sowas wie tatsächlich programmieren. Im
Gegensatz zu: Wichsvorlagen aus dem Netz zusammen zu kleben...