以前有用的是mega 8L芯片,所有程序都工作正常了,可是由于用3.6 电池供电,如果用mega8L 电压只用3.6伏-2.7伏=0.9伏的范围,而用MEGA 88 就有3.6伏-1.8伏=01.8伏的范围。现在问题就是mega 88 与计算机通讯,可以发送数据给就算机,但是就是收不到计算机发来的数据,接收是采取中断方式,MAX232 跟单片机两跟线,短路的话,计算机可以自发自收,不知道为收不到数据,还是进不了中断,接收。串口初始化,已经看了很多变,实在是找不到原因,本人用的是ICC-avr,现在都只能怀疑它的问题了,请大侠赐教。下面是初始话设置,
void uart_init(void)
{
UCSR0B = 0x00; //disable while setting baud rate
UCSR0A = 1<<U2X0; //波特率加倍
UCSR0C |= 0x06; //八位数据有效
// UCSR0C = (1<<URSEL01)|(1<<UCSZ00)|(1<<UCSZ00);
//UCSR0B = 0x98; //使能串口的接收和发送,接受允许中断
UCSR0B = (1<<RXEN0)|(1<<TXEN0)|(1<<RXCIE0);
UBRR0L = BAUDRATENUM;
UBRR0H = 0x00; //set baud rate hi
UCSR0A &= ~(1<<MPCM0); // 接收不区分地址、数据
//SREG |= BIT(7);
// areakind.ua.a=QUHAONUM;
}
#pragma interrupt_handler uart_rev:iv_USART0_RX
void uart_rev(void)
{ uchar UDRBACK,verify=0;
uint time;
uchar byebuf=0;
/*
//time=MAXRECEIVTIMENUM;
while(!(UCSR0A&(1<<RXC0))) ;
//UDRBACK=UDR0;
str1[0]=UDR0;
//cishucout=5;
*/
time=MAXRECEIVTIMENUM;
while(!(UCSR0A&(1<<RXC0)))
{if(time--) {return;} };
UDRBACK=UDR0;
verify+=UDRBACK;
if (UDRBACK!=STARTFLAG_NUM) return;
time=MAXRECEIVTIMENUM;
while(!(UCSR0A&(1<<RXC0)))
{if((time--)==0) {return;} };
UDRBACK=UDR0;
verify+=UDRBACK;
r_commpuer.r.byecount=UDRBACK;
for(byebuf=0;byebuf<(r_commpuer.r.byecount-1);byebuf++)
{
time=MAXRECEIVTIMENUM;
while(!(UCSR0A&(1<<RXC0))) {if((time--)==0) {return;} };
UDRBACK=UDR0;
verify+=UDRBACK;
r_commpuer.buf[1+byebuf]=UDRBACK;
}
time=MAXRECEIVTIMENUM;
while(!(UCSR0A&(1<<RXC0))) {if((time--)==0) {return;} };
UDRBACK=UDR0;
if (UDRBACK!=verify) {return;} //是否完整接收
/*if (areakind.ua.a!=r_commpuer.r.areakind) {return;} //接收地址不对,退出
if(r_commpuer.r.command&1)//写命令,就不需要返回过多的状态
{s_wire.buf[0]= 5;
s_wire.buf[3]= RUNNINGNUM ;
s_wire.buf[4]= RUNNINGNUM ;
}*/
if((r_commpuer.r.command==COMPUTERCOMMAND_JCADDR_WR)||(r_commpuer.r.command==COMPUTERCOMMAND_JCADDR_RD)||(r_commpuer.r.command==COMPUTERCOMMAND_BAUDRATE_WR) )
{;}
else{if (areakind.ua.a!=r_commpuer.r.areakind) { return;} //接收地址不对,退出
}
r_commpuer.r.haveorno=1; //设置有中断命令
}
本程序在mega8L都能正常工作的 |