Hallo Ralf,
das hat aber nichts mit aktivieren/deaktivieren vom ADC-Modul zu tun.
ADMUX ist ein IO-Register und das ist global statisch verfügbar. Wenn dort eine Funktion Bits setzt, bleiben diese Zustände erhalten.
Am Anfang deiner ADC-Wandel-Funktion stellst du den Eingangsmultiplexer so ein ...
ADMUX |= adc;
Die ODER Verknüpfung bewirkt, dass du hier nur Bits setzen kannst. Das ist der Grund, warum du nach ADC3 keinen andere Eingang wählen konntest. MUX1 und MUX0 waren immer gesetzt.
Da du VCC als Referenz verwendest (REFS0=0) und LeftAdjust ebenfalls deaktiviert ist (ADLAR=0) kannst du den Multiplexer zum Beispeil so einstellen.
ADMUX = adc & ((1<<MUX1) | (1<<MUX0));
Da du anscheinend auch permanent den ADC nutzt, kannst du das ADC-Modul einmalig am Anfang von main() aktivieren.
---
Vorteilhaft ist es, für die Mittelwertbildung immer 2^n Summierungen zu machen, da man dann schnell eine Division durch rechtsshift der Summe hinbekommt.
Beispiel: geteilt durch 8 entspricht Summe>>3
---
Dies
ADMUX |= (0 << REFS0);
hat übrigens keine Wirkung.
Dirk