4259|4

14

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

mega128外部中断导致复位 [复制链接]

我买了一块开发板,但是在测试外部中断时发现老是导致系统复位,请各位看看哪里出问题。即每当按一个按键,该按键连接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);
  }
}


最新回复

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

回复
举报

218

帖子

0

TA的资源

一粒金砂(高级)

沙发
 
发送数据既然没有中断,那就把串口收发中断都关掉试试。
 
 
 

回复

14

帖子

0

TA的资源

一粒金砂(中级)

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

刚开始没有串口中断,发现外部中断不起作用,加上串口只是为了验证复位
 
 
 

回复

14

帖子

0

TA的资源

一粒金砂(中级)

4
 
是单片机机的原因,不是程序设置的事
 
 
 

回复

14

帖子

0

TA的资源

一粒金砂(中级)

5
 
单片机可能在调试时被损坏了,换一个单片机就好了。程序没有问题
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表