Hi,
I am using MSP430F5438. I want to trigger the DMA transfer as ADC12IFG is set when ADC12MEM0 is loaded with conversion result. My problem is that my DMA does not initiate any transfer.
ADC12IFG is cleared automatically afterit is set and DMA is triggered.
Any help would be appreciated much.
Regards
Here is my code:
#include <__cross_studio_io.h>#include "msp430x54x.h"#include "inmsp.h"
#define NUMRESULTS 1000unsigned char results[NUMRESULTS]; unsigned int index = 0;
void main(void){
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
////////////////////////////////// DMA Configuration (0) /////////////////////////////////////// // Using DMA channel 0 i.e., DMA0
DMACTL0 = DMA0TSEL_24; // Using ADC12IFG.0 as DMA trigger source
DMACTL4 = DMARMWDIS;
DMA0CTL = DMALEVEL+DMADSTINCR0+DMADSTINCR1+DMADSTBYTE+DMAEN;
// Source address DMA0SA = ADC12MEM0_; // Destination address DMA0DA = 0x1c02; DMA0SZ = NUMRESULTS; // Block size/////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////// Timer Configuration (TA0.0) /////////////////////////////////////// // enabling port 1 for TA0CCR0 output P1DIR |= 0x02; P1SEL |= 0x02; TA0CTL = TASSEL0+MC0+TACLR; TA0CCR0 = 0x0001; //setting counter value for 8KHz symmetric pulse output TA0CCTL0 = CCIS1+SCCI+OUTMOD_4;// __bis_SR_register(LPM3_bits); // Enter LPM3/////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////// ADC Configuration (ADC_12A) ///////////////////////////////// P6SEL |= 0x80; // Enable A/D channels port
// setting up ADC12CTL0 ADC12CTL0 = ADC12REF2_5V+ADC12REFON+ADC12ON; // using Extended sample mode // On Reference Generator and set to 2.5V // setting up ADC12CTL1 ADC12CTL1 = ADC12SHS0+ADC12CONSEQ1+ADC12BUSY; // Use sampling timer TA0.0, extended sample mode // repeat single channel // setting up ADC12CTL2 ADC12CTL2 = ADC12TCOFF+ADC12REFBURST; // setting up ADC12MCTLx ADC12MCTL0 = ADC12EOS+ADC12SREF_1|ADC12INCH_7; // Vr+=Vref+ and Vr-=AVss // A7 port is used for analog input // Enable interrupt flag (ADC12IFG.0) ADC12IE = 0x0001;
// Enable conversions ADC12CTL0 |= ADC12ENC; ////////////////////////////////////////////////////////////////////////////////////////////////////
__bis_SR_register(GIE); // Enable global interrupts while(1);}
/////////////////////////////////////// Interrupt Service Routine /////////////////////////////////#pragma vector = ADC12_VECTOR__interrupt void ADC12ISR (void){ unsigned check = 0; DEBUG_FILE * pFile; pFile = debug_fopen( "TestData", "wb" );
while (index<=NUMRESULTS-1) { while(!(ADC12IFG & 0x0001)); //results[index++] = ADC12MEM0; // Move results from adc memory register to an array index++; } // Disable interrupt flag (ADC12IFG.0) ADC12IE = 0x0000;
// writing binary file check = debug_fwrite( results, sizeof(unsigned char), NUMRESULTS, pFile ); debug_fclose(pFile);}
Umair Liaquat Qureshi// Enable interrupt flag (ADC12IFG.0) ADC12IE = 0x0001;
_____________________________________Before posting bug reports or ask for help, do at least quick scan over this article. It applies to any kind of problem reporting. On any forum. And/or look here.If you cannot discuss your problem in the public, feel free to start a private conversation: click on my name and then 'start conversation'. But please do so only if you really cannot do it in a public thread, as I usually read all threads. And I prefer to answer where others can profit from it (or contribute to it) too.