Wie funktioniert der DMA am Xmega

Gast #1134219
Lesenswert?

Hallo,

ich versuche Krampfhaft die Ergebnisse einer 3 Kanal AD-Wandlung per DMA 
in den RAM ab Adresse ab 0x2000 zu schreiben ich möchte das nicht per 
Interrupt erledigen sondern per DMA wenn die Wandlung beendet ist.
Ich habe zum ersten mal was mit einem DMA zu tun und weiß auch das ich 
Adressen vorgeben muss aber wie und welche entzieht sich meines Wissens.
Hiiilllffeee
Gast #1134239
Lesenswert?

www.atmel.com

Der Xmega kann etwas mehr als eure anderen Spielzeuge. Da muss man halt 
die Bedienungsanleitung lesen. (Datasheet Appnotes).

Deine Frage kommt mir so vor:
Hilfe ich will ein 911-Turbo Motor in mein Fahrrad einbauen kann aber 
nur löten. Wie mach ich das?
Persönliche Seite #1134297
Lesenswert?

Wo ist das Problem? Wenn der xmega nicht gerade dein Einstiegsprozessor 
ist, sehe ich nicht woran das Ganze scheitern soll. Der DMA kann halt im 
Hintergrund (sehr flexibel) Kopieroperationen vornehmen, ohne, dass der 
Hauptprozessor was mitbekommt. Logischerweise muss man dafür die DMA 
konfigurieren (Wieviele Daten, Adresse, paar andere Sachen) und 
aktivieren, bzw. aktivieren lassen.

Ich hab's schließlich auch schon hingekriegt per DMA und UART im SPI 
Mode einen externen A/D Wandler im Hintergrund einzulesen.
#1134669
Lesenswert?

So dan lies dir nochmals diese AppNote durch. Da ist erklärt wie DMA 
Funktioniert. Auf der Atmel HP findest du auch Code Beispiele.

Du brauchst sicher auch noch ein aktuelles Datenblatt deines Xmegas.

Ansonsten sind wir sicher bereit dir konkrete Fragen zu beantworten. 
Aber "Allgemeine Hilferufe" haben wenig Chance. Du sollst auch zeigen 
was du schon unternommen hast.

Wenn wir Ingenieure neu uCs bekommen/auswählen heisst es halt auch die 
Dokumentation zu studieren. Dies braucht halt seine Zeit. Je mehr 
Erfahrung man als Ingenieur hat desto einfacher geht das aber.


Cheers
Felix
Angehängte Dateien:
#1134703
Lesenswert?

AVR1304 ist alles in C ich versuche mich in asm (mache ich lieber).
Wo auf der Atmel Seite finde ich Codebeispiele?
Ich habe mich schon dammlich gesucht und nichts gefunden außer die 
Application Notes meinst Du das?
Das Datenblatt habe ich auch mir ist nur nicht klar wie ich die 
Ergebnisse der AD-Wandlung per DMA in den RAM des Controllers schreiben 
kann.
Aber danke für den Input.
#1134777
Lesenswert?

ATXmega16A4
dma enable
5.14.4: Trigger Source -> 0x10 (ADCA Channel 0)
5.14.3: source increment, reload after burst, destination increment 
(reload after block)
Burstlength 2, Blocksize -> Deine wahl, wie groß dein Array im Sram ist.
Srcadr ADCA Adresse, Dst.Addr Startadresse im SRam.

channel enable

Nun lüppts.

Mein Vorwissen: Garkeins bezüglich XMega.
Mein Aufwand: 15 Minuten mit dem XMega Datenblatt und dem Abschreiben 
aus AVR1304.

Warum kannst du das nicht genauso wie ich?

[edit] nach deinem neusten beitrag sagst du, dass du das Beispiel nicht 
von C nach ASM kriegst?! Also bitte, da wird einmal der "Treiber" 
definiert, der einfach die Register mit den übergebenen Parametern füllt 
und im Beispiel dieser Treiber mit Beispielparametern aufgerufen... Wenn 
DORT bereits dein Problem liegt, dann solltest du nochmal bei 
irgendwelchen Grundlagen anfangen. Für dein Programm reicht es doch, 
wenn du gleich die Register entsprechend füllst.
Klar, Statusmeldungen von der DMA sind da jetzt noch nicht mit drin, 
aber das wird wohl auch nicht so schwer sein...[/edit]
#1136102
Lesenswert?

Hallo,

habe das jetzt so gemacht ich weiß aber nicht ob das im Sinne des 
Erfinders ist.

1. DMA einschalten
2. Trigger Kanal im DMA auswählen hier AD Wandler
3. Quelle Wählen und hier weiß ich nicht ob das so richtig ist denn ich 
greife hier direkt auf das Result Register CH0 des AD Wandlers zu und 
schiebe das in den Ram ab 0x2000.
4. Enable DMA Kanal 0

Jetzt eine Frage
Das Enable Kanal 0 Bit wird nach jeder Übertragung ausgeschalten soll 
das so sein denn die Triggerquelle ist der AD Wandler B. Ich dachte ich 
kann das automatisch im Hintergrund laufen lassen ohne per Software das 
Bit setzen zu müssen und was für eine Bedeutung hat das DMA Selection 
Register im AD Wandler speziell DAMSEL 1 und 2.

ldi  temp,DMA_CH_ENABLE_bm
sts  DMA_CTRL,temp                 ;einschalten
ldi  temp,DMA_CH_TRIGSRC_ADCB_CH4_gc; Trigger Kanal 0,1,2,3
sts  DMA_CH0_TRIGSRC,temp

ldi temp,low(ADCB_CH0RES)
sts DMA_CH0_SRCADDR0,temp  // Channel Source Address 0
ldi temp,high(ADCB_CH0RES);0x20
sts DMA_CH0_SRCADDR1,temp   // Channel Source Address 1
ldi temp,0x00
sts DMA_CH0_SRCADDR2,temp   // Channel Source Address 2
ldi temp,0x00
sts DMA_CH0_DESTADDR0,temp  // Channel Destination Address 0
ldi temp,0x20
sts DMA_CH0_DESTADDR1,temp  // Channel Destination Address 1
ldi temp,0x00
sts DMA_CH0_DESTADDR2,temp  // Channel Destination Address 1

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren