www.mikrocontroller.net

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


Autor: René (Gast)
Datum:

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

Autor: Hiiilllffeee (Gast)
Datum:

Bewertung
-1 lesenswert
nicht 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?

Autor: R--- S--- (rene66)
Datum:

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

Autor: fast so (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es gibt sicher ein Kapitel : Igge und da DMA...

Autor: Hauke Radtki (lafkaschar) Benutzerseite
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
Schick mir ein Sample vom Xmega und ich sag dir wie es geht ;)

Autor: Simon K. (simon) Benutzerseite
Datum:

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

Autor: R--- S--- (rene66)
Datum:

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

Autor: Hauke Radtki (lafkaschar) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja ich warte schon die ganze Zeit drauf :/

Autor: Achim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Ja ich warte schon die ganze Zeit drauf :/

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

Autor: Felix Bonjour (e-b)
Datum:
Angehängte Dateien:

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

Autor: R--- S--- (rene66)
Datum:

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

Autor: Matthias Larisch (matze88)
Datum:

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

Autor: ... ... (docean) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Speicher und die Performance eines XMega schreit ja gerade nach C 
oder C++...

Warum nimmt man das dann nicht?

Autor: R--- S--- (rene66)
Datum:

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

Autor: Gast (Gast)
Datum:

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

Autor: Christoph Lauer (clauer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier ich habe ein Video gedreht und Beispielcode --> 
http://www.christoph-lauer.de/Homepage/Blog/Eintra...


Viel Spass,
Christoph

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.