ADC 12Bit dsPIC33 CH Scanning - Index of the analog input
Dienstag, 22. Mai 2012
 
 

PIC Mikrocontroller Forum  |  PIC Mikrocontroller  |  PIC Mikrocontroller Allgemein  |  AD-Wandler (Allgemein)  |  ADC 12Bit dsPIC33 CH Scanning - Index of the analog input « vorheriges nächstes »
Seiten: [1] Nach unten Drucken
Autor Thema: ADC 12Bit dsPIC33 CH Scanning - Index of the analog input  (Gelesen 2106 mal)
 
zumax
Newbie
*
Offline Offline

Beiträge: 8


its nothing behind the line


Profil anzeigen
« am: April 16, 2009, 13:44:02 »

Hallo zusammen hab mal wieder ein kleineres Problem und hoffe einer/eine von euch findigen Entwicklern kann mir helfen.
Ich benutze einen dsPIC33FJ256MC510 sowie den ADC1 im 12 Bit mode, zudem wird ein DMA Buffer im Scatter/Gather mode verwendet, MPLAB IDE v8.20 und Michrochip C30 Toolsuit.
Nun folgende Problematik, ich möchte die Ports RB8/AN8 bis RB13/AN13 also 6 Ports scannen, für jeden Port sollen 8 Samples gemacht werden. Das Problem ist nun das wenn ich AN0 AN1 An2 AN3 AN4 An5 scanne passt es wenn meine Structs jeweils 6 Arrays enthalten (Adc1Ch0-Adc1Ch5). Für mich klingt dies soweit einleuchtend, da ja 6 Inputs gescanned werden also werden auch 6 Buffer benötigt! So möchte ich aber nun anstelle von AN0 bis AN5 die Ports AN8 bis AN13 scannen, also auch wieder 6 Inputs, dache ich mir wäre es kein Problem einfach das Register AD1CSSL auf 0x3F00 zu setzten und alles klappt wie zuvor, leider is dem nicht so, wie im Code teil zu erkennen ist muss ich nun mindestens 14 Arrays (Buffer) anlegen also (Adc1Ch0-Adc1Ch13).
Da nun aber ja nur die Channels AN8 bis AN13 gesacanned werden sind die Buffer von (Adc1Ch0-Adc1Ch7) alle leer mussten aber angelegt werden da ansonsten "CORE-E0003: Trap due to unimplemented RAM memory access, occurred from instruction at 0x000366" ausgespuckt wird! Nun is das ja aber ungeschickt weil die unteren 8 Buffer angelegt werden müssen die aber ja gar nicht befüllt werden! Auch wenn ich jetzt z.B. nur AN15 scannen möchte muss ich trotzdem 16 Buffer anlegen wobei dann 15 von diesen 16 leer sind und nie befüllt werden...Huch

"The ADC module provides a Scatter/Gather address to the DMA channel,
based on the index of the analog input and the size of the DMA buffer." Dieser Satz besagt ja das er in dem Scatter/Gather mode eine Indezierung durchführt. Mein Ziel ist es nun einfach nur 6 buffer zu verwenden da ja auch nur 6 Inputs gescanned werden, leider vermute ich das dies nicht klappen wird...
Hoffentlich hab ich mich relativ verständlich ausgedrückt und hoffe jemand hatte auch shcon mal mit dieser Problematik zu tun und kann bzw. will Smiley mir weiterhelfen, auch wenn er mir dann nur bestätigt das es anders nicht geht, dann kann ich das wenigstens meinem Chef ausrichten ^^

viele Grüße & good coding
Thomas

Code:
#include "p33fxxxx.h"
void InitADC_DMA();
void __attribute__((__interrupt__,no_auto_psv)) _DMA5Interrupt(void);
void RunADC_DMA();
void ProcessADCSamples(unsigned int * AdcBuffer);
int main (void);

//int  BufferA[6][8] __attribute__((space(dma),aligned(64)));
//int  BufferB[6][8] __attribute__((space(dma),aligned(64)));

