Danke für die Tipps !
Im DB steht leider nicht wirklich etwas über die Zeit die zwischen dem
umMuxen vergehen sollte. :/
Das Tut von StromFlow ist super, habe damit auch angefangen gehabt, nur
geht es dort auch nicht um mehr als 4 Channels.
Am RevA Liegt 3V3 an, mit der auch die Sensoren gespeist werden. Deren
Spannungen liegen dann zwischen 0V und 3V3.
Ich habe nun folgendes gemacht:
Aus dem DB geht hervor das eine 12Bit Wandlung bei 32MHz ~3.5µs dauert.
Das gibt genug Zeit um alle 1ms mal nen Wert zuholen (getestet bis
runter auf 100µs) und nach dem Auslesen die Mux zuändern.
Habe nun also einen Timer, der mit die Werte Einliest und dann umMuxt.
Kann die Letzten Werte dann aus einem Array auslesen.
(Alles noch bissel unschön und mit viel Code)
void timerC0_init(void){ // 1ms
TCC0.PER = 30;
TCC0.CTRLA |= TC_CLKSEL_DIV1024_gc;
TCC0.INTCTRLA |= TC_OVFINTLVL_HI_gc;
}
volatile char stat = 0;
ISR (TCC0_OVF_vect){
if(stat == 0) {
while(!ADCA.CH0.INTFLAGS);
values[4] = ADCA_CH0RES;
while(!ADCA.CH1.INTFLAGS);
values[5] = ADCA_CH1RES;
while(!ADCA.CH2.INTFLAGS);
values[6] = ADCA_CH2RES;
while(!ADCA.CH3.INTFLAGS);
values[7] = ADCA_CH3RES;
ADCA.CH0.MUXCTRL = ADC_CH_MUXPOS_PIN0_gc;
ADCA.CH1.MUXCTRL = ADC_CH_MUXPOS_PIN1_gc;
ADCA.CH2.MUXCTRL = ADC_CH_MUXPOS_PIN2_gc;
ADCA.CH3.MUXCTRL = ADC_CH_MUXPOS_PIN3_gc;
ADCA.CTRLA = ADC_FLUSH_bm |1;
ADCA.CH0.CTRL = ADC_CH_START_bm | ADC_CH_INPUTMODE0_bm;
ADCA.CH1.CTRL = ADC_CH_START_bm | ADC_CH_INPUTMODE0_bm;
ADCA.CH2.CTRL = ADC_CH_START_bm | ADC_CH_INPUTMODE0_bm;
ADCA.CH3.CTRL = ADC_CH_START_bm | ADC_CH_INPUTMODE0_bm;
stat = 1;
} else {
while(!ADCA.CH0.INTFLAGS);
values[0] = ADCA_CH0RES;
while(!ADCA.CH1.INTFLAGS);
values[1] = ADCA_CH1RES;
while(!ADCA.CH2.INTFLAGS);
values[2] = ADCA_CH2RES;
while(!ADCA.CH3.INTFLAGS);
values[3] = ADCA_CH3RES;
ADCA.CH0.MUXCTRL = ADC_CH_MUXPOS_PIN4_gc;
ADCA.CH1.MUXCTRL = ADC_CH_MUXPOS_PIN5_gc;
ADCA.CH2.MUXCTRL = ADC_CH_MUXPOS_PIN6_gc;
ADCA.CH3.MUXCTRL = ADC_CH_MUXPOS_PIN7_gc;
ADCA.CTRLA = ADC_FLUSH_bm | 1;
ADCA.CH0.CTRL = ADC_CH_START_bm | ADC_CH_INPUTMODE0_bm;
ADCA.CH1.CTRL = ADC_CH_START_bm | ADC_CH_INPUTMODE0_bm;
ADCA.CH2.CTRL = ADC_CH_START_bm | ADC_CH_INPUTMODE0_bm;
ADCA.CH3.CTRL = ADC_CH_START_bm | ADC_CH_INPUTMODE0_bm;
stat = 0;
}
}