Forum: Mikrocontroller und Digitale Elektronik Wie funktioniert der DMA am Xmega


von René (Gast)


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

von Hiiilllffeee (Gast)


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?

von R--- S. (rene66)


Lesenswert?

Kricht man hier nur noch blöde Antworten oder ist hier jemand neidisch 
;-)
Die Appnotes habe ich (versucht zu)(ge)lesen aber das hat mich nicht 
sonderlich weitergebracht.
Adwandler  Uart  Timer habe ich hinbekommen aber DMA?

von fast so (Gast)


Lesenswert?

Es gibt sicher ein Kapitel : Igge und da DMA...

von Hauke R. (lafkaschar) Benutzerseite


Lesenswert?

Schick mir ein Sample vom Xmega und ich sag dir wie es geht ;)

von Simon K. (simon) Benutzerseite


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.

von R--- S. (rene66)


Lesenswert?

hab leider auch nur den einen. Aber es soll jetzt nicht mehr lange 
dauern bis es welche gibt habe ich gehört.

von Hauke R. (lafkaschar) Benutzerseite


Lesenswert?

Ja ich warte schon die ganze Zeit drauf :/

von Achim (Gast)


Lesenswert?

>Ja ich warte schon die ganze Zeit drauf :/

Frag doch mal bei Markus Burrer (EmbedIT.de) nach.
Vielleicht hat er noch einen...

von Felix B. (e-b)


Angehängte Dateien:

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

von R--- S. (rene66)


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.

von Matthias L. (matze88)


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]

von ... .. (docean) Benutzerseite


Lesenswert?

Der Speicher und die Performance eines XMega schreit ja gerade nach C 
oder C++...

Warum nimmt man das dann nicht?

von R--- S. (rene66)


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

von Gast (Gast)


Lesenswert?

Das was du willst, ist das der ADC der DMA Flowcontroller (ADC initiiert 
den Datentransfer) ist.
Ob das der XMega kann, weis ich nicht, aber danach solltest du das 
Datenblatt durchsuchen.

Gruß

von Christoph L. (clauer)


Lesenswert?

Hier ich habe ein Video gedreht und Beispielcode --> 
http://www.christoph-lauer.de/Homepage/Blog/Eintrage/2010/8/25_Selfmade_Microcontroller_Spectrumanalyzer.html


Viel Spass,
Christoph

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
Noch kein Account? Hier anmelden.