[原创] mega128外部中断导致复位

liuw2010   2015-11-22 22:09 楼主
我买了一块开发板,但是在测试外部中断时发现老是导致系统复位,请各位看看哪里出问题。即每当按一个按键,该按键连接GND和PD1(外部中断1),按下按键时,PD1接GND,引起中断来。初始化时串口发0x99,每当按按键触发中断时,在中断函数中发0x22然后重启。(现象就是每按键,串口收到一个22然后一个99)
有人说打开熔丝位103,即兼容mega103模式,我试过不行。况且也不符合理论

//***********************************************************************
//                        包含文件
//***********************************************************************

#include
#include
//#define         F_CPU        16000000                // 单片机主频为16MHz,用于延时子程序,熔丝位必须设置到外部高频晶振才行
#include
#include
#include
#include            //中断信号头文件
#include "Config.h"

//***********************************************************************
//                        定义变量区
//***********************************************************************

volatile unsigned char count=255;                              //定义键盘计数变量
uint   tx_count=200,tx_flag=0xff;

uchar usart_rx_data=0xff;

//***********************************************************************
//                        IO端口初始化
//***********************************************************************
//*************************************************************************
//                串口相关中断服务子程序
//*************************************************************************
                                     //数据发送结束中断向量
SIGNAL(SIG_USART0_TRANS)             //中断服务程序
{
   delay_ms(10);                            //相关操作
}/**/

                                    //数据接收结束中断向量

                                    //数据寄存器空中断向量

void Send_SingleChar(uchar usart_tx_data)
{
        while(!(UCSR0A&(1<
        udr0="usart_tx_data;"                                        //写入发送数据

        while(!(UCSR0A&(1<
        UCSR0A|=(1<
}
SIGNAL(SIG_USART0_RECV)             //中断服务程序
{
    usart_rx_data="UDR0;"             //将接收到的数据取出
        Send_SingleChar(usart_rx_data); //接收到的数据再发回电脑,显示在串口调试助手上
}/**/

void usart_init()
{
  ucsr0a="0x00;"                                 //单倍速模式

  ucsr0b="0x98;"                                 //接收中断允许,发送结束和寄存器空中断关闭,采用查询发送模式                              

  ucsr0c="(1<
  ubrr0h="baud_h;"                               //写波特率的值

  ubrr0l="baud_l;"
}

void system_init()
{
        ledddr="0xFF;

"        led="0xFF;

"        keyport="0x02;"                                               //PD1设置为输入,打开上拉,高电平

        keyddr="0xFD;"                                                //设置为输入,PD1上拉电阻使能有效
}

//*************************************************************************
//                        将count值送入到LED发光二极管显示
//*************************************************************************

void Display_Key(unsigned char num)
{
        led="num;
"        delay_ms(1000);

}

//*************************************************************************
//                        中断初始化设置
//*************************************************************************
void interrupt_init()
{

  EIMSK|=0x02;                                             //使能外部中断0和外部中断1

  eicra="0x0A;"                                             //下降沿触发方式

  mcucsr="0x00;"                                            //控制和状态寄存器初始化

}

//*************************************************************************
//           中断服务子程序
//*************************************************************************

/*ISR(INT0_vect)                                                           //中断0服务程序
{


}*/


ISR(INT1_vect)                                                           //中断1服务程序
{
/*if(!(PIND  & (1 <<  PD1)))
{
        delay_ms(50);
        if(!(PIND  & (1 <<  PD1)))
        {
                delay_ms(50);
                if(!(PIND  & (1 <<        PD1)))
                {
                        if(count)
                                 count--;
                         else
                                count="255;
"                        
                }
        }
}*/
//EIFR&=(1<          //SREG|=0x80;
Send_SingleChar(0x22);


}


//*************************************************************************
//                        主程序
//*************************************************************************
int main(void)
{
  system_init();                                             //系统初始化
  usart_init();                                                          //usart串口初始化配置
  interrupt_init();                                          //中断配置初始化
  SREG|=0x80;                                                //开启全局中断
  Send_SingleChar(0x99);
  Display_Key(0xF0);
  delay_ms(500);


  while(1)
  {
    Display_Key(0xFF);                                  //显示键值到8位LED灯

        Send_SingleChar(0x11);
        delay_ms(1000);
  }
}


回复评论 (4)

发送数据既然没有中断,那就把串口收发中断都关掉试试。
点赞  2015-11-22 22:30
引用: digitaltek 发表于 2015-11-22 22:30
发送数据既然没有中断,那就把串口收发中断都关掉试试。

刚开始没有串口中断,发现外部中断不起作用,加上串口只是为了验证复位
点赞  2015-11-24 14:21
是单片机机的原因,不是程序设置的事
点赞  2015-11-25 09:10
单片机可能在调试时被损坏了,换一个单片机就好了。程序没有问题
点赞  2015-11-25 09:11
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复