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??
Hi
>ADCA.CH0.INTFLAGS=0;
E-Manual:
The bit can also be cleared by writing a one to the bit location.
MfG Spess
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.
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.
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.
wenn ich printf("REGISTER: %d\r\n", ADCA.CTRLA); ausgeben lasse kommt 0 raus unabhängig von dem Register. Wieso?
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
Ä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.
Also ich hab grade gelesen, dass ich mit dem avrisp mk2 nicht debuggen kann
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
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.