Atmega128加电后进不去串口接收中断,重新复位后正常
最近调试Atmega128时,发现一个奇怪的问题。系统加电后,单片机进不去串口接收中断,但是可以发送串口数据,IO口控制继电器也是正常的,用镊子短接RST和地后,单片机便可以进入串口接收中断了。复位管脚接了上拉的10K电阻,和0.1UF的下拉。请大家解答以下,不胜感激。 我也是新手啊:复位后程序应该不会执行,怎么还会进入中断。方便把电路图和代码贴上来不。你是怎么知道进入中断程序的。寄存器设置的可以吗,atmega128有一个兼容103的,我原来写过一个程序把兼容103使能了,程序就运行错了,你可以看看熔丝位。最好把电路和程序贴过来。 试试改变熔丝里BOD的设置? 有没有解决啊??? 两眼一抹黑啊 你这么讲,谁明白啊。没程序没真相啊。 {:smile:}{:smile:}{:smile:}{:smile:}{:smile:}{:smile:} 框架是用CVAVR生成的,现象为上电复位后,芯片可以工作,比如发送串口数据。但是进不去接收中断,如果用ISP下载器重新下载程序或者进行其他操作后,芯片相当于重新复位,软件就可以进入接收中断。现在不明白,是硬件问题还是软件问题。
1、硬件采用AVR内部复位电路。
#include <mega64.h>
#include<delay.h>
#include<stdio.h>
// I2C Bus functions
#asm
.equ __i2c_port=0x12 ;PORTD
.equ __sda_bit=7
.equ __scl_bit=6
#endasm
#include <i2c.h>
// PCF8583 Real Time Clock functions
#include <pcf8583.h>
#define RXB8 1
#define TXB8 0
#define UPE 2
#define OVR 3
#define FE 4
#define UDRE 5
#define RXC 7
#define FRAMING_ERROR (1<<FE)
#define PARITY_ERROR (1<<UPE)
#define DATA_OVERRUN (1<<OVR)
#define DATA_REGISTER_EMPTY (1<<UDRE)
#define RX_COMPLETE (1<<RXC)
#define Setbit(x,y) x=x|(1<<y)
#define Clrbit(x,y) x=x&(~(1<<y))
void putchar1(char c);
void AnalysisCommand();
// USART1 Receiver buffer
#define RX_BUFFER_SIZE1 8
volatile char rx_buffer1;
#if RX_BUFFER_SIZE1<256
unsigned char rx_wr_index1,rx_rd_index1,rx_counter1;
#else
unsigned int rx_wr_index1,rx_rd_index1,rx_counter1;
#endif
// This flag is set on USART1 Receiver buffer overflow
bit rx_buffer_overflow1;
// USART1 Receiver interrupt service routine
interrupt void usart1_rx_isr(void)
{
char status,data;
status=UCSR1A;
data=UDR1;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
{
rx_buffer1=data;
if (++rx_wr_index1 == RX_BUFFER_SIZE1) rx_wr_index1=0;
if (++rx_counter1 == RX_BUFFER_SIZE1)
{
rx_counter1=0;
rx_buffer_overflow1=1;
};
};
}
// Get a character from the USART1 Receiver buffer
#pragma used+
char getchar1(void)
{
char data;
while (rx_counter1==0);
data=rx_buffer1;
if (++rx_rd_index1 == RX_BUFFER_SIZE1) rx_rd_index1=0;
#asm("cli")
--rx_counter1;
#asm("sei")
return data;
}
#pragma used-
// Write a character to the USART1 Transmitter
#pragma used+
void putchar1(char c)
{
while ((UCSR1A & DATA_REGISTER_EMPTY)==0);
UDR1=c;
}
voidAnalysisCommand() //命令分析,完成系统设置或者继电器控制。
{
if ((rx_buffer1==0x0A)&&(rx_buffer1==0x7F))
switch (rx_buffer1)
{
case 1: //获取系统时间,发送至主机
rtc_get_time(0,&h,&m,&s,&hs);
rtc_get_date(0,&date,&month,&year);
rx_buffer1 = 0xA0;
rx_buffer1= year;
rx_buffer1 = month;
rx_buffer1 = date;
rx_buffer1 = h;
rx_buffer1 = m;
rx_buffer1 = 0x7F;
for(SendCount=0;SendCount<8;SendCount++)
{
putchar1(rx_buffer1);
}
break;
case 2://设置系统时间
year=rx_buffer1;
month=rx_buffer1;
date=rx_buffer1;
h=rx_buffer1;
m=rx_buffer1;
rtc_set_date(0, date, month,year);
rtc_set_time(0, h, m, 0, 0);
rx_buffer1 = 0xA0;
rx_buffer1 = 0x7F;
for(SendCount=0;SendCount<8;SendCount++)
{
putchar1(rx_buffer1);
}
break;
case 5: //获取继电器的状态信息,确定是打开还是关闭
GetSW_Status();
break;
case 6: //判断打开哪路继电器
SwitchCommand=rx_buffer1;
OpenSW();
break;
case 9: //获取开关量的状态信息
GetAlarmInfo();
break;
default:break;
}
} Atmega128串口接收中断,现在解决没有?
页:
[1]