Forum: Mikrocontroller und Digitale Elektronik XMega ADC konfigurieren


von Franz (Gast)


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??

von spess53 (Gast)


Lesenswert?

Hi

>ADCA.CH0.INTFLAGS=0;

E-Manual:

The bit can also be cleared by writing a one to the bit location.

MfG Spess

von Franz (Gast)


Lesenswert?

Danke für die schnelle Antwort!
Ups, da hab ich was übersehen :P, aber wenn ich das änder klappt es 
trotzdem nicht. Das Programm geht gar nicht aus der 
while(!ADCA.CH0.INTFLAGS); raus.

von jo (Gast)


Lesenswert?


von jo (Gast)


Lesenswert?

Sorry, den adc-Teil hat er wohl rausgenommen...

von Franz (Gast)


Lesenswert?

jo schrieb:
> http://www.stromflo.de/dokuwiki/doku.php?id=xmega-c-tutorial

Das nenn ich mal ein ausführliches tutorial :D
aber das hilft mir nicht weiter, weil der adc leider nicht behandelt 
wird.

von jo (Gast)


Lesenswert?


von Franz (Gast)


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.

von jo (Gast)


Lesenswert?

Wie ist deine Beschaltung zum Adc? Wie testest du?

Gruß Jonas

von Franz (Gast)


Angehängte Dateien:

Lesenswert?

Ich lass mir die ergebnisse des ADC über den UART auf den PC ausgeben 
(wenn der ADC denn funktioniert). Der Digitale wert den ich haben will 
kommt an PA1 an.

von jo (Gast)


Lesenswert?

Löt halt mal ein 10K-Poti als Spannungsteiler rein und teste damit. Du 
hast da ja so viele potentielle Fehlerquellen drinne, das muss ja nicht 
mal am ADC liegen...

Gruß Jonas

von Franz (Gast)


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.

von Franz (Gast)


Lesenswert?

wenn ich
printf("REGISTER: %d\r\n", ADCA.CTRLA);
ausgeben lasse kommt 0 raus unabhängig von dem Register. Wieso?

von jo (Gast)


Lesenswert?

Lies halt das register vorher aus in eine lokale variable.

von Franz (Gast)


Lesenswert?

Das hab ich natürlich auch schon probiert. Ich dreh langsam echt durch. 
Diese XMegas sind einfach total unübersichtlich. Egal was ich mache, in 
den Registern steht 0

von jo (Gast)


Lesenswert?

Hast du was zum on-chip debugging über jtag?

von Franz (Gast)


Lesenswert?

Ähh damit hatte ich bis jetzt noch nichts zu tun, ich hab einen AVRISP 
mk2 zum flashen von dem Controller und arbeite mit dem AVR-Studio6.

von Franz (Gast)


Lesenswert?

Also ich hab grade gelesen, dass ich mit dem avrisp mk2 nicht debuggen 
kann

von Marcel J. (majong)


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

von Franz (Gast)


Lesenswert?

Ich hab den Fehler!!
Irgendwie verträgt sich der ADC nicht mit der Funktion die die 
Tanktfrequenz des Controllers einstellt. Warum weiß ich noch nicht.
Vielen Dank an alle

von Nickel (Gast)


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

von Nickel (Gast)


Lesenswert?

Gelöst.
ASF scheint wohl den Saft abgedreht zu haben (eigentlich nur USB CDC und 
NVM aktiviert).
1
PR.PRPA  &= ~PR_ADC_bm;
vor der Konfiguration hat das Problem behoben.

von Moby (Gast)


Lesenswert?

Doku lesen und (Register) in Asm proggen, dann dreht niemand mehr den 
Saft ab und die Fehlersuche gestaltet sich generell einfacher ;-)

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.