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