打印
[AVR单片机]

请教一个avr128串口通讯不能接收的问题

[复制链接]
1523|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zhangquanchang|  楼主 | 2015-10-25 11:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用avr128和3232串口通讯,开始用的是RXD1和TXD1,通讯正常。由于RXD1和TXD1和外部中断共用,我换成了RXD0和TXD0(接到PE0和PE1口上),在程序中也相应的作了修改,就是在程序中把1改成了0。比如在串口初始化时,把“UCSR1B = 0x98”改成“UCSR0B = 0x98”,以此类推。但是结果表明,单片机向电脑发送数据正常,但128接收不到电脑发来的数据,接收数据的二极管指示类也不亮,请问这是什么原因呢?

相关帖子

沙发
yubsh| | 2015-10-27 10:13 | 只看该作者
128的手册有明确定义,要仔细看各个寄存器定义,不是简单的1改0就完事了。

使用特权

评论回复
板凳
元方义城| | 2015-10-29 09:33 | 只看该作者
这样改没错,但是要根据头文件来看,这样改的也放心啊,发送正常,看看中断使能是否都正确了呢,我这边有个我原来改的: 参考一下吧


//--------------UART接受中断函数-----------------
#pragma interrupt_handler uart_rx0:19
void uart_rx0(void)
{
    static uchar EP;
    UCSR0B&=~BIT(RXCIE0);  //从上位机读取数据,RX中断使能关闭
    // UCSR1B&=~BIT(RXCIE1);  //从上位机读取数据,RX中断使能关闭
    String0[EP]=UDR0;
    //PORTB|=BIT(PB7);
    EP++;
    PORTB|=BIT(PB7);
    /*if(String0[1]==0x6B)
    {
      EP=0;
    }*/
    if(EP==13)  //String0[EP]==0x03&&
    {
    // EP_N=13;
     EP=0;
     flag0=1;
     PORTB&=~BIT(PB7);
    }
   
    //UCSR1B|=BIT(RXCIE1);//RX中断使能打开
    UCSR0B|=BIT(RXCIE0);//RX中断使能打开*/
   
}
#pragma interrupt_handler uart_rx1:31   
//中断向量19是RX0结束后开始  31是RX1结束后开始
//extern void delay(uint ms);
void uart_rx1(void)
{
    static uchar II=0; //定义局部函数内的静态变量
    UCSR1B&=~BIT(RXCIE1);  //从上位机读取数据,RX中断使能关闭
    //UCSR0B&=~BIT(RXCIE0);  //从上位机读取数据,RX中断使能关闭
    String1[II]=UDR1;
    II++;
    if(II==9)
    {   
       II=0;
       flag1=1;
    }
    UCSR1B|=BIT(RXCIE1);//RX中断使能打开
    //UCSR0B|=BIT(RXCIE0);//RX中断使能打开

}
//-------------------------------------------------------

// UART setup ----------------------------
//-------------------------------------
void uart0_init(uint baud)
{
   UCSR0B=0x00;
   UCSR0A=0x00;             //控制寄存器清零
   UCSR0C=(1<<UCSZ01)|(1<<UCSZ00);  
                                                        //选择UCSRC,异步模式,禁止                        
                                                     //   校验,1位停止位,8位数据位
   baud=mclk/16/baud-1    ;   //波特率最大为65K
   UBRR0L=baud;                                
   UBRR0H=baud>>8;            //设置波特率
   UCSR0B=(1<<TXEN0)|(1<<RXEN0)|(1<<RXCIE0); //UCSRB=(1<<TXEN)|(1<<RXEN)|(1<<RXCIE);
                                                       //接收、发送使能,接收中断使能
//  SREG=BIT(7);                    //全局中断开放
   DDRE|=0X02;                    //配置TX0为输出(很重要)
   //DDRD&=~BIT(0);

}
void uart1_init(uint baud)
{
   UCSR1B=0x00;
   UCSR1A=0x00;             //控制寄存器清零
   UCSR1C=(1<<UCSZ11)|(1<<UCSZ10);   
                                                        //选择UCSRC,异步模式,禁止                        
                                                     //   校验,1位停止位,8位数据位
   baud=mclk/16/baud-1    ;   //波特率最大为65K
   UBRR1L=baud;                                
   UBRR1H=baud>>8;            //设置波特率
  UCSR1B=(1<<TXEN1)|(1<<RXEN1)|(1<<RXCIE1); //UCSRB=(1<<TXEN)|(1<<RXEN)|(1<<RXCIE);
  // UCSR1B=0x98;                                 //接收中断允许,发送结束和寄存器空中断关闭,采用查询发送模式                                                    //接收、发送使能,接收中断使能
//  SREG=BIT(7);                    //全局中断开放
   DDRD|=0X04;                    //配置TX1为输出(很重要)
   //DDRD&=~BIT(0);

}
void UART_Send0(uchar Data[],uint num)
{
uint I;
// PORTD|=BIT(PD4);//PD=1 发送。
for(I=0;I<num;I++)
  {
   while(!(UCSR0A&(BIT(UDRE0)))); //数据寄存器UDR是否为空
   UDR0=Data[I]; //UDR赋值
   while(!(UCSR0A&(BIT(TXC0)))); //数据是否已经发送完毕?
   UCSR0A|=BIT(TXC0); //清除发送完毕标志位
  }
  delay(2);
//   PORTD&=~BIT(PD4);//PD=0;接收   
}
void UART_Send1(uchar Data[],uint num)//uart1带485输出
{
uint I;
//UCSRB=(1<<TXEN)|(1<<RXEN);
//UCSRB&=~(1<<RXCIE);//接收禁止
//TIMSK&=~BIT(2);//定时器1溢出中断关闭
PORTD|=BIT(PD4);//PD=1 发送。
for(I=0;I<num;I++)
  {
   while(!(UCSR1A&(BIT(UDRE1)))); //数据寄存器UDR是否为空
   UDR1=Data[I]; //UDR赋值
   while(!(UCSR1A&(BIT(TXC1)))); //数据是否已经发送完毕?
   UCSR1A|=BIT(TXC1); //清除发送完毕标志位
  }
//UCSRB=(1<<TXEN)|(1<<RXEN)|(1<<RXCIE);
//TIMSK|=BIT(2);//定时器1溢出中断打开
delay(2);
   PORTD&=~BIT(PD4);//PD=0;接收
}
//


使用特权

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

本版积分规则

14

主题

18

帖子

0

粉丝