2436|1

6

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

请教一个关于ADC12 中断的问题 [复制链接]

初学者编程调试中遇到一些不好理解的问题,请大侠们不吝赐教。调试工具:MSP430F5438A开发板 + IAR。

#include "msp430.h"
#include "adc.h"
#include "flash.h"

long i,j;
int temp[2][1000];
unsigned long Flash_Addr;

double accX[1000];
double accY[1000];

#pragma dataseg = default

void main(void) {
    WDTCTL = WDTPW + WDTHOLD;
        i=0;
    initADC();
    while (1)
    {
        ADC12CTL0 |= ADC12ENC + ADC12SC;
        _EINT();                                                       //问题1: 执行完此句后,查看Register SR发现GIE为1,但是,并没有立即进入ADC中断程序,而是又执行了下一句i=i+1才进入中断。更为诡异的是从中断退出后,又执行了一遍i=i+1,这个中断进入和退出应该是这样的吗?
                i=i+1;
                i++;
                _DINT();
    }
}



#pragma vector =  ADC12_VECTOR
__interrupt void ADC12_ISR(void)
{
//        ADC12IFG=0;                                                // 问题2: 进入中断后,查看register SR发现GIE已经为0,此处并没有复位GIE,为何为0?难道进入中断后GIE自动会变为0???  奇怪的是在GIE为0的情况下,执行完中断函数里最后一句,并没有退出中断,而是继续重头执行,这是为何?
        temp[0] = ADC12MEM1;
        temp[1] = ADC12MEM2;
        i++;
        if (i==1000)
        {
          ADC12IFG = 0;                                                //问题3: 运行此句后查看ADC12IFG发现无效,该是1的还是1,我的ADC模式为repeat multichannel, 是不是这种模式下对IFG复位是无效的?
          ADC12CTL0 &= ~ADC12ENC;
          _DINT();
        }
}

希望能够得到各位的帮助。谢谢!
[ 本帖最后由 zeng.43 于 2012-5-13 06:03 编辑 ]
 
点赞 关注

回复
举报

6

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
#include "msp430.h"
#include "adc.h"
#include "flash.h"

long i,j;
int temp[2][1000];
unsigned long Flash_Addr;

#pragma dataseg = 0X030000

double accX[1000];
double accY[1000];

#pragma dataseg = default

void main(void) {
        WDTCTL = WDTPW + WDTHOLD;
        i=0;
        initADC();
        while (1)
        {
                ADC12CTL0 |= ADC12ENC + ADC12SC;
                Flash_Addr++;
                _EINT();
                asm("NOP");

                _DINT();
        }
}



#pragma vector =  ADC12_VECTOR
__interrupt void ADC12_ISR(void)
{
//        ADC12IFG=0;
//        ADC12CTL0 &= ~ADC12ENC;
        temp[0] = ADC12MEM1;
        temp[1] = ADC12MEM2;
        i++;
        if (i==1000)
        {
          ADC12IFG = 0;
          ADC12CTL0 &= ~ADC12ENC;            //此处调试 i=1000;一切似乎正常,可是当退出中断,i无端加1,成了1001,但是单步运行,发现程序并没有再次进入中断,为什么会加1呢?
        }
        
        asm("NOP");
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表