打印
[AVR单片机]

外部中断导致复位

[复制链接]
1023|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
liuw2010|  楼主 | 2015-11-22 21:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liuw2010 于 2015-11-22 21:46 编辑

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

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

#include <string.h>
#include <stdio.h>
//#define         F_CPU        16000000                // 单片机主频为16MHz,用于延时子程序,熔丝位必须设置到外部高频晶振才行
#include <util/delay.h>
#include <avr/io.h>
#include <avr/iom128.h>
#include <avr/interrupt.h>           //中断信号头文件
#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<<UDRE0)));                //等待发送寄存器空

        UDR0=usart_tx_data;                                        //写入发送数据

        while(!(UCSR0A&(1<<TXC0)));                        //等待发送完毕

        UCSR0A|=(1<<TXC0);

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

void usart_init()
{
  UCSR0A=0x00;                                 //单倍速模式
  
  UCSR0B=0x98;                                 //接收中断允许,发送结束和寄存器空中断关闭,采用查询发送模式                              
  
  UCSR0C=(1<<UCSZ01)|(1<<UCSZ00);              //写UCSRC寄存器,异步通信无校验,8位数据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<<INTF1);
         //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);
  }
}

相关帖子

沙发
liuw2010|  楼主 | 2015-12-3 08:24 | 只看该作者
不好意思,是单片机坏了……

使用特权

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

本版积分规则

2

主题

15

帖子

1

粉丝