打印

MSP430 序列通道单次转换问题

[复制链接]
1114|28
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Thor9|  楼主 | 2017-6-30 10:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我想实现的功能为:通过8个通道采集AD,定时器触发采样率为1个周期80个点,然后将通道ADC12CH_0和通道ADC12CH_1采集的数据存储在开辟的两段FRAM区域里面,用序列通道(ADC12CONSEQ_1)采。但是,不能进入中断。不知道啥原因,下面是程序部分,请各位大神帮忙解答!万分感谢。(注:我用的MCU是MSP430FR5969)

#include <msp430.h>

#define FRAM_TEST_START0 0x9000
#define FRAM_TEST_START1 0xD000

volatile unsigned long ADC_Data[8];
unsigned char count = 0;
unsigned long *FRAM_write_ptr;


void GPIOInit(void)
{

    // Configure all un-used GPIO to lowest power state
    P1DIR = 0xFF;
    P1OUT = 0;

    P1SEL1 |= BIT0 | BIT1 | BIT2 | BIT3 | BIT4 | BIT5;// Configure P1.0 P1.1 P1.2 P1.3 P1.4 P1.5for ADC
    P1SEL0 |= BIT0 | BIT1 | BIT2 | BIT3 | BIT4 | BIT5;// A0~A5


    P2DIR = 0xFF;
    P2OUT = 0;
//    P2OUT = 0xFF;
    P2SEL1 |= BIT3 | BIT4; // Configure P2.3 and P2.4 for ADC
    P2SEL0 |= BIT3 | BIT4; // A6~A7

    P3DIR = 0xFF;
    P3OUT = 0;
//    P2OUT = 0xFF;

    P4DIR = 0xFF;
    P4OUT = 0;


    PJOUT = 0;
    PJSEL0 = BIT4 | BIT5;                   // For XT1
    PJDIR = 0xFFFF;

    // Disable the GPIO power-on default high-impedance mode to activate
    // previously configured port settings
    PM5CTL0 &= ~LOCKLPM5;
}

void clockInit(void)
{
    // Clock System Setup
    CSCTL0_H = CSKEY >> 8;                  // Unlock CS registers
    CSCTL1 = DCOFSEL_6;                     // Set DCO to 8MHz
    CSCTL2 = SELA__LFXTCLK | SELS__DCOCLK | SELM__DCOCLK;   // Set ACLK = XT1; MCLK = SMCLK = DCO
    CSCTL3 = DIVA__1 | DIVS__1 | DIVM__1;   // Set all dividers
    CSCTL4 &= ~LFXTOFF;                     // Enable LFXT1
    do
    {
        CSCTL5 &= ~LFXTOFFG;                // Clear XT1 fault flag
        SFRIFG1 &= ~OFIFG;
    } while (SFRIFG1 & OFIFG);              // Test oscillator fault flag
    CSCTL0_H = 0;                           // Lock CS registers

}

void TimerInit(void)
{

    // Configure Timer0_A
    TA0CCR0 = 8-1;                          // 32K/32 = 1000Hz freq.
    TA0CCTL1 = OUTMOD_7;                      // CCR1 reset/set
    TA0CCR1 = 4;                             // 16/32 = 50% duty cycl
    TA0CTL = TASSEL__ACLK | MC__UP | TACLR;   // ACLK, up mode, clear TAR
}

void FRAMWrite(unsigned long data)
{


    *FRAM_write_ptr++ = data;

}


