历史上的今天
返回首页

历史上的今天

今天是:2025年03月30日(星期日)

正在发生

2020年03月30日 | msp430f149外中断问题

2020-03-30 来源:eefocus

msp430的外中断归根到底 其实只需要两个部分的配置就可以了:

1. 引脚配置

2. 中断函数配置


一 引脚配置(以引脚P2.1为例)


P2DIR = 0x01;//配置为输入

P2IE   |= 0x01;

P2IES |= 0x01;


其他寄存器可配置,可不配置。注意引脚功能选择为一般引脚,不是功能引脚。虽然引脚的配置很简单,但是只要出错,就无法产生中断。


二 中断函数配置


#pragma vector =PORT2_VECTOR

__interrupt void tangle_make(void)

{

       //用户自定义函数

       P2IFG = 0x00;

}     

 

中断函数比较简单,只需要记得将中断标志位清0就可以了。


注意:引发外中断的外模块最好能够与系统的电源模块使用一个电源,使用其他电源供电会产生外中断频发状态。


最近一直卡在外中断和串口中断之间。自己在查看了一会原版的手册之后,发现以下几个问题。


Q1:在外中断程序中开总中断,有的时候总是莫名的卡死。

Q2:给外中断加上外部触发模块,比如红外,门磁等模块时,外中断总是不停的触发。

Q3:外中断触发后,程序还能运行,不过每到串口中断就需要外中断促进程序往下跑。


A1:这个问题涉及到中断嵌套问题。

对于多源中断,需要手动清除标志位。比如:P1、P2的中断,需要手动清楚相应的标志位。如果在这种中断中使用“_EINT();”,开中断,而在打开中断之前,没有进行原来中断标识位的清除工作,就会有相同的中断不断的进行嵌套。而导致堆栈溢出引起复位,所以在这类中断中,必须先清除标志位,再打开中断开关。要不然等着死机吧。


总之,就是说在开总中断之前,需要将多源中断标志位清掉。


A2:这个问题我到现在也不是很明白为什么会这样,不过我还是有几个经验可以写下来。

首先,必须保证硬件的正常,一般的红外模块不需要外加电阻什么的,可以直接接在IO口上。测量红外输出引脚的高低电平是不是正常的,高的时候是不是接近3v,低的时候是不是0v。(在3V情况下,低电平为0.9-1.3V,高电平为1.5-1.9V。1.3V-1.5V为不稳定状态。)


其次,并没有配置什么上拉下拉电阻。就是依照上面的3个寄存器配置的。可以用。(芯片是msp430f149)。


硬件没有问题,就是要用软件来解决了:

第一种方法:在外中断中关闭 外中断使能,然后在外部程序合适的地方再开启。

第二种方法:在外中断中 加入消抖,就可以了。至于为什么,我也不清楚。。

A3:这个问题我到现在也想不通,理不顺,如果有大神看到的话,请一定要留言告诉我。


在师兄的帮助下整个系统算是完成了。

更正一下上面的一些问题。

对于外部输入到芯片的引脚,首先值得质疑一下:这个输入引脚的状态到底能不能用万用表来测量。我这里给出的答案是不可取的。(感觉可以用示波器查看,原理的话不是很清楚)所以在写完代码后测试的时候,不应该靠万用表的数值来看是不是产生中断,万用表是不靠谱的,建议使用msp430的仿真器来查看,硬件仿真有时候可以解决很多问题。

下面说一下持续的调试过程中的问题和经验。PS:建议使用仿真器,可以大大提高一些自己不必要的考虑因素。前期自己用小灯来测试感觉真的是蠢的出血。


在调试过程中碰到的最大的问题其实是一般人都碰不到的:那就是考虑电流的问题,首先我的板子是自己焊接的,使用430f149驱动外接模块sim900a发送接受数据和继电器驱动锁开门,红外检测门的开关。整个系统使用同一个电源。发现在每次开门后都会自动的发送一个关门的指令。在经过上百次的测试和调试后,我提出可能是当锁开启的时候需要瞬间的电流,导致系统中其他部分的电流不够用,所以红外模块才会产生中断,导致每次都会产生一次关门的指令。


所以在以后的学习中,可以把电流的分流作为一个考虑的因素。


另外,外中断里的内容写的越少越好,buffer的清空,标志位的清空可以放在外中断函数外边实现,这个系统中我使用了P1口的6和7两个引脚来实现检测门的开关。(对于门的状态检测之前想了好多办法,最后采用了使用一个红外模块接到两个引脚上,两个引脚分别使用上升沿触发和下降沿触发,这样就可以检测到门的开和关了)


下面贴一下外中断的关键部分代码:

//****************************************


#pragma vector=PORT1_VECTOR

__interrupt void SIO_rx (void)

{

  volatile unsigned int x;

  /***************************/

  

  if((P1IFG&0x80)== 0x80)

  {

    for (x = 0xff; x > 0; x--);

    if(((P1IN&0x80)== 0x00))

    {

      P1IFG &= 0x7f;

      _EINT();

      IOinterruptClose();

      closedoor = 1;

      opendoor = 0;

    }

  }

  

  /***************************/

  

  if((P1IFG&0x40)== 0x40)

  {

    for (x = 0xff; x > 0; x--);

    if((P1IN&0x40)== 0x40)

    {

      P1IFG &= 0xBf;

      _EINT();

      IOinterruptClose();

      opendoor = 1;

      closedoor = 0;

    }

  }

  P1IFG &=0X00;

}


//********************代码贴完了^_^

推荐阅读

史海拾趣

南京中科微公司的发展小趣事

