Forum: Mikrocontroller und Digitale Elektronik SAM4 ADC Kanäle beim einlesen über DMA in "falscher" Reihenfolge


von Adam P. (adamap)


Lesenswert?

hallo zusammen,
ich implementiere zur zeit das einlesen mehrerer AD kanäle über DMA.
µC = SAM4LC8CA und SAM4LS8CA.
nun fällt mir auf, dass die gelieferten werte nicht der reihenfolge 
meiner konfiguration entsprechen.
sprich:
in meinem konfigurations-array vom typ
1
struct adc_cdma_first_config
 habe ich alle AD kanäle in aufsteigender reihenfolge, AD0, AD1..usw.

lese ich nur zwei kanäle, erhalte ich in meinem value-array die kanäle 
vertauscht, an index 0 ist kanal 1 und an index 1 ist kanal 0...ok.
aber lese ich nun 4, 7 oder 8 kanäle, dann ist an index 0 immer der 
letzte angegebene kanal und dann ab index 1 die restlichen in richtiger 
reihenfolge.

z.b.:
konfigurations-array = {AD0, AD1, ..., AD7}
dann enthält mein value-array (was ich über DMA erhalte):
value-array = {AD7, AD0, AD1, ..., AD6}.

übersehe ich da evtl. etwas oder wie könnte ich mir dieses phänomen 
erklären?
ist es vllt. jemandem von euch auch aufgefallen? vllt. mit dem ASF auf 
einem xmega oder anderem cortex von atmel?

p.s.: um fehler auszuschliessen, habe ich es ebenfalls mit dem bsp. 
probiert, welches von atmel für das SAM4LS X PLAINED PRO Board zur 
verfügung gestellt wird.

mfg adam

von Adam P. (adamap)


Lesenswert?

hallo nochmal...

hat vllt. wenigstens jemand eine idee oder anregung?
mein problem hat sich immer noch nicht gelöst.

von Dennis (Gast)


Lesenswert?

Hi,

poste mal bitte, womit du die DMA Konfig Register
beschreibst.

von Adam P. (adamap)


Lesenswert?

hallo,

