www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik XMEGA:ADC Daten per DMA in den RAM


Autor: Matze (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: XMEGA (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: XMEGA (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.