打印
[AVR单片机]

atmega128外部中断

[复制链接]
5950|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
suoma|  楼主 | 2010-3-9 19:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
帮我看一下下面这个程序:为什么中断0可以(指示灯有变化),中断1却不可以?

#include <mega128.h>
#define uchar  unsigned char
#define uint unsigned int
#define LED 7          //PORTB 0
//us级别的延时函数
void D_us(unsigned int u)
{
   do
        {
        u--;
        }      
   while(u>1);
}   
//ms级别的延时函数
void D_ms(unsigned int m)
{
  while(m!=0)
        {
        D_us(1000);
        m--;
        }
}   
//中断服务程序
//INT7~INT0位1,且状态寄存器SERG的I标志置位时,相应的外部引脚中断就使能了,
//INT0引脚电平发生变化,产生中断
/*interrupt [EXT_INT0] void int_a(void)
{
   uchar temp;
   temp=SREG;
   D_ms(100);
   PORTB^=(1<<LED);  //取反  ,LED
   SREG=temp;
} */         
interrupt [EXT_INT1] void int_b(void)
{
   uchar temp1;
   temp1=SREG;
   D_ms(100);
   PORTB^=(1<<LED);  //取反  ,LED
   SREG=temp1;
  }
void main(void)
{
   SREG=0x00;  //禁止总中断
   DDRB=0xff;  // PORTB7输出
   DDRD=0x00;
   PORTB &=~(1<<LED); //清零 低电平点亮LED
  
   SREG=0x80;         //总中断允许   
   EIMSK=0x03;        //INT0-INT1中断使能
   EICRA=0x00;
  
   while(1)          //循环等待中断
     {
     ;
     }
}

相关帖子

沙发
Karlshen| | 2010-3-9 20:18 | 只看该作者
void D_ms(unsigned int m)
{
  while(m!=0)
        {
        D_us(1000);
        m--;
        }
}   

延时函数还可以这样写?

使用特权

评论回复
板凳
liao_fangxing| | 2010-3-10 11:54 | 只看该作者
interrupt [EXT_INT1] void int_b(void)
{
   uchar temp1;
   temp1=SREG;
   D_ms(100);——————————————中断里待这么久  不大好吧
   PORTB^=(1<<LED);  //取反  ,LED
   SREG=temp1;
  }

使用特权

评论回复
地板
suoma|  楼主 | 2010-4-7 21:28 | 只看该作者
中断里待这么久  不大好吧
为什么呢?

使用特权

评论回复
5
SHSLZHZ| | 2010-4-9 10:46 | 只看该作者
1# suoma
你既然设置为外部低电平中断的,那你只要把INT的管脚设置为上拉输入就行了.....

使用特权

评论回复
6
liao_fangxing| | 2010-4-9 14:55 | 只看该作者
为什么呢?
suoma 发表于 2010-4-7 21:28


1、在中断频繁时易嵌套…………堆栈易溢出
2、中断里待的久就意味着外面处理时间缩短;P

使用特权

评论回复
7
suoma|  楼主 | 2010-4-17 21:58 | 只看该作者
好的,谢谢,见笑了

使用特权

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

本版积分规则

82

主题

714

帖子

5

粉丝