struct
{
unsigned int Adc1Ch0[8];
unsigned int Adc1Ch1[8];
unsigned int Adc1Ch2[8];
unsigned int Adc1Ch3[8];
unsigned int Adc1Ch4[8];
unsigned int Adc1Ch5[8];
        unsigned int Adc1Ch6[8];
unsigned int Adc1Ch7[8];
unsigned int Adc1Ch8[8];
unsigned int Adc1Ch9[8];
unsigned int Adc1Ch10[8];
unsigned int Adc1Ch11[8];
unsigned int Adc1Ch12[8];
unsigned int Adc1Ch13[8];
//unsigned int Adc1Ch14[8];
//unsigned int Adc1Ch15[8];

} BufferA __attribute__((space(dma)));
struct
{
unsigned int Adc1Ch0[8];
unsigned int Adc1Ch1[8];
unsigned int Adc1Ch2[8];
unsigned int Adc1Ch3[8];
unsigned int Adc1Ch4[8];
unsigned int Adc1Ch5[8];
unsigned int Adc1Ch6[8];
unsigned int Adc1Ch7[8];
unsigned int Adc1Ch8[8];
unsigned int Adc1Ch9[8];
unsigned int Adc1Ch10[8];
unsigned int Adc1Ch11[8];
unsigned int Adc1Ch12[8];
unsigned int Adc1Ch13[8];
//unsigned int Adc1Ch14[8];
//unsigned int Adc1Ch15[8];
} BufferB __attribute__((space(dma)));


void InitADC_DMA()
{
AD1CON1bits.ADON = 0; //ADC is Off, set it off bevor configuration
AD1CON1bits.FORM = 0;   // Data Output Format: Signed Fraction (Q15 format)
AD1CON1bits.SSRC = 2;   // Sample Clock Source: GP Timer starts conversion
AD1CON1bits.ASAM = 1;   // Sampling begins immediately after conversion
AD1CON1bits.AD12B = 1;  // 12-bit ADC operation
AD1CON1bits.SIMSAM = 1; // Samples multiple channels sequentially

        AD1CON2bits.BUFM = 0;
AD1CON2bits.CSCNA = 1;  // Scan CH0+ Input Selections during Sample A bit
AD1CON2bits.CHPS = 0;   // Converts CH0

        AD1CON3bits.ADRC = 0;   // ADC Clock is derived from Systems Clock
AD1CON3bits.ADCS = 63;  // ADC Conversion Clock

       //AD1CHS0: A/D Input Select Register
AD1CHS0bits.CH0SA = 0;  // MUXA +ve input selection (AIN0) for CH0
AD1CHS0bits.CH0NA = 0;  // MUXA -ve input selection (Vref-) for CH0

       //AD1CHS123: A/D Input Select Register
AD1CHS123bits.CH123SA = 0; // MUXA +ve input selection (AIN0) for CH1
AD1CHS123bits.CH123NA = 0; // MUXA -ve input selection (Vref-) for CH1

       //AD1CSSH/AD1CSSL: A/D Input Scan Selection Register
AD1CSSH = 0x0000;
AD1CSSL = 0x3F00; // Scan AIN8, AIN9, AIN10, AIN11, AIN12, AIN13 inputs

//Set up Timer3 to trigger ADC1 conversions:

TMR3 = 0x0000;
PR3 = 4999;        // Trigger ADC1 every 125usec
IFS0bits.T3IF = 0; // Clear Timer 3 interrupt
IEC0bits.T3IE = 0; // Disable Timer 3 interrupt
T3CONbits.TON = 1; //Start Timer 3

//Set up DMA Channel 5 for Peripheral Indirect Addressing:

DMA5CONbits.AMODE = 2; // Configure DMA for Peripheral indirect mode
DMA5CONbits.MODE = 2;  // Configure DMA for Continuous Ping-Pong mode
DMA5PAD = (volatile unsigned int)&ADC1BUF0;// Point DMA to ADC1BUF0
DMA5CNT = 47; // 48 DMA request (6 buffers, each with 8 words)
DMA5REQ = 13; // Select ADC1 as DMA Request source
DMA5STA = __builtin_dmaoffset(&BufferA);
DMA5STB = __builtin_dmaoffset(&BufferB);
IFS3bits.DMA5IF = 0; //Clear the DMA interrupt flag bit
IEC3bits.DMA5IE = 1; //Set the DMA interrupt enable bit


}
void __attribute__((__interrupt__,no_auto_psv)) _DMA5Interrupt(void)
{
IFS3bits.DMA5IF = 0; //Clear the DMA5 Interrupt Flag
unsigned int DmaBuffer = 0;
// Switch between Primary and Secondary Ping-Pong buffers
if(DmaBuffer == 0)
{
/*
ProcessADCSamples(BufferA.Adc1Ch0);
ProcessADCSamples(BufferA.Adc1Ch1);
ProcessADCSamples(BufferA.Adc1Ch2);
ProcessADCSamples(BufferA.Adc1Ch3);
*/
}
else
{
/*
ProcessADCSamples(BufferB.Adc1Ch0);
ProcessADCSamples(BufferB.Adc1Ch1);
ProcessADCSamples(BufferB.Adc1Ch2);
ProcessADCSamples(BufferB.Adc1Ch3);
*/
}

DmaBuffer ^= 1;

}
//Set up ADC1 for DMA operation:
void RunADC_DMA()
{
AD1CON1bits.ADDMABM = 0; // DMA buffers are built in scatter/gather mode
AD1CON2bits.SMPI    = 5; // 6 ADC buffers
AD1CON4bits.DMABL   = 3; // Each buffer contains 8 words
       
IFS0bits.AD1IF      = 0; // Clear the A/D interrupt flag bit
IEC0bits.AD1IE      = 0; // Do Not Enable A/D interrupt
DMA5CONbits.CHEN    = 1; //Enable DMA0 channel
AD1CON1bits.ADON    = 1; // Turn on the A/D converter
}


