历史上的今天
返回首页

历史上的今天

今天是:2025年05月05日(星期一)

2018年05月05日 | msp430f149外中断问题

2018-05-05 来源:eefocus

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

1. 引脚配置

2. 中断函数配置



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


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

P2IE   |= 0x01;

P2IES |= 0x01;


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


二 中断函数配置


#pragma vector =PORT2_VECTOR
__interrupt void tangle_make(void)

{

       //用户自定义函数

       P2IFG = 0x00;

}     
 


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




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



2016年8月18号更新

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


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:这个问题我到现在也想不通,理不顺,如果有大神看到的话,请一定要留言告诉我。

/*********************2016.10.18更新***************/
在师兄的帮助下整个系统算是完成了。
更正一下上面的一些问题。
对于外部输入到芯片的引脚,首先值得质疑一下:这个输入引脚的状态到底能不能用万用表来测量。我这里给出的答案是不可取的。(感觉可以用示波器查看,原理的话不是很清楚)所以在写完代码后测试的时候,不应该靠万用表的数值来看是不是产生中断,万用表是不靠谱的,建议使用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;
}

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


推荐阅读

史海拾趣

American Power Management Inc公司的发展小趣事

为了进一步提升竞争力,APMI开始实施国际化发展战略。公司积极开拓海外市场,与国际知名电子制造商建立合作关系。同时,APMI还加强了与国际同行的技术交流与合作,吸收借鉴先进的管理经验和技术成果。通过国际化发展,APMI不仅拓宽了市场渠道,还提升了公司的国际影响力。

Avic公司的发展小趣事

随着全球化的推进,Avic公司不断加强与国际航空工业界的合作。公司与多家国际知名航空企业建立了战略合作关系,共同开展航空电子技术的研发和生产。这些合作不仅促进了中国航空工业与国际先进水平的接轨,也为中国航空工业的国际化发展提供了有力支持。

Amaze Electronics Pte Ltd公司的发展小趣事

随着业务的不断发展,Amaze Electronics意识到国际市场的巨大潜力。于是,公司积极寻求与国际知名电子企业的合作,共同开发新产品。通过与这些企业的深度合作,Amaze Electronics不仅获得了先进的技术支持,还成功将产品打入国际市场,实现了业务的快速拓展。

Bussmann (Eaton)公司的发展小趣事

随着电子技术的快速发展,对电路保护的要求也越来越高。为了满足市场需求,Bussmann于1992年开始研发芯片保险丝。这款新型保险丝将可熔性材料沉降到陶瓷基底上,具有体积小、安装方便等优点,能够广泛应用于印刷电路板等电子设备中。芯片保险丝的推出不仅进一步提升了Bussmann的技术实力,也为其在电子行业打开了新的市场空间。

CALMIRCO公司的发展小趣事

随着电子行业的快速发展,市场竞争日益激烈,行业挑战也层出不穷。CALMIRCO公司始终保持敏锐的市场洞察力,积极应对各种挑战。在面对原材料价格波动、国际贸易摩擦等不利因素时,CALMIRCO公司及时调整战略,优化生产流程,降低成本,确保产品的竞争力。同时,公司还不断加大研发投入,推动技术创新和产业升级,以适应不断变化的市场需求。

这五个故事只是CALMIRCO公司在电子行业发展中众多精彩瞬间的缩影。正是这些不懈的努力和持续的创新,使得CALMIRCO公司在激烈的市场竞争中脱颖而出,成为电子行业的佼佼者。

ENOCEAN公司的发展小趣事

自推出第一代产品以来,EnOcean凭借其卓越的性能和独特的优势,在欧洲市场上取得了良好的销售业绩。随后,随着公司不断推出新产品和技术,其产品的应用领域也逐渐扩大至全球范围。如今,EnOcean的无线模块已被全球100多家制造商选中,用于实现他们的建筑和工业系统理念。无线组件已经在超过20万栋建筑中使用,为节能建筑和创新产业提供了重要支持。

问答坊 | AI 解惑

AT91SAM9261多用途Boot源程序分享

AT91SAM9261多用途Boot源程序分享 英贝德科技在开发SBC9261时设计了一款多用途的BOOT程序代码,这里与大家一起分享。这款BOOT程序的优势在于支持 ADS、EBOOT(WinCE引导)、UBOOT(Linux引导)、zImage(Linux直接运行)。同时支持240*320、640*48 ...…

查看全部问答>

出一块没用过几次的优龙FS2410 ARM9 开发板

出一块没用过几次的优龙FS2410 ARM9 开发板 09年从淘宝上那家北航博士店买来学习用,之后做了几个项目就用自己的做的硬件ARM板子调试学习,所以一直闲置,和新的一样, 上电也就10次以内,故转让给想学习的朋友,全部包装配件齐全! 想了解板子 ...…

查看全部问答>

关于ADS1.2的一点小问题

我看到有一句话如下面,请问这是什么意思呀·· 在AXD里File->Load memory from file 读入boot_NEW.bin 放在0x200000 处 继续运行…

查看全部问答>

怎么才能隐藏或屏蔽掉开始菜单?

在XP下用findwindow \"shell_traywnd\"可以隐藏 但是在PPC上不行. 该怎么做?…

查看全部问答>

输出电阻越小越好?

大家看这个图,关键是第4个问题引申出来的问题 1.T1管为放大管 2.集电极静态电流约为IR 3.输入静态工作点由谁确定呢?老师说先给IC注入电流,IB会有合适的电流相匹配,这点听的似懂非懂,是不是此时输入Q点已经有了,IB就是IC除以β? 4.因为rc ...…

查看全部问答>

zigbee NV-restore编译选项不给力。。。。

大家好,我的是2530,但是加上nv_restore后,协调器和路由就不能正常的通信了,具体情况很诡秘:        正常的情况是路由器一直在循环不断的想协调器发送信息。可是现在的情况是:只有当我复位路由器的时候,才向 ...…

查看全部问答>

LED应用——内部补偿补偿功能的 DC-DC 转换器

本帖最后由 dontium 于 2015-1-23 13:10 编辑 优化具有内部补偿功能的 DC-DC 转换器的瞬态响应   补偿和测量为高功率 LED 供电的 DC-DC 转换器环路   使用离散 DC/DC 转换器和 LDO 的电源解决方案 精彩全文,请速速下载   ...…

查看全部问答>

用交流电容替代整流管的问题

请教各位大侠,如果用交流电容替代整流管,测电容可以降低体积吗?…

查看全部问答>

MSP430F5438A无法取代12864液晶显示,求教一下,下面程序有问题吗?我是51过渡到43...

#include //#define CPU_F ((double)8000000)//默认MCLK=1MHz #define uint unsigned int #define uchar unsigned char /******************************************************************************* p90=cs(RS);p91=sid(RW);p92=clk( ...…

查看全部问答>