Board logo

标题: 大家帮忙看下这个外部中断!或者发给我一个外部中断的例程,谢谢了! [打印本页]

作者: shigure.asa    时间: 2009-5-12 22:38     标题: 大家帮忙看下这个外部中断!或者发给我一个外部中断的例程,谢谢了!

下面是我的源代码,实现的就是利用外部中断IRQ,以下降沿触发的方式,是B口的电平反复反向。IRQ的电平变化,我是利用将GND和PE0之间用一单刀双置开关连接。通过拨动开关,来改变PE0引脚的电平。

功能:将开关从一侧拨到另一侧时,使PE0和GND导通,产生下降沿,从而使中断触发,B口电平全部反向,但是遇到了问题:每次电平反向了两次。我用Debug调试的话,都是只反向一次,怎么回事呢?调试一句句执行语句都没有问题,但是整体运行却有问题。

下面是我的代码,功能不复杂,就是简单的外部中断,希望大家耐烦看下,能帮我解决这个问题:

注:我用的是清华的那块DG128的板子。一般做智能车的同学都有用过吧!


#include<hidef.h>
#include<mc9s12dg128.h>

void Delay();

void main(void)
{
DDRB = 0xff; // PTB as output


PORTB = 0xff; // LEDs off
INTCR = 0xC0;


EnableInterrupts;
for (;;);
}



#pragma CODE_SEG NON_BANKED // Define Program ROM and Interrupt Vectors,in Non_Bank Area
#pragma TRAP_PROC // Define SegMent of Interrupt Serve Entrance




void OutINT(void)
{
DisableInterrupts;
Delay();
PORTB = ~PORTB;
Delay();
EnableInterrupts;
}

#pragma CODE_SEG DEFAULT // Define Program ROM and Interrupt Vectors,Return Default Area


void Delay(void)
{
int i,j;
for(i = 0; i<1000; i++)
{
for(j = 0; j<1000; j++);
}
}



WfBk3Cbg.jpg
pHuvLdFe.jpg

[此贴子已经被作者于2009-5-12 22:41:30编辑过]



图片附件: [大家帮忙看下这个外部中断!或者发给我一个外部中断的例程,谢谢了!] WfBk3Cbg.jpg (2009-5-12 22:14, 20.58 KB) / 下载次数 328
http://bbs.eccn.com/attachment.php?aid=6842&k=a08c981825acfc3e8cbcab0f48ddf7d4&t=1716435932&sid=d0SOs3



图片附件: [大家帮忙看下这个外部中断!或者发给我一个外部中断的例程,谢谢了!] pHuvLdFe.jpg (2009-5-12 22:14, 7.35 KB) / 下载次数 337
http://bbs.eccn.com/attachment.php?aid=6843&k=767fc30a3c09905407df48e92696aa7c&t=1716435932&sid=d0SOs3


作者: strongchen    时间: 2009-5-13 10:51

可能是信号抖动引起的。加上硬件或软件的去抖处理就可以了。
作者: shigure.asa    时间: 2009-5-13 11:18

我里面的delay函数就是去抖的啊!还是不起作用啊!当然,是不是我的去抖写的有问题呢?

其实我猜也应该是硬件问题,而且多半是抖动的问题,因为Debug的时候,一点问题都没有,中断就只执行了一次,很正常,但是一整体运行,就总是中断两次——灯的状态总是要改变两次。真是搞人啊!

当然不知道是不是这个问题:我下降沿脉冲的触发方式有问题——我硬件上线路接法有问题!

希望版主能给点解决方法吧!万分感谢!

[em72]
作者: strongchen    时间: 2009-5-14 10:39

可以先加个阻容滤波电路试试。
作者: shigure.asa    时间: 2009-5-14 10:44

我会好好考虑版主的意见的,谢谢 !






欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0