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
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?
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?
Schick mir ein Sample vom Xmega und ich sag dir wie es geht ;)
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.
hab leider auch nur den einen. Aber es soll jetzt nicht mehr lange dauern bis es welche gibt habe ich gehört.
>Ja ich warte schon die ganze Zeit drauf :/
Frag doch mal bei Markus Burrer (EmbedIT.de) nach.
Vielleicht hat er noch einen...
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
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.
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]
Der Speicher und die Performance eines XMega schreit ja gerade nach C oder C++... Warum nimmt man das dann nicht?
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
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ß
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.