CSM自成立以来,便积极承担国家和地方具有战略性意义的重大攻关研发项目。其中,公司前身南京市物联网研究与产业化有限公司RFID事业部申报的“超高频与微波RFID读写器射频芯片研发”项目获得了国家工信部物联网专项资金项目资助,并在江苏省名列第一。这些项目的成功完成不仅展示了CSM在技术研发方面的实力,也为国家科技进步和产业发展做出了积极贡献。

赛微(Cellwise)公司的发展小趣事

作为一家有着高度社会责任感的企业,赛微始终关注社会发展和环境保护。公司积极参与公益事业和慈善活动,为社会做出积极贡献。同时,公司还注重环境保护和资源节约,通过引进先进的生产设备和工艺技术,降低生产过程中的能耗和排放,实现绿色生产和可持续发展。

请注意,以上故事框架仅为概述,具体细节和数据可能需要根据实际情况进行调整和完善。

Electronicon Kondensatoren GmbH公司的发展小趣事

随着全球市场的不断变化和发展,ELECTRONICON积极实施国际化战略,拓展海外市场。公司在全球范围内建立了完善的销售和服务网络,为客户提供及时、高效的服务。未来,ELECTRONICON将继续秉承“质量为本、客户至上”的经营理念,不断创新和发展,为电子行业的繁荣做出更大的贡献。

CANDD公司的发展小趣事

在快速发展的过程中,CANDD公司始终注重企业文化的建设。公司倡导创新、协作、诚信和担当的核心价值观,鼓励员工勇于创新、敢于担当。同时,公司还注重员工的培训和成长,为员工提供了广阔的职业发展空间。这些举措不仅激发了员工的工作热情,还为公司培养了一批忠诚、有能力的员工队伍。在企业文化的引领下,CANDD公司不断向前发展,成为了电子行业的佼佼者。

这些故事虽然基于虚构的CANDD公司,但它们所反映的电子行业发展趋势和企业管理理念是真实存在的。通过这些故事,我们可以更好地理解电子行业的发展历程和未来趋势。

GSN Electronics公司的发展小趣事

为了进一步提升品牌影响力和市场份额,CANDD公司开始实施国际化战略。公司首先在欧洲市场设立了分公司,并成功打开了欧洲市场的大门。随后,公司又进军亚洲市场,通过与当地企业的合作,逐渐在亚洲市场站稳了脚跟。随着国际化战略的深入实施,CANDD公司的品牌知名度和市场份额不断攀升。

Aplus Integrated Circuits公司的发展小趣事

近年来,电子行业经历了多次技术变革和市场调整。面对这些挑战,Aplus Integrated Circuits公司积极调整战略,加大研发投入,推动产品创新。公司成功开发出多款适应市场需求的新型集成电路产品,不仅满足了客户的多样化需求,还为公司带来了可观的收益。

问答坊 | AI 解惑

arm和mc35i的gprs 协议栈的问题

我用lpc2138和mc35i做了一个通信模块,通过gprs发送adc的数据。 我想问一下 1,mc35i是否带有协议栈? 2,协议栈处于流程中的哪一部分,即先把数据做成IP包再通过AT命令传给MC35I,还是直接把数据用AT命令传给模块? 3,有没有相关的例子代码?能 ...…

查看全部问答>

2.4G无线键盘+TOUCHPAD

本帖最后由 jameswangsynnex 于 2015-3-3 19:56 编辑    2.4G无线键盘+触摸板这两年好象比较流行,本人也设计了一款这样的产品,现从技术 层面按几大功能块作一简单介绍:    *  RF部分:       ...…

查看全部问答>

cc2430的csp问题

我发现写入csp的程序只有第一条能运行,不知道为什么?请有过2430开发经验的兄弟帮忙解析一下 void RF_TX_test(void){ RFD=0x0c; TX_DMA_Start(tx,10);//使用dma传送 STXON; INT; STOP; ISSTART;} 这样写就可以发送,但是理论上说是应该有CSP_ ...…

查看全部问答>

CMOS图像传感器OV7620驱动

下面是寒假里写的一个CMOS图像传感器的驱动包。      但本人将驱动代码以LIB文件的方式进行了集成。        有兴趣的朋友可以看一下。          这 ...…

查看全部问答>

买ST的IC真够难的,求购

ST72F321R9T6   1包 ST72F324R6T6   4包…

查看全部问答>

FPGA任意波形发生器ROM资源不足

用FPGA做一个任意波形双通道信号发生器,波形通过查表ROM获得,每个通道可选择产生正弦,方波,三角波,锯齿波,既一个通道需要用4个ROM,双通道也就需要8个ROM。 现在用这个方法遇到一个问题,就是FPGA提供的存储空间不足,如果ROM是8位256个点的 ...…

查看全部问答>

最后一天

本帖最后由 paulhyde 于 2014-9-15 09:03 编辑 明天就要比赛了,现在感觉压力好大。 祝福小组 也祝福参加比赛的各位取得好成绩。  …

查看全部问答>

帮我看下syntax error near'unsigned'是哪里错啊,我急死了

帮我看下syntax error near\'unsigned\'是哪里错啊,我急死了,我是编程一段1到1000的数,为什么编译出来有错误呢? #include<reg51.h>#define uint unsigned int#define uchar unsigned charuchar aa,unmp,qian,bai,shi,ge;void dingshi();vo ...…

查看全部问答>

Windows CE下流驱动的动态加载

我想很多WinCE的开发人员,尤其是刚入门并且做驱动开发的工程师,都曾碰到这样一个问题,要编写一个外围设备的驱动,拿最简单的GPIO驱动来说,编写驱动本身可能只花了一会儿功夫,可要把编译生成的DLL打包到先前做好的操作系统映像当中,最简单也得 ...…

查看全部问答>