void ADC12Init()
{
    // By default, REFMSTR=1 => REFCTL 是配置内部参考电压的寄存器
    // while(REFCTL0 & REFGENBUSY);                              // 如果参考电压发生器busy, 等待
    // REFCTL0 |= REFVSEL_2 | REFON;                           // 选择内部参考源 ref = 2.5V,使能内部参考源

    // Configure ADC12
    ADC12CTL0 = ADC12SHT0_2 | ADC12ON | ADC12MSC;      // Sampling time, S&H=16, ADC12 on
    ADC12CTL1 = ADC12SHP + ADC12SHS_1 + ADC12SSEL_1 + ADC12CONSEQ_1;     // Use sampling timer, Use TA0CCR1 output as trigger , sequence channel
    ADC12CTL2 |= ADC12RES_2 + ADC12PWRMD;   // 12-bit conversion results, low power mode         ADC12CTL3 = ADC12CSTARTADD_0;// | ADC12CSTARTADD_1;

   // while(!(REFCTL0 & REFGENRDY));         // 等待参考源生效

    ADC12IER0 |= ADC12IE0;                  //开中断

    ADC12MCTL7 |= ADC12INCH_7 | ADC12VRSEL_1;        // A2 ADC input select; Vref=AVCC
    ADC12MCTL1 |= ADC12INCH_1 | ADC12VRSEL_1;
    ADC12MCTL0 |= ADC12INCH_2 | ADC12VRSEL_1;
    ADC12MCTL3 |= ADC12INCH_3 | ADC12VRSEL_1;
    ADC12MCTL4 |= ADC12INCH_4 | ADC12VRSEL_1;
    ADC12MCTL5 |= ADC12INCH_5 | ADC12VRSEL_1;
    ADC12MCTL6 |= ADC12INCH_6 | ADC12VRSEL_1;
    ADC12MCTL0 |= ADC12INCH_0 | ADC12VRSEL_1 + ADC12EOS;

    ADC12CTL0 |= ADC12ENC | ADC12SC;    //转换使能,开始转换
}


int main(void)
{
    WDTCTL = WDTPW | WDTHOLD;                 // Stop WDT
    GPIOInit();
    clockInit();
    TimerInit();
    ADC12Init();


    while (1)
    {
        __bis_SR_register(LPM3_bits | GIE); // LPM3, ADC12_ISR will force exit
        __no_operation();                   // For debugger
    }

}


#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
#pragma vector = ADC12_VECTOR
__interrupt void ADC12_ISR(void)
#elif defined(__GNUC__)
void __attribute__ ((interrupt(ADC12_VECTOR))) ADC12_ISR (void)
#else
#error Compiler not supported!
#endif
{
    switch(__even_in_range(ADC12IV, ADC12IV_ADC12RDYIFG))
    {
        case ADC12IV_NONE:        break;    // Vector  0:  No interrupt
        case ADC12IV_ADC12OVIFG:  break;    // Vector  2:  ADC12MEMx Overflow
        case ADC12IV_ADC12TOVIFG: break;    // Vector  4:  Conversion time overflow
        case ADC12IV_ADC12HIIFG:  break;    // Vector  6:  ADC12BHI
        case ADC12IV_ADC12LOIFG:  break;    // Vector  8:  ADC12BLO
        case ADC12IV_ADC12INIFG:  break;    // Vector 10:  ADC12BIN
        case ADC12IV_ADC12IFG0:             // Vector 12:  ADC12MEM0 Interrupt


            ADC_Data[0] = ADC12MEM0;
            ADC_Data[1] = ADC12MEM1;

            FRAM_write_ptr = (unsigned long *)FRAM_TEST_START0;
            FRAMWrite(ADC_Data[0]);                            // Endless loop
            ADC12MCTL0&=~ADC12INCH_2; //通道清2

            FRAM_write_ptr = (unsigned long *)FRAM_TEST_START1;
            FRAMWrite(ADC_Data[1]);                            // Endless loop
            ADC12MCTL1&=~ADC12INCH_3; //通道清3


                // Exit from LPM0 and continue executing main
                __bic_SR_register_on_exit(LPM3_bits);
            break;
        case ADC12IV_ADC12IFG1:   break;    // Vector 14:  ADC12MEM1
        case ADC12IV_ADC12IFG2:   break;    // Vector 16:  ADC12MEM2
        case ADC12IV_ADC12IFG3:   break;    // Vector 18:  ADC12MEM3
        case ADC12IV_ADC12IFG4:   break;    // Vector 20:  ADC12MEM4
        case ADC12IV_ADC12IFG5:   break;    // Vector 22:  ADC12MEM5
        case ADC12IV_ADC12IFG6:   break;    // Vector 24:  ADC12MEM6
        case ADC12IV_ADC12IFG7:   break;    // Vector 26:  ADC12MEM7
        case ADC12IV_ADC12IFG8:   break;    // Vector 28:  ADC12MEM8
        case ADC12IV_ADC12IFG9:   break;    // Vector 30:  ADC12MEM9
        case ADC12IV_ADC12IFG10:  break;    // Vector 32:  ADC12MEM10
        case ADC12IV_ADC12IFG11:  break;    // Vector 34:  ADC12MEM11
        case ADC12IV_ADC12IFG12:  break;    // Vector 36:  ADC12MEM12
        case ADC12IV_ADC12IFG13:  break;    // Vector 38:  ADC12MEM13
        case ADC12IV_ADC12IFG14:  break;    // Vector 40:  ADC12MEM14
        case ADC12IV_ADC12IFG15:  break;    // Vector 42:  ADC12MEM15
        case ADC12IV_ADC12IFG16:  break;    // Vector 44:  ADC12MEM16
        case ADC12IV_ADC12IFG17:  break;    // Vector 46:  ADC12MEM17
        case ADC12IV_ADC12IFG18:  break;    // Vector 48:  ADC12MEM18
        case ADC12IV_ADC12IFG19:  break;    // Vector 50:  ADC12MEM19
        case ADC12IV_ADC12IFG20:  break;    // Vector 52:  ADC12MEM20
        case ADC12IV_ADC12IFG21:  break;    // Vector 54:  ADC12MEM21
        case ADC12IV_ADC12IFG22:  break;    // Vector 56:  ADC12MEM22
        case ADC12IV_ADC12IFG23:  break;    // Vector 58:  ADC12MEM23
        case ADC12IV_ADC12IFG24:  break;    // Vector 60:  ADC12MEM24
        case ADC12IV_ADC12IFG25:  break;    // Vector 62:  ADC12MEM25
        case ADC12IV_ADC12IFG26:  break;    // Vector 64:  ADC12MEM26
        case ADC12IV_ADC12IFG27:  break;    // Vector 66:  ADC12MEM27
        case ADC12IV_ADC12IFG28:  break;    // Vector 68:  ADC12MEM28
        case ADC12IV_ADC12IFG29:  break;    // Vector 70:  ADC12MEM29
        case ADC12IV_ADC12IFG30:  break;    // Vector 72:  ADC12MEM30
        case ADC12IV_ADC12IFG31:  break;    // Vector 74:  ADC12MEM31
        case ADC12IV_ADC12RDYIFG: break;    // Vector 76:  ADC12RDY
        default: break;
    }
}

