Hallo,
ich habe mal eine Versuch unternommen. Das Ergebnis sieht nicht so schlecht aus. Ich hoffe, eine kleine Anregung für den ADC-Treiber geben zu können.
Es wird kein IRQ benutzt und ich prüfe auch nicht ob der ADC fertig ist. Ich wollte nur mal sehen ob
ich überhaupt ein Ergebnis bekomme. Die Funktion readADC macht nichts weiter als die Register
ADCAResLCH0 und ADCAResHCH0 zu lesen, den Code spare ich mir mal. Es gibt bei dem ADC auch einen SCAN-Mode bei dem dann mehrere Eingänge nacheinander abgearbeitet werden. Die Ergebnisse landen immer in den CH0-Ergebnisregistern. Ob der SCAN-Mode mit dem Freerun-Flag etwas zu tun hat, habe ich nicht verstanden.
Wenn man die ADC's in den verschieden ATXMega-Serien vergleicht, dann werden dort verschiedene Unteschiede in der Version mit und ohne Pipe's aufgelistet. Dazu gibt es auch eine kleine Doku die sich auf die Auswahl der Versionen bezieht, hatte Thorsten auch schon gefunden.
Weiterhin viel Erfolg bei der Arbeit.
Torsten
@ Thorsten und Rolf : Vielen Dank für die Unterstützung!
ich habe mal eine Versuch unternommen. Das Ergebnis sieht nicht so schlecht aus. Ich hoffe, eine kleine Anregung für den ADC-Treiber geben zu können.
Es wird kein IRQ benutzt und ich prüfe auch nicht ob der ADC fertig ist. Ich wollte nur mal sehen ob
ich überhaupt ein Ergebnis bekomme. Die Funktion readADC macht nichts weiter als die Register
ADCAResLCH0 und ADCAResHCH0 zu lesen, den Code spare ich mir mal. Es gibt bei dem ADC auch einen SCAN-Mode bei dem dann mehrere Eingänge nacheinander abgearbeitet werden. Die Ergebnisse landen immer in den CH0-Ergebnisregistern. Ob der SCAN-Mode mit dem Freerun-Flag etwas zu tun hat, habe ich nicht verstanden.
Wenn man die ADC's in den verschieden ATXMega-Serien vergleicht, dann werden dort verschiedene Unteschiede in der Version mit und ohne Pipe's aufgelistet. Dazu gibt es auch eine kleine Doku die sich auf die Auswahl der Versionen bezieht, hatte Thorsten auch schon gefunden.
Weiterhin viel Erfolg bei der Arbeit.
Torsten
@ Thorsten und Rolf : Vielen Dank für die Unterstützung!
Code
// Init ADC_A
ADCACTRLA := %00000001; // 2- CH0Start , 1-Flush, 0-Enable
ADCACTRLB := %00000000; // 12Bit
ADCAREFCTRL := %00000000; // REF 1V
ADCAEVCTRL := %00000000; // no events input
ADCAPRESCALER := %00000111; // clk DIV512
//
ADCACH0CTRL := %00000001; // single-ended pos input signal
// //x0000xxx
ADCACH0MUXCTRL := %00000000; // pin-0
//
ADCACH0INTCTRL := %00000000;
EnableInts($87);
loop
// Start Messung
// //x0000xxx
ADCACH0MUXCTRL := %00000000; // PortA pin-0
mdelay(1);
ADCACH0CTRL := ADCACH0CTRL or $80; // Start
mdelay(10);
temp := readADC;
writeln(SeroutD0,'ADC 0 '+ inttostr(temp));
// //x0000xxx
ADCACH0MUXCTRL := %00001000; // PortA pin-1
mdelay(1);
ADCACH0CTRL := ADCACH0CTRL or $80; // Start
mdelay(10);
temp := readADC;
writeln(SeroutD0,'ADC 1 '+ inttostr(temp));
// //x0000xxx
ADCACH0MUXCTRL := %00010000; // PortA pin-2
mdelay(1);
ADCACH0CTRL := ADCACH0CTRL or $80; // Start
mdelay(10);
temp := readADC;
writeln(SeroutD0,'ADC 2 '+ inttostr(temp));
mdelay(1000);
endloop;
ADCACTRLA := %00000001; // 2- CH0Start , 1-Flush, 0-Enable
ADCACTRLB := %00000000; // 12Bit
ADCAREFCTRL := %00000000; // REF 1V
ADCAEVCTRL := %00000000; // no events input
ADCAPRESCALER := %00000111; // clk DIV512
//
ADCACH0CTRL := %00000001; // single-ended pos input signal
// //x0000xxx
ADCACH0MUXCTRL := %00000000; // pin-0
//
ADCACH0INTCTRL := %00000000;
EnableInts($87);
loop
// Start Messung
// //x0000xxx
ADCACH0MUXCTRL := %00000000; // PortA pin-0
mdelay(1);
ADCACH0CTRL := ADCACH0CTRL or $80; // Start
mdelay(10);
temp := readADC;
writeln(SeroutD0,'ADC 0 '+ inttostr(temp));
// //x0000xxx
ADCACH0MUXCTRL := %00001000; // PortA pin-1
mdelay(1);
ADCACH0CTRL := ADCACH0CTRL or $80; // Start
mdelay(10);
temp := readADC;
writeln(SeroutD0,'ADC 1 '+ inttostr(temp));
// //x0000xxx
ADCACH0MUXCTRL := %00010000; // PortA pin-2
mdelay(1);
ADCACH0CTRL := ADCACH0CTRL or $80; // Start
mdelay(10);
temp := readADC;
writeln(SeroutD0,'ADC 2 '+ inttostr(temp));
mdelay(1000);
endloop;