www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ADC-Wert über DMA in SDRAM ablegen


Autor: Stefan S. (5tefan)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

ich versuche schon den ganzen Nachmittag vergebens einen 12 Bit ADC-Wert 
über den DMA-Controller im SDRAM abzulegen. Irgendwie scheint das ganze 
schon zu funktionieren, nur nicht so wie ich es will.

Der DMA legt im SDRAM auch Werte ab, allerdings nur das LOW-Byte der ADC 
Wandlung und dieses gleich doppelt (hintereinander).

Controller ist ein XMEGA128A1. Ich nutze ein XPLAIN-Board.

Burst-len ist auf 2 Bytes eingestellt, dann müsste er doch auch 2 Bytes 
abholen?
/ setup ADC for continuous acquisition 12 bits, single ended on 
// PORTA:0
  ADCA.CH0.CTRL |= 0x81; // configure single ended no gain on CH0
  ADCA.REFCTRL = 0x10;   // use internal Vref = VCC-0.6
  ADCA.CTRLB = 0x8;      // freerun, 12 bit right justified
  ADCA.CTRLA = 1;        // enable ADC

// configure DMA
  DMA.CTRL = 0x80;    // Enable, single buffer, round robin
  DMA.CH0.ADDRCTRL = 0xc5;// Reload source addr after each burst, incr des, fix src
  DMA.CH0.TRIGSRC= 0x10;  // ADCA CH0 is trigger source
  DMA.CH0.TRFCNT = 1;   // Buffer is len bytes

//des addr
  DMA.CH0.DESTADDR0  =0x00;
  DMA.CH0.DESTADDR1  =0x40;
  DMA.CH0.DESTADDR2  =0x00;
  
//src addr  
  DMA.CH0.SRCADDR0 =0x24;
  DMA.CH0.SRCADDR1 =0x02;
  DMA.CH0.SRCADDR2 =0x00;


// Enable, repeat, 2 byte, burst 
  DMA.CH0.CTRLA = 0x95;

Kann mir jemand von euch einen tipp geben, welches register ich falsch 
gesetzt habe?

Bin für jede Hilfe dankbar!

Autor: Peter Diener (pdiener) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>DMA.CH0.ADDRCTRL = 0xc5;// Reload source addr after each burst, incr des, fix src

Ohne das Handbuch genau gelesen zu haben, müsste fix source falsch sein. 
Man sollte eigentlich als Reload source das LSB vom ADC angeben und 
increment source einstellen. Dann wird die Quell- und Zieladresse um ein 
Byte hochgestellt, nachdem das erste Byte übertragen ist. So wie es 
jetzt ist, wird die Quelladresse nicht hochgestellt, daher die zwei 
gleichen Werte in den beiden Zielen.

Grüße,

Peter

Autor: XMEGA (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Stefan S. schrieb:
> DMA.CH0.ADDRCTRL = 0xc5;// Reload source addr after each burst, incr des, fix 
src

teste doch mal den Code:

// configure DMA
  DMA.CTRL = 0x80;    // Enable, single buffer, round robin
  DMA.CH0.ADDRCTRL = 0x95;// Reload source addr after each burst, incr 
src/des, reload dest end transact
  DMA.CH0.TRIGSRC= 0x10;  // ADCA CH0 is trigger source
  DMA.CH0.CTRLA = 0xA5;   // Enable, repeat, 2 byte, burst


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.