相关帖子

沙发
Thor9|  楼主 | 2017-6-30 10:36 | 只看该作者
来人,顶起

使用特权

评论回复
板凳
Mattheww| | 2017-6-30 10:52 | 只看该作者
应该在中断里边采数据吧!

使用特权

评论回复
地板
Erichk| | 2017-6-30 11:04 | 只看该作者
开通连续采集是吧

使用特权

评论回复
5
Thorald| | 2017-6-30 11:21 | 只看该作者
ADC12IER0 |= ADC12IE0;                  //开中断
这句有问题
应该开中断7,并且在中断ADC12IV_ADC12IFG7里进行数据提取

使用特权

评论回复
6
Bjorn| | 2017-6-30 14:46 | 只看该作者
为什么是中断7,中断7 是什么

使用特权

评论回复
7
kkzz| | 2017-7-1 20:19 | 只看该作者
中断配置正确了吗?

使用特权

评论回复
8
pixhw| | 2017-7-1 20:20 | 只看该作者
ADC10拥有DTC模块,可以直接将转换的数据存储到内存中。

使用特权

评论回复
9
usysm| | 2017-7-1 20:21 | 只看该作者
中断函数有问题吗?

使用特权

评论回复
10
typeof| | 2017-7-1 20:21 | 只看该作者
ADC12中断中打开全局中断

使用特权

评论回复
11
updownq| | 2017-7-1 20:22 | 只看该作者
uint TEMP=0,TEMP1=0,TEMP2=0,TEMP3=0;                            //ADC值暂存变量
#define da P2OUT
//*************************************************************************
// ADC中断服务程序
//*************************************************************************
#pragma vector=ADC_VECTOR
__interrupt void ADC12ISR(void)
{
  uchar j;
// while((ADC12CTL1&0x01)==1);           //如果ADC忙,则等待,否则读取ADC转换数值
// Flag = 1 ;
  TEMP = ADC12MEM0;                     //读取ADC转换值
  TEMP1 = ADC12MEM1;
   TEMP2 = ADC12MEM2;
   TEMP3= ADC12MEM3;
   Data_do(TEMP);   //处理ADC值,用于显示,数字量
   Data_do1(TEMP1);
  Voltage_do(TEMP);                     //处理ADC值,用于显示,模拟电压值
   Voltage_do1(TEMP1);
  Voltage_do2(TEMP2);
  Voltage_do3(TEMP3);
           
  for(j=0;j<15;j++)
  {LCD_DisplayADC1();                   //显示ADC的数据,ADC数字量
    LCD_DisplayVoltage1();               //显示ADC的电压值
    LCD_DisplayADC();                   //显示ADC的数据,ADC数字量
    LCD_DisplayVoltage();               //显示ADC的电压值
    key();
  }
}
//***********************************************************************
//DA输出控制
//***********************************************************************

