Hallo, ich bin stehe jetzt schon seit einigen Stunden vor einem Problem. Ich möchte (relativ) schnell den internen ADC des Xmega auslesen. Insgesamt starte ich den ADC 500 mal mit dem Start Conversion Bit. Wenn der ADC fertig ist soll er die Daten automatisch in ein Array kopieren. Dazu nutze ich die DMA (ist ja genau dafür da). Mein Problem ist, dass es nicht funktioniert. Ich habe verschiedene Einstellungen ausprobiert. Meine Triggerquelle ist ADC0. Wenn ich das Transfer Count Register auf 1 setze und im Single Shot Modus bin, dann kopiert er nur ein Byte und schaltet sich danach ab (DMA Enable=false). Wenn ich im Repeat Mode arbeite, dann kopiert er mir aller zwei Takte ein Byte, obwohl der ADC noch längst nicht fertig ist. Ursache ist wahrscheinlich, dass das ADC Conversion Complete Flag immer gesetzt bleibt. Laut Datenblatt wird es erst gelöscht wenn die entsprechende ISR aufgerufen wird. Das sind aber unnötige Takte für mich. Da ist die zeitliche Einsparung durch die DMA wieder weg. Da kann ich die Daten auch manuell in das Array kopieren. Hier mein Code: >//DMA Init >DMA.CH0.ADDRCTRL= 0b0001; //don´t reload dest after transaktion,Dest inc >DMA.CH0.TRIGSRC = 0x10; //Trigger: ADC0 CH0 >DMA.CH0.TRFCNT = 1; //Es solljeweils 1 Byte kopiert werden >DMA.CH0.SRCADDR2= 0; //ADC.CH0.RESL >DMA.CH0.SRCADDR1= 0x02; >DMA.CH0.SRCADDR0= 0x10; >DMA.CH0.DESTADDR2= ((unsigned int)(&data[0]))>>16; >DMA.CH0.DESTADDR1= 0xFF & ((unsigned int)(&data[0])>>8); >DMA.CH0.DESTADDR0= 0xFF & ((unsigned int)(&data[0])); >DMA.CH0.CTRLA = DMA_CH_SINGLE_bm | DMA_CH_BURSTLEN_1BYTE_gc; >DMA.CH0.CTRLA |= DMA_CH_ENABLE_bm; // | DMA_CH_SINGLE_bm; >DMA.CTRL = DMA_ENABLE_bm; //enable DMA with single buffer, round robin ADC starten und auslesen: >for (x=0;x<500;x++) >{ > ADCA.CH0.CTRL|=ADC_CH_START_bm; //Conversion starten >...hier werden ein paar Ports gesetzt >} Vielleicht könnt ihr mir ja helfen. Gruß, Matze
Servus, Matze schrieb: > Vielleicht könnt ihr mir ja helfen. bin auch gerade am probieren. Funktionieren tut das: Beitrag "GPS-Parser für XMEGA" Das habe ich mir als Vorlage genommen. DMA leider nur mit normalen kopieren von Datensätzen. Aber es funktioniert! Gruß XMEGA
Hallo, bin nochmals da. Matze schrieb: > Dazu nutze ich die DMA Ich habe auf meiner Homepage einen funktionierenden ADC_DMA Code eingestellt. http://www.basteln-mit-avr.de/atxmega32a4.html Gruß XMEGA
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.