Other Parts Discussed in Thread: MSP430WARE
Tool/software: Code Composer Studio
Hello! I am trying to do an AD conversion of the readings of a joystick and with direct memory access storing the last 500 values of each axis of the joystick in two diferent vectors. For some reason, only the X axis vector is registering anything, the other one remains empty.
#include <msp430.h>
#define ADC12MEM0ADDR (__SFR_FARPTR) 0x0720
#define ADC12MEM1ADDR (__SFR_FARPTR) 0x0722
void ADC_Configure(void);
void CLK_Configure(void);
void TA0_Configure(void);
void DMA_Configure(void);
int analogX[500]; //X axis
int analogY[500]; //Y axis
int main(void) {
WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer
CLK_Configure();
TA0_Configure();
ADC_Configure();
DMA_Configure();
P6SEL |= BIT0 | BIT1;
__enable_interrupt();
while(1);
}
#pragma vector= TIMER0_A1_VECTOR
__interrupt void ISR_TA0(){
int n;
n = __even_in_range(TA0IV,0XE);
switch(n){
case 0xE:
TA0CTL &= ~TAIFG;
ADC12CTL0 &= ~ADC12SC; //ADC12SC = 0
ADC12CTL0 |= ADC12SC; //ADC12SC = 1
ADC12CTL0 &= ~ADC12SC; //ADC12SC = 0
break;
default: break;
}
}
void DMA_Configure(void){
DMACTL0 = DMA0TSEL_24 | DMA1TSEL_24; //Trigger ADC
DMA0CTL = DMAEN |
DMADSTINCR_3 |
DMADT_4;
DMA1CTL = DMAEN |
DMADSTINCR_3 |
DMADT_4;
DMA0SA = ADC12MEM0ADDR; //ADC MEM0
DMA1SA = ADC12MEM1ADDR; //ADC MEM1
__data16_write_addr((unsigned short) &DMA0DA,(unsigned long) &analogX[0]);
__data16_write_addr((unsigned short) &DMA1DA,(unsigned long) &analogY[0]);
DMA0SZ = 500;
DMA1SZ = 500;
}
void ADC_Configure(void){
ADC12CTL0 &= ~ADC12ENC;
ADC12CTL0 |= ADC12SHT0_0 | ADC12ON; //4 ciclos do ADC12CLK == 2us / Ligar ADC
ADC12CTL1 |= ADC12CSTARTADD_0 | //ADC12MEM0
ADC12SHS_0 | // Timer = ADC12SC
ADC12SHP |
ADC12DIV_0 |
ADC12SSEL_1 | //CLOCK = ACLK = 2MHz --> ADC12CLK = 500ns
ADC12CONSEQ_1;
ADC12CTL2 |= ADC12TCOFF |
ADC12RES_2; //12 bits
ADC12MCTL0 |= ADC12EOS |
ADC12SREF_0 | //VR+ = AVcc e VR- = AVss
ADC12INCH_0 | // A0 = P6.0
ADC12INCH_1; // A1 = P6.1
ADC12CTL0|= ADC12ENC;
}
void CLK_Configure(void){
P5SEL |= BIT2|BIT3|BIT4|BIT5;
//SMCLK = 1MHz
//MCLK = 2MHz (tsample > 1,5us)
UCSCTL1|= DCORSEL_1;
UCSCTL2|= FLLD_0;
UCSCTL2|= 243;
UCSCTL3|= SELREF_2;
UCSCTL3|= FLLREFDIV_1;
UCSCTL4 |= SELS_3 | // SMCLK = DCO
SELA_3; // ACLK = DCO
UCSCTL5 |= DIVS_2 | // SMCLK/1 = 1MHz
DIVA_1; // ACLK/2 = 2MHz
}
void TA0_Configure(void){
TA0CTL = TASSEL_2|ID_0|MC_1|TAIE;
TA0CTL &= ~TACLR;
TA0EX0 = TAIDEX_0;
TA0CCR0 = 10000; // SMCLK x 100000 = 10ms
}