使用特权

评论回复
12
i1mcu| | 2017-7-1 20:23 | 只看该作者
ADC12ON:内核打开或关闭

ADC12OVIE:溢出中断允许位:ADC12MEMx原有数据没有读出就有新的转换结果需要写入时。

ADC12TVIE:转换时间溢出中断允许位:当前转换还没有完成又发生一次采样请求。

使用特权

评论回复
13
mmbs| | 2017-7-1 20:23 | 只看该作者
因为ADC转换时间比较长,在转换期间,MSP430可以去处理其他事情提高效率。所以ADC用转换结束信号作为中断请求,CPU就会来读取结果。

使用特权

评论回复
14
lzbf| | 2017-7-1 20:24 | 只看该作者
#include <msp430.h>

#define Num_of_Results 8

volatile unsigned int results[Num_of_Results];
// Needs to be global in this
// example. Otherwise, the
// compiler removes it because it
// is not used for anything.

int main(void)
{
WDTCTL = WDTPW+WDTHOLD; // Stop watchdog timer
P6SEL |= 0x01; // Enable A/D channel A0
ADC12CTL0 = ADC12ON+ADC12SHT0_8+ADC12MSC; // Turn on ADC12, set sampling time
// set multiple sample conversion
ADC12CTL1 = ADC12SHP+ADC12CONSEQ_2; // Use sampling timer, set mode
ADC12IE = 0x01; // Enable ADC12IFG.0
ADC12CTL0 |= ADC12ENC; // Enable conversions
ADC12CTL0 |= ADC12SC; // Start conversion

__bis_SR_register(LPM4_bits + GIE); // Enter LPM4, Enable interrupts
__no_operation(); // For debugger

}


#pragma vector=ADC12_VECTOR
__interrupt void ADC12ISR (void)
{
static unsigned char index = 0;

switch(__even_in_range(ADC12IV,34))
{
case 0: break; // Vector 0: No interrupt
case 2: break; // Vector 2: ADC overflow
case 4: break; // Vector 4: ADC timing overflow
case 6: // Vector 6: ADC12IFG0
results[index] = ADC12MEM0; // Move results
index++; // Increment results index, modulo; Set Breakpoint1 here

if (index == 8)
{
index = 0;
}
case 8: break; // Vector 8: ADC12IFG1
case 10: break; // Vector 10: ADC12IFG2
case 12: break; // Vector 12: ADC12IFG3
case 14: break; // Vector 14: ADC12IFG4
case 16: break; // Vector 16: ADC12IFG5
case 18: break; // Vector 18: ADC12IFG6
case 20: break; // Vector 20: ADC12IFG7
case 22: break; // Vector 22: ADC12IFG8
case 24: break; // Vector 24: ADC12IFG9
case 26: break; // Vector 26: ADC12IFG10
case 28: break; // Vector 28: ADC12IFG11
case 30: break; // Vector 30: ADC12IFG12
case 32: break; // Vector 32: ADC12IFG13
case 34: break; // Vector 34: ADC12IFG14
default: break;
}
}

使用特权

评论回复
15
10299823| | 2017-7-1 20:24 | 只看该作者
DC12序列通道单次转换中断服务程序进不去?

使用特权

评论回复
16
kkzz| | 2017-7-1 20:26 | 只看该作者
MSP430的ADC10确实只有一个ADC10MEM,只能存储一次转换的数据。

使用特权

评论回复
17
pixhw| | 2017-7-1 20:26 | 只看该作者
SP430的ADC12单通道和序列通道单次转换程序

使用特权

评论回复
18
usysm| | 2017-7-1 20:26 | 只看该作者
在哪里转换的,怎么触发中断?

使用特权

评论回复
19
typeof| | 2017-7-1 20:26 | 只看该作者
在使用单次转换时,可以正常进入中断

使用特权

评论回复
20
updownq| | 2017-7-1 20:26 | 只看该作者
看看这个代码能不能进入中断。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

108

主题

843

帖子

2

粉丝