sorry für die späte antwort, habe es übersehen, dass so schnell eine 
antwort gepostet wurde :(

anbei ein auszug. um die 3 AD werte in der reihenfolge x, y, z zu 
erhalten muss ich im mom das x zu letzt übertragen.
1
/*******************************************************************************
2
* ADC Konfiguration
3
*/
4
struct adc_config adc_cfg =
5
{
6
  /* System clock division factor is 16 */
7
  .prescal = ADC_PRESCAL_DIV64,
8
  /* The APB clock is used */
9
  .clksel = ADC_CLKSEL_APBCLK,
10
  /* Max speed is 150K */
11
  .speed = ADC_SPEED_75K,
12
  /* ADC Reference voltage */
13
  .refsel = ADC_REFSEL_2,
14
  /* Enables the Startup time */
15
  .start_up = CONFIG_ADC_STARTUP
16
};
17
18
/******************************************************************************/
19
struct adc_cdma_first_config adc_cdma_first_cfg[ADC_COUNT] =
20
{  
21
  /*** AD 01: Y-Achse ***/
22
  {
23
    .zoomrange = ADC_ZOOMRANGE_0,
24
    .muxneg = ADC_MUXNEG_3,
25
    .muxpos = ADC_MUXPOS_1,
26
    .internal = ADC_INTERNAL_2,
27
    .gcomp = ADC_GCOMP_DIS,
28
    .hwla = ADC_HWLA_DIS,
29
    .res = ADC_RES_12_BIT,
30
    .bipolar = ADC_BIPOLAR_SINGLEENDED,
31
    .gain = ADC_GAIN_ACCELEROMETER,
32
    .strig = 1,
33
    .tss = 1,
34
    .enstup = 1,
35
    .dw = 0
36
  },
37
  
38
  /*** AD 02: Z-Achse ***/
39
  {
40
    .zoomrange = ADC_ZOOMRANGE_0,
41
    .muxneg = ADC_MUXNEG_3,
42
    .muxpos = ADC_MUXPOS_2,
43
    .internal = ADC_INTERNAL_2,
44
    .gcomp = ADC_GCOMP_DIS,
45
    .hwla = ADC_HWLA_DIS,
46
    .res = ADC_RES_12_BIT,
47
    .bipolar = ADC_BIPOLAR_SINGLEENDED,
48
    .gain = ADC_GAIN_ACCELEROMETER,
49
    .strig = 1,
50
    .tss = 1,
51
    .enstup = 1,
52
    .dw = 0
53
  },
54
55
  /*** AD 00: X-Achse ***/
56
  {
57
    .zoomrange = ADC_ZOOMRANGE_0,
58
    .muxneg = ADC_MUXNEG_3,
59
    .muxpos = ADC_MUXPOS_0,
60
    .internal = ADC_INTERNAL_2,
61
    .gcomp = ADC_GCOMP_DIS,
62
    .hwla = ADC_HWLA_DIS,
63
    .res = ADC_RES_12_BIT,
64
    .bipolar = ADC_BIPOLAR_SINGLEENDED,
65
    .gain = ADC_GAIN_ACCELEROMETER,
66
    .strig = 1,
67
    .tss = 1,
68
    .enstup = 1,
69
    .dw = 0
70
  }
71
};
72
73
/******************************************************************************/
74
struct adc_pdca_config adc_pdca_cfg =
75
{
76
  /* ADC Window Mode */
77
  .wm = false,
78
  /* ADC Nb channel */
79
  .nb_channels = ADC_COUNT,
80
  /* ADC Buffer */
81
  .buffer = adc_sample_data,
82
  /* ADC PDC Rx Channel */
83
  .pdc_rx_channel = CONFIG_ADC_PDCA_RX_CHANNEL,
84
  /* ADC PDC Tx Channel */
85
  .pdc_tx_channel = CONFIG_ADC_PDCA_TX_CHANNEL,
86
  /* ADC CDMA Configuration Structure */
87
  .cdma_cfg = (void *)&adc_cdma_first_cfg[0]
88
};
89
90
/*******************************************************************************
91
 * Callback Funktion für PDCA Interrupt.
92
 */
93
static void porti_adc_pdca_done(enum pdca_channel_status status)
94
{
95
  if(status == PDCA_CH_TRANSFER_COMPLETED)
96
  {
97
    /* Configure PDCA for data transfer */
98
    pdca_channel_write_load(CONFIG_ADC_PDCA_RX_CHANNEL, adc_sample_data, ADC_COUNT);
99
    pdca_channel_write_load(CONFIG_ADC_PDCA_TX_CHANNEL, adc_cdma_first_cfg, ADC_COUNT);
100
    
101
    adc_conversion_flag = 1;
102
  }
103
}
104
105
/******************************************************************************/
106
uint8_t porti_adc_init(void)
107
{
108
  memset(adc_sample_data, 0x00, sizeof(adc_sample_data));
109
  
110
  if(adc_init(&adc_inst, ADCIFE, &adc_cfg) != STATUS_OK)
111
    return 1;
112
  
113
  adc_disable_interrupt(&adc_inst, ADC_SEQ_SEOC);
114
  adc_pdca_set_config(&adc_pdca_cfg);
115
  adc_configure_trigger(&adc_inst, ADC_TRIGGER_MODE);
116
  
117
  pdca_channel_set_callback(CONFIG_ADC_PDCA_RX_CHANNEL, porti_adc_pdca_done, PDCA_0_IRQn, PORTI_IRQ_PRIO, PDCA_IER_TRC);  
118
  pdca_channel_disable_interrupt(CONFIG_ADC_PDCA_RX_CHANNEL, PDCA_IER_TRC);
119
  
120
  return 0;
121
}

...kann gut möglich sein, dass ich da was übersehe oder falsch vorgehe.

gruß
adam

: Bearbeitet durch User
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.