XMega ADC konfigurieren

Gast #3821417
Lesenswert?

Hi,
ich weiß das zu dem Thema schon viele Artikel existieren aber ich 
probieren seit ein paar Tagen schon den ADC des ATXMEGA16E5 ans laufen 
zu bekommen, aber das will einfach nicht funktionieren.

Ich will im Prizip einfach nur den ADC testen und zwar will ich die 
Spannung am Port PA2 messen. Im Freerunning-Mode.
Im moment sieht mein Programm ca. so aus:
void main()
{
ADCA.CTRLA= 0x01;        //ADC-ENABLE
  ADCA.CTRLB = 0b00011010;    //CURRLIMIT=NO,SIGNED,FREERUN,8BIT-RIGHT

  ADCA.REFCTRL = 0b00100000;    //AREFA  als Referenzspannung
  ADCA.PRESCALER = 0x00;      //VORTEILER=4
  ADCA.CH0.CTRL = 0x02;      //Differential input signal
  ADCA.CH0.MUXCTRL = 0b00001000;  //MUXPOS=ADC1 pin
  ADCA.CH0.INTCTRL = 0x03;    //INTER-ENTABLE, HIGH-PRIORITY

  ADCA.CH0.CTRL|=0x80;      //ADC Starten
  printf("REGISTER CTRL: %d\r\n",ADCA.CH0.CTRL);
  /* End of Initialization */

  printf("STARTE WHILE\r\n\r\n");
  while(1)
  {
    while(!ADCA.CH0.INTFLAGS);
    printf("VALUE: %d\n\r",ADCA.CH0.RESL);
    ADCA.CH0.INTFLAGS=0;
  }
}

Wenn ich mir den Wert eines Registers ,also z.B. von ADCA.CTRLB, ausgebe 
ist der Wert immer 0 egal was ich setze. Was mach ich falsch??
Gast #3821483
Lesenswert?

Das hab ich auch schon gefunden und ein wenig angepasst ausprobiert. Das 
ist aber ja auch ein anderes Problem. Bei mir arbeitet der ADC halt 
überhaupt nicht. Ich bin mir auch nicht ganz sicher was das Register 
MUXCTRL angeht. Im Manual steht nähmlich, dass MUXNEG nur gesetzt werden 
kann wenn INPUTMODE = 10 oder 11 ist. für die anderen Fälle steht nichts 
im Manual.
Gast #3821506
Lesenswert?

Aber der ADC setzt ja nicht mal das ADCA_INTFLAG da kann ich doch an dem 
pin machen was ich will, oder? Ich tippe mal auf die Konfiguration aber 
ich les schon seit xTagen das Manual rauf und runter, aber ich find 
einfach nicht den Fehler. Ein poti dazwischen löten wird schwierig, das 
die Platine schon fertig ist und nur aus smd bauteilen besteht.
#3821560
Lesenswert?

Franz schrieb:
> ADCA.CH0.INTCTRL = 0x03;    //INTER-ENTABLE, HIGH-PRIORITY

Hast du eine ISR für den Interrupt? Wenn nicht springt der MC nach jeder 
Messung in eine nicht-definierte ISR.

Da du die Messung manuell ausliest brauchst du keinen Interrupt dafür. 
Oder du lässt das manuelle auslesen weg und machst dir eine ISR dafür.

Beispiel, welches bei mit funktioniert:
1
Init:
2
  // ADCB
3
  ADCB.REFCTRL = ADC_REFSEL_AREFB_gc;
4
  ADCB.PRESCALER = ADC_PRESCALER_DIV16_gc;
5
  ADCB.CTRLB = ADC_RESOLUTION_8BIT_gc;
6
  ADCB.CTRLA = ADC_ENABLE_bm;
7
  
8
  // Ch0: Input
9
  ADCB.CH0.CTRL = ADC_CH_INPUTMODE_SINGLEENDED_gc;
10
  ADCB.CH0.MUXCTRL =  ADC_CH_MUXPOS_PIN7_gc;
11

12
Auslesen:
13
  ADCB.CH0.CTRL |= ADC_CH_START_bm;
14
  while(!(ADCB.CH0.INTFLAGS & 1))
15
    ;
16
  
17
  capture[pos] = ADCB.CH0.RES;

Mehr Info: http://kampis-elektroecke.de/?page_id=1644
Gast #4150914
Lesenswert?

Hallo Franz,

kannst du bitte die Lösung genauer beschreiben? Ich habe ein ähnliches 
Problem. Wenn ich auch nur versuche den ADC zu konfigurieren, werden die 
Register nicht beschrieben.
Mein C-Code:
1
ADCA.REFCTRL = ADC_REFSEL_AREFB_gc;
2
ADCA.PRESCALER = ADC_PRESCALER_DIV32_gc;
3
ADCA.CH0.CTRL = ADC_CH_INPUTMODE_SINGLEENDED_gc;
4
ADCA.CH0.MUXCTRL = ADC_CH_MUXPOS_PIN9_gc;
5
ADCA.CTRLA = ADC_ENABLE_bm | ADC_CH0START_bm;
Disassembly:
1
ADCA.REFCTRL = ADC_REFSEL_AREFB_gc;
2
0000141E  LDI R30,0x00    Load immediate 
3
0000141F  LDI R31,0x02    Load immediate 
4
00001420  LDI R24,0x30    Load immediate 
5
00001421  STD Z+2,R24    Store indirect with displacement 
6
  ADCA.PRESCALER = ADC_PRESCALER_DIV32_gc;
7
00001422  LDI R24,0x03    Load immediate 
8
00001423  STD Z+4,R24    Store indirect with displacement 
9
  ADCA.CH0.CTRL = ADC_CH_INPUTMODE_SINGLEENDED_gc;
10
00001424  LDI R24,0x01    Load immediate 
11
00001425  STD Z+32,R24    Store indirect with displacement 
12
  ADCA.CH0.MUXCTRL = ADC_CH_MUXPOS_PIN9_gc;
13
00001426  LDI R24,0x48    Load immediate 
14
00001427  STD Z+33,R24    Store indirect with displacement 
15
  ADCA.CTRLA = ADC_ENABLE_bm | ADC_CH0START_bm;
16
00001428  LDI R24,0x05    Load immediate 
17
00001429  STD Z+0,R24    Store indirect with displacement 
18
0000142A  RET     Subroutine return
Weder im Simulator, noch im Chip (Debugger über JTAGICE mkII) werden die 
ADC-Register mit den richtigen Werten beschrieben, sondern bleiben nach 
den STD-Befehlen weiterhin auf null. Vielen Dank

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren