Forum: Mikrocontroller und Digitale Elektronik Xmega64D3 ADC funktioniert nicht


von NEU (Gast)


Lesenswert?

Hallo ich habe einen Atxmega64 D3 und möchte ein analoges Signal von PA2 
digitalisieren.

Leider wandelt mein ADC nichts und bleibt hier stecken: 
while(!ADCA.CH0.INTFLAGS);

Was habe ich falsch gemacht?


void adc_init(void)
{
  PORTA.DIR = 0;
  ADCA.CTRLA |= ADC_ENABLE_bm;        // enable adc
  ADCA.CTRLB |= ADC_RESOLUTION_8BIT_gc;    // 8 bit unsigned conversion 
(pos 11bits)
  ADCA.REFCTRL = ADC_REFSEL_INT1V_gc | 0x02;           // internal 1V 
bandgap reference
  ADCA.PRESCALER = ADC_PRESCALER_DIV512_gc;             // peripheral 
clk/16 (2MHz/16=125kHz)
  ADCA.CH0.CTRL = ADC_CH_INPUTMODE_SINGLEENDED_gc;
  ADCA.CH0.MUXCTRL = ADC_CH_MUXPOS_PIN2_gc ;      // PORTA:2
  ADCA.CH0.INTCTRL = ADC_CH_INTLVL_MED_gc;              // ME level 
interrupt
}



int main(void)
{
adc_init();

// Alle Interrupt Levels aktivieren
PMIC.CTRL = PMIC_HILVLEN_bm | PMIC_MEDLVLEN_bm | PMIC_LOLVLEN_bm;

// Interrupts global an
sei();

while(1)
{

  int16_t result;
  ADCA.CH0.CTRL |= ADC_CH_START_bm;
   while(!ADCA.CH0.INTFLAGS);
  result = ADCA.CH0RES;


}

von XMEGA (Gast)


Lesenswert?

Hallo,


>NEU schrieb:

Der Code  sollte eigentlich ok sein.

Außer: ADCA.CH0.INTCTRL = ADC_CH_INTLVL_MED_gc;

Hier sollte dann noch eine ADCA-Interrupt-Funktion folgen.

Oder mit ADC_CH_INTLVL_OFF_gc den Interrupt ausschalten.

Ob das der Fehler ist kann ich nicht sagen.

Gruß XMEGA

von NEU (Gast)


Lesenswert?

Ich habe den Fehler gefunde. Es war eine "alte" header- Datei 
eingebunden. Dort hat der MUX- des ADCs wohl noch nicht funktioniert. 
Durch das einbinden des neuen Header iox64d3.h funktioniert der ADC.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.