打印
[AVR单片机]

maga 88 串口通讯问题

[复制链接]
2286|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
1shuchao|  楼主 | 2010-8-11 21:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
以前有用的是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都能正常工作的

相关帖子

沙发
believe0815| | 2010-10-13 03:46 | 只看该作者
粗略看了一下,发现你初始化部分把开总中断的语句注释掉了,不知道兄台主函数里面总中断开了没?

使用特权

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

本版积分规则

1

主题

1

帖子

0

粉丝