Hallo Harry,
ich hatte beim XMEGA 384 auch mit dem ADC und dem AVRco Treiber Probleme.
Wenn Du willst probier mal anhand meines Codes den ADC ohne Treiber zu nutzen.
vars
Code
// ADC Werte
wADCBuffer : word;
adPort : byte;
xForADC : byte;
wADC0R : integer;
wADC1R : integer;
wADC2R : integer;
wADC3R : integer;
wADC0 : integer;
wADC1 : integer;
wADC2 : integer;
wADC3 : integer;
ADC0Filter : AVfilter[0..15] of integer;
ADC1Filter : AVfilter[0..15] of integer;
ADC2Filter : AVfilter[0..15] of integer;
ADC3Filter : AVfilter[0..15] of integer;
bCalLow : byte;
bCalHigh : byte;
Init ADCs
Code
///////////////
// INIT ADC
///////////////
ADCACTRLB := $00; // Auflösung auf 12bit und rechtsbündig
ADCAREFCTRL := $10; // INTVCC / 1.6
// ADCAREFCTRL := %00000100; // INTVCC/2
ADCAPRESCALER := %00000111; // ADCAPRESCALER auf 512
ADCACTRLA.0 := true; // Enable ADCA
ADCAEVCTRL := %00000000; // no events input
// INIT CH0
// PIN0CTRLA:= %01011000; // pullup und INVERT
DDRA.0:= 0; // 0=EINGANG 1=Ausgang
DDRA.1:= 0; // 0=EINGANG 1=Ausgang
DDRA.2:= 0; // 0=EINGANG 1=Ausgang
DDRA.3:= 0; // 0=EINGANG 1=Ausgang
// ADC Kalibrierung
// bCalLow:= ReadProductionRow(word(ADCACAL0));
// bCalHigh:= ReadProductionRow(word(ADCACAL1));
// DebugOut('low: '+ByteToHex(bCalLow));
// DebugOut('High: '+ByteToHex(bCalHigh));
// InitADCCH0
ADCACH0CTRL := $01; // singleended
ADCACH0MUXCTRL := $0; // MUX CTRL MAXPOS ADC0
ADCACH0CTRL := ADCACH0CTRL OR $01; // singleended
ADCACH0INTCTRL := %00000000;
ADCACH0CTRL.7 := true; // Starte neue Messung
Read einzeln ADC
Code
// READADC
if adPort >=4 then adPort:=0;endif; // ADC Zähler auf 0 stellen
//Messung abgeschlossen?
if ADCACH0INTFLAG.0 then
ADCACH0INTFLAG.0:=false; // Flag reset
// PORTPIN ADC0
if adPort = 0 then
LO(wADCBuffer):= ADCACH0RESL; // Ziehe Werte
HI(wADCBuffer):= ADCACH0RESH;
AddAVfilter(ADC0Filter,integer(wADCBuffer) );
inc(xForADC);
if xForADC >=20 then
ADCACTRLA.1 := true; // flush
inc(adPort);
ADCACH0MUXCTRL := %00001000; // MUX CTRL MAXPOS ADC1 nächster Port
xForADC:=0;
wADC0:= GetAVfilter(ADC0Filter);
endif;
// PORTPIN ADC1
elsif adPort = 1 then
LO(wADCBuffer):= ADCACH0RESL; // Ziehe Werte
HI(wADCBuffer):= ADCACH0RESH;
AddAVfilter(ADC1Filter,integer(wADCBuffer) );
inc(xForADC);
if xForADC >=20 then
ADCACTRLA.1 := true; // flush
inc(adPort);
ADCACH0MUXCTRL := %00010000; // MUX CTRL MAXPOS ADC2 nächster Port
xForADC:=0;
wADC1:= GetAVfilter(ADC1Filter);
endif;
// PORTPIN ADC2
elsif adPort = 2 then
LO(wADCBuffer):= ADCACH0RESL; // Ziehe Werte
HI(wADCBuffer):= ADCACH0RESH;
AddAVfilter(ADC2Filter,integer(wADCBuffer) );
inc(xForADC);
if xForADC >=20 then
ADCACTRLA.1 := true; // flush
inc(adPort);
ADCACH0MUXCTRL := %00011000; // MUX CTRL MAXPOS ADC3 nächster Port
xForADC:=0;
wADC2:= GetAVfilter(ADC2Filter);
endif;
// PORTPIN ADC3
elsif adPort >= 3 then
LO(wADCBuffer):= ADCACH0RESL; // Ziehe Werte
HI(wADCBuffer):= ADCACH0RESH;
AddAVfilter(ADC3Filter,integer(wADCBuffer) );
inc(xForADC);
if xForADC >=20 then
ADCACTRLA.1 := true; // flush
inc(adPort);
ADCACH0MUXCTRL := %00000000; // MUX CTRL MAXPOS ADC0 nächster Port
xForADC:=0;
wADC3:= GetAVfilter(ADC3Filter);
endif;
endif;
ADCACH0CTRL.7 := true; // Starte neue Messung
endif; // Endif Flag ADC Messung fertig
Du musst es halt für Deine Anwendung / CPU anpassen.
Thorsten