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


von Stefan S. (5tefan)


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?
1
/ setup ADC for continuous acquisition 12 bits, single ended on 
2
// PORTA:0
3
  ADCA.CH0.CTRL |= 0x81; // configure single ended no gain on CH0
4
  ADCA.REFCTRL = 0x10;   // use internal Vref = VCC-0.6
5
  ADCA.CTRLB = 0x8;      // freerun, 12 bit right justified
6
  ADCA.CTRLA = 1;        // enable ADC
7
8
// configure DMA
9
  DMA.CTRL = 0x80;    // Enable, single buffer, round robin
10
  DMA.CH0.ADDRCTRL = 0xc5;// Reload source addr after each burst, incr des, fix src
11
  DMA.CH0.TRIGSRC= 0x10;  // ADCA CH0 is trigger source
12
  DMA.CH0.TRFCNT = 1;   // Buffer is len bytes
13
14
//des addr
15
  DMA.CH0.DESTADDR0  =0x00;
16
  DMA.CH0.DESTADDR1  =0x40;
17
  DMA.CH0.DESTADDR2  =0x00;
18
  
19
//src addr  
20
  DMA.CH0.SRCADDR0 =0x24;
21
  DMA.CH0.SRCADDR1 =0x02;
22
  DMA.CH0.SRCADDR2 =0x00;
23
24
25
// Enable, repeat, 2 byte, burst 
26
  DMA.CH0.CTRLA = 0x95;

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

Bin für jede Hilfe dankbar!

von Peter D. (pdiener) Benutzerseite


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

von XMEGA (Gast)


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

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.