打印
[AVR单片机]

ATMEGA8外部中断1问题

[复制链接]
1018|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
190008417|  楼主 | 2015-10-16 17:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请各位大侠帮我看看这个中断程序,在ATMEGA8里无法进入中断!程序如下:

#include <iom8v.h>  
#include<macros.h>

  void delay_nus(unsigned int us)
{
   unsigned int i;
  i = us/2;
  i--;
  asm("nop"); asm("nop");
    for(;i!=0;i--)      
    {
          asm("nop");     asm("nop");    asm("nop");
                  asm("nop");     asm("nop");    asm("nop");
                  asm("nop");     asm("nop");    asm("nop");     
    }
   
}



void delay_nms(unsigned int t)
{  
    for(;t>0;t--)      
          delay_nus(1100);
         
}
void  main(void)  
{  
    DDRD &= ~(1 << DDD3);    //PD3外部中断1口设置为输入  
    PORTD |= (1 << PORTD3);  //PD3上拉电阻使能   
    DDRC=0xff;    //设置PC口为输出
        PORTC=0X00;   //设置PC口输出为低电平   
       
    MCUCR |= (1 << ISC11);//INT1 下降沿触发  
        MCUCR&=~(1 << ISC10);
    GICR |= (1 << INT1); //INT1 中断使能  
    SREG|=BIT(7); //使能全局中断   
  
    while(1)  
          ;
  
  
  
}  
  
//外部中断1服务程序  
#pragma interrupt_handler exint1_isr:0x02
void exint1_isr(void)
{  
   SREG&=~BIT(7);   
    PORTC^= 0xff;  //PC口接LED指示灯
   delay_nms(150);
   SREG|=BIT(7);
}

相关帖子

沙发
专注于嵌入式| | 2015-10-16 18:00 | 只看该作者
你那个延迟函数写的真不咋地

使用特权

评论回复
板凳
190008417|  楼主 | 2015-10-17 13:16 | 只看该作者
专注于嵌入式 发表于 2015-10-16 18:00
你那个延迟函数写的真不咋地

那个延迟函数没有问题,我在其他程序中能正常使用。请帮忙看看为什么不能进入中断1,

使用特权

评论回复
地板
专注于嵌入式| | 2015-10-18 14:29 | 只看该作者
程序写的不对呗。你那个要么中断没打开,或者打开的时候,。在运行过程中被关掉了,或者没有有效的触发源

使用特权

评论回复
5
190008417|  楼主 | 2015-10-18 16:25 | 只看该作者
专注于嵌入式 发表于 2015-10-18 14:29
程序写的不对呗。你那个要么中断没打开,或者打开的时候,。在运行过程中被关掉了,或者没有有效的触发源 ...

我的触发源是,开关通过10K电阻接5V电源上,开关和电阻连接端直接接PD3(atmega8的中断1),开关的另一端直接接地。每按一次开关,PD3的引脚电平变化一次,用示波器测试波形正常。

使用特权

评论回复
6
元方义城| | 2015-10-19 09:29 | 只看该作者
#pragma interrupt_handler exint1_isr:3
void exint1_isr(void)
{  
   SREG&=~BIT(7);   
    PORTC^= 0xff;  //PC口接LED指示灯
   delay_nms(150);
   SREG|=BIT(7);
}
0x02应是中断向量吧,直接写3就可以了。中断里一般是不要用延时函数,你的程序是想将LED按一下按钮就亮灭吧,将中断里关闭总中断和打开总中断的全关掉试试

使用特权

评论回复
7
190008417|  楼主 | 2015-10-19 16:25 | 只看该作者
本帖最后由 190008417 于 2015-10-19 17:24 编辑
元方义城 发表于 2015-10-19 09:29
#pragma interrupt_handler exint1_isr:3
void exint1_isr(void)
{  

非常感谢,按你的操作方法,问题已经解决了。

使用特权

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

本版积分规则

1

主题

7

帖子

0

粉丝