导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→AT89LV52的外部中断怎么会多次触发?

* 36945: AT89LV52的外部中断怎么会多次触发?

   liugn 
liugn发表的帖子 

 AT89LV52的外部中断怎么会多次触发?
我用AT89LV52模拟一个I2C功能,用C51编写,Keil uVision2, 
i2c_SDA = P3.2 (/INT0),
i2c_SCL = P3.1,
INT0设为下降沿触发。

void init_interrupt(void)
{
    EX0  = 1;       /* 1=Enable External interrupt 0 */
    ET0  = 1;       /* 1=Enable Timer 0 interrupt */
    EX1  = 0;       /* 1=Enable External interrupt 1 */
    ET1  = 0;       /* 1=Enable Timer 1 interrupt */
    ES   = 0;       /* 1=Enable Serial port interrupt */
    ET2  = 0;       /* 1=Enable Timer 2 interrupt */
    IT0  = 1;       /* 1 =INT0 Trigger on fall slope  */
    EA   = 1;       /* 0=Disable all interrupts */
}

void edge_detect(void) interrupt 0
{
 disable_interrupt0();
                disable_keypad();
 ctrl_1 = !ctrl_1;
 i2c_receive_packet();
 ctrl_1 = !ctrl_1;
                enable_keypad();
                enable_interrupt0();
}

void disable_interrupt0(void)
{
 EX0  = 0;       /* 1=Enable External interrupt 0 */
}

void enable_interrupt0(void)
{
 EX0  = 1;       /* 1=Enable External interrupt 0 */
}

当I2C数据来时,触发外部中断0,进入中断程序,在中断程序内部先禁止中断0,避免后面的数据下降沿触发中断。接收完数据后,开中断0后返回。

现在我发现接收完一个完整的数据包退出中断后,立即又触发了一次中断,进入了中断服务程序。请问各位大虾这可能是什么原因。

发表时间:2003年7月13日13:19:33

  
回复该帖

本主题共有 3 帖,分页:>>>>>该主题的所有内容[3]条

 *树形目录 只列出部分跟帖的标题以及简单的摘要信息 该主题的部分跟帖如下:

  36987.[详细]我想是这样的...!
摘要:虽然你已经禁止了INT0的中断,但是INT0引脚上的下降沿同样会使INT0的中断请求标志IE0置位,只是程序不转到INT0中断入口地址处罢了,而IE0是不能由软件清除的,如果此时重新开放INT0的中断后的下一周期立即回触发另一次中断。我在做......(291字)
- [Lichunfu][969次] 2003年7月14日

  36993.[详细]中断请求标志位是可以软件清除的,我最后用这个方法调试还可以
摘要:我在中断服务程序的出口之前加了清除 IE0 的操作,结果还不错,出中断后不会立即触发 INT0了。 [quote][b]以下是引用[i]Lichunfu在2003-7-14 9:42:06[......(476字)
- [liugn][1401次] 2003年7月14日

[上一篇帖子]:建议本BBS帖子浏览计数方法改进一下自己看自己的帖子浏览次数不加1,只有别人浏览时计数器才能加,而且
[下一篇帖子]:不能直接读入c程序烧写,你下载伟福的仿真软件,设置为软件仿真,写完 程序后进行编译就行了。