打印
[AVR单片机]

avr新手请教外部中断问题

[复制链接]
2375|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
nbj846589308|  楼主 | 2013-6-20 10:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
小弟最近在自学avr atmega128,测试一个外部中断的小程序,想实现如下功能,开始时PE口led灯亮,按下int0按键后,led灯灭。环境为ICCAVR7,编译通过。但是中断始终不起作用,请各位帮忙检查哪有有问题。程序如下,谢谢。
#include "iom128v.h"
#include "macros.h"
//#include "cfg.h"
#pragma interrupt_handler Int0_isr:2
void Int0_isr(void)
{
PORTE=0xff;
}

void main(void)
{
EIMSK|=0x01;                            //使能外部中断0
EICRA=0x03;                            //下降沿触发方式
MCUCSR=0x00;                        

DDRE=0xFF; //PE口配置为输出
PORTE=0x00; //PE口初始值为"1"
SEI();
while(1)
{;}
}

相关帖子

沙发
qin552011373| | 2013-6-20 23:14 | 只看该作者
程序设置了么

使用特权

评论回复
板凳
nbj846589308|  楼主 | 2013-6-21 10:16 | 只看该作者
qin552011373 发表于 2013-6-20 23:14
程序设置了么

设置了啊,刚开始忘记了一条语句
DDRD=0x00;
PORTD=0xff;
这是中断按键的设置
现在又个问题,就是中断起作用了,但是下降沿触发却没有现象,低电平触发有现象。低电平触发现象:按住key0之后led由亮转灭,松开后又转亮(我觉得松开后不该转亮)。问题:为什么中断执行之后PORTE的值为什么又回到主函数的0x00,而不是中断里面的0xff?? 难道中断程序执行结束后要把main里面的内容全部重新执行一遍?

使用特权

评论回复
地板
qin552011373| | 2013-6-23 22:01 | 只看该作者
nbj846589308 发表于 2013-6-21 10:16
设置了啊,刚开始忘记了一条语句
DDRD=0x00;
PORTD=0xff;

结束以后应该不会执行while1外面的  感觉很奇怪

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
nbj846589308 + 1 很给力!
5
nbj846589308|  楼主 | 2013-6-24 14:10 | 只看该作者
qin552011373 发表于 2013-6-23 22:01
结束以后应该不会执行while1外面的  感觉很奇怪

十分感谢斑竹的回复。是的,我现在还没解决这个问题,就是执行完这个中断之后程序会把主程序重新执行一遍,然后中断里给某个量赋的值又变成了主函数里面这个量的初始值,不知道怎么回事。

使用特权

评论回复
6
zezy371| | 2013-6-24 16:09 | 只看该作者
你的EICRA=0x03;                            //下降沿触发方式
错了应该是EICRA=0x02 ;                 //下降沿触发方式

使用特权

评论回复
7
nbj846589308|  楼主 | 2013-6-24 16:22 | 只看该作者
zezy371 发表于 2013-6-24 16:09
你的EICRA=0x03;                            //下降沿触发方式
错了应该是EICRA=0x02 ;                 / ...

十分感谢您仔细浏览了我的帖子,是我写错了,EICRA=0x02 才是下降沿产生中断,但是EICRA=0x03是上升沿产生中断,效果不是应该一样吗?按下一次按钮并松开应该是一样的效果吧?现在中断已经有作用了,是端口的设置问题。但又有另一个问题就是执行完这个中断之后程序会把主程序重新执行一遍,然后中断里给某个量赋的值又变成了主函数里面这个量的初始值,我觉得在中断执行之后应该继续回到while循环中,并且中断中给端口赋的值应该不变。不知道怎么回事,请指教。

使用特权

评论回复
8
zezy371| | 2013-6-24 16:33 | 只看该作者
另外还要设置INT0的端口为带上拉的输入
代码是:PORTD=0x01; DDRD=0x00;

使用特权

评论回复
评分
参与人数 1威望 +6 收起 理由
qin552011373 + 6 很给力!
9
nbj846589308|  楼主 | 2013-6-25 14:16 | 只看该作者
zezy371 发表于 2013-6-24 16:33
另外还要设置INT0的端口为带上拉的输入
代码是:PORTD=0x01; DDRD=0x00;

谢谢您的提醒。已经加上了,我帖上来的是以前的程序,最新的自己已经加上了,不设置内部上拉按键是没用的。上面的问题还是没有解决,就是中断执行结束之后又重新执行主程序的问题。请指教,谢谢。

使用特权

评论回复
10
huangxz| | 2013-6-25 14:23 | 只看该作者
nbj846589308 发表于 2013-6-25 14:16
谢谢您的提醒。已经加上了,我帖上来的是以前的程序,最新的自己已经加上了,不设置内部上拉按键是没用的 ...

重新开始一般都是中断向量的问题引起的。你看看编译器里面的器件有没有选对,

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
nbj846589308 + 1 很给力!
11
nbj846589308|  楼主 | 2013-6-25 14:57 | 只看该作者
huangxz 发表于 2013-6-25 14:23
重新开始一般都是中断向量的问题引起的。你看看编译器里面的器件有没有选对,
...

非常感谢黄工的不吝赐教,刚去尝试了一下,就是这个原因,程序已经正常运行了,被这个小问题困扰了好久,到处问人也没问出个结果,还是自己做事不够细心。

使用特权

评论回复
12
huangxz| | 2013-6-25 19:34 | 只看该作者
nbj846589308 发表于 2013-6-25 14:57
非常感谢黄工的不吝赐教,刚去尝试了一下,就是这个原因,程序已经正常运行了,被这个小问题困扰了好久, ...

使用特权

评论回复
评分
参与人数 1威望 +6 收起 理由
qin552011373 + 6 很给力!
13
qin552011373| | 2013-6-26 01:21 | 只看该作者
器件弄错了。。。。。

使用特权

评论回复
14
nbj846589308|  楼主 | 2013-6-27 09:24 | 只看该作者
qin552011373 发表于 2013-6-26 01:21
器件弄错了。。。。。

自己太粗心了,让斑竹费心了啊,哈哈。

使用特权

评论回复
15
sanguanko| | 2015-3-7 21:56 | 只看该作者
#include <iom8v.h>
#include <macros.h>

extern unsigned char flag=0;

#pragma interrupt_handler int0_serve:2
int0_serve(void)
{
    CLI();
        flag=flag+1;
    putchar0(flag);
        if(flag==0x09) flag=0;
    SEI();       
}

int main(void)
{
    CLI();
        uart0_init();
        int0_init_H_to_L_edge();
        SEI();
        putchar0(flag);
        putchar0(0x55);
        while(flag==0x02)
          {
                  putchar0(0xaa);
          }       
                 
}
一上电串口会输出00和55,外中断是下降沿触发,按一次按键触发一次外中断,flag加1,当flag=0x02时,串口应该输出0xaa,但是没有,为什么?用的是ICCAVR V7.22编的。请指教,多谢。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

15

帖子

0

粉丝