本帖最后由 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);
}
}
|