void ProcessADCSamples(unsigned int * AdcBuffer)
{
char AdcBuffer_string[32];
// itoa_o(*AdcBuffer, AdcBuffer_string, 10);
}


int main (void)
{
InitADC_DMA();
RunADC_DMA();
while (1){}
}
Gespeichert
Beniu
Gast
« Antworten #1 am: Mai 25, 2009, 16:04:06 »

hey, hast du herausgefunden wie man es macht? habe nämlich ein ähnliches problem.
Gespeichert
Bernd
Globaler Moderator
Hero Member
*****
Offline Offline

Beiträge: 3815



Profil anzeigen
« Antworten #2 am: Mai 26, 2009, 21:45:11 »

Zitat
auch wenn er mir dann nur bestätigt das es anders nicht geht

In der gewählten Betriebsart geht es nicht anders. Siehe dazu die dsPIC33F Family Reference Section 16:

Zitat
In the example illustrated in Figure 16-15, it can be observed that the conversion results for the AN0, AN1 and AN2 inputs are stored in sequence, leaving no unused locations in their corresponding memory blocks. However, for the four analog inputs (AN4, AN5, AN6 and AN7) that are scanned by CH0, the first location in the AN5 block, the first two locations in the AN6 block and the first three locations in the AN7 block are unused, resulting in a relatively inefficient arrangement of data in the DMA buffer.

In Figure 16-15 kann man zudem sehr gut erkennen, daß der reservierte DMA RAM-Bereich für AN3 gänzlich ungenutzt bleibt.

Viele Grüße

Bernd
Gespeichert

Seiten: [1] Nach oben Drucken 
« vorheriges nächstes »
Gehe zu:  

Powered by MySQL Powered by PHP Made for Mozilla (Firefox) Made for Internet Explorer
Seite erstellt in 0.04 Sekunden mit 18 Zugriffen.
 
Top! Top!