[AVR单片机] M128的串口0,怎么也发不出去数据.

[复制链接]
1929|10
 楼主| cpu51 发表于 2014-6-4 17:14 | 显示全部楼层 |阅读模式
//PE口TX脚一直为高电平.没有数据.
void port_init(void)
{
PORTA = 0x0F;
DDRA  = 0xEF;

PORTB = 0xFF;
DDRB  = 0x03;
PORTC = 0xFF; //m103 output only
DDRC  = 0xFF;

PORTD = 0xF3;  //通讯口RX为输入
DDRD  = 0xFB;

PORTE = 0xFC; //FE//通讯口RX0为输入
DDRE  = 0xFE;

PORTF = 0xFF;
DDRF  = 0xFF;

PORTG = 0xFF;
DDRG  = 0xFF;

}

if(counter1>1600)
     {
           send_battery_voltage();
              counter1=0;
                  }
   else ;
   
//*****************************************************************************
//发送字符
//使用通讯口0
//*****************************************************************************
void send_char_tx0(unsigned char c)
{
        // UCSR0A|=(1<<TXC0);                
     while (! ( UCSR0A & (1<<UDRE0) ) )     //等待TXC置位
     ;            
     UDR0=c;                        //发送字符
        ;                 
     while(!(UCSR0A & (1<<TXC0)));           //等待发送完毕
     UCSR0A|=(1<<TXC0);               
}


//UART0 initialize
// desired baud rate: 9600
// actual: baud rate:9600 (0.0%)
// char size: 8 bit
// parity: Disabled
void uart0_init(void)
{
UCSR0B = 0x00; //disable while setting baud rate
UCSR0A = 0x00;
UCSR0C = 0x06;
UBRR0L = 0x47; //set baud rate lo
UBRR0H = 0x00; //set baud rate hi
UCSR0B = 0x90;

  UCSR0A=0x00;                             //单倍速模式   
  UCSR0B=0x00;                             //清空控制寄存器,禁止所有中断                     
  UCSR0C=(1<<UCSZ01)|(1<<UCSZ00);          //写UCSRC寄存器,异步通信无校验,8位数据1位停止位
  //UBRR0H=(fosc/(16*baud)-1)/256;           //写波特率的值
  //UBRR0L=(fosc/(16*baud)-1)%256;
  UCSR0B=(1<<RXEN0)|(1<<TXEN0);            //接收、发送使能
}

void main(void)
{
CLI();
init_devices();
/*
run_led_l; delay_ms(500); run_led_h;
alm_led_l; delay_ms(500); alm_led_h;
comm_led_l; delay_ms(500); comm_led_h; delay_ms(500);
  */

while(1)
{  
  counter1=counter1+1;


   if(counter1==1)
      {
            ;
           }
          
   if(counter1>1600)
     {
           send_battery_voltage();
              counter1=0;
                  }
   else ;
   WDR ();
   }
}
ningling_21 发表于 2014-6-4 19:33 | 显示全部楼层
本帖最后由 ningling_21 于 2014-6-4 19:36 编辑

明显程序有问题...
外部晶振8MHZ  ....MEGA128
以下程序正常运行...
  1.   /***************串口0初始化********************/
  2. void uart0_init(void)
  3. {
  4. UCSR0B = 0x00; //disable while setting baud rate
  5. UCSR0A = 0x00;
  6. UCSR0C = 0x06;
  7. //UBRR0L = 0x47; //baud rate=9600
  8. UBRR0L = 0x33;
  9. UBRR0H = 0x00; //
  10. UCSR0B = 0x98;
  11. }        

  12. /**************发送采用查询方式**************/
  13. void uart0_send(uchar c)
  14. {
  15.   while( !(UCSR0A & (1<<UDRE0)) );
  16.         UDR0=c;
  17. }  
 楼主| cpu51 发表于 2014-6-5 11:16 | 显示全部楼层
主程序问题,现在可以发送了,但计算机收到的数据不正确,我单片机程序里发送的00,01,02,03,04,05,06,07.收到的是 FD,FB,F9,F7,F5,F3,F1,00,什么问题呢?
8位数据1位停止位,无校验,9600BPS
ningling_21 发表于 2014-6-5 11:26 | 显示全部楼层
cpu51 发表于 2014-6-5 11:16
主程序问题,现在可以发送了,但计算机收到的数据不正确,我单片机程序里发送的00,01,02,03,04,05,06,07.收到 ...

关键是波特率,晶振和 定时器初值 一定要对应...
 楼主| cpu51 发表于 2014-6-5 16:24 | 显示全部楼层
ningling_21 发表于 2014-6-5 11:26
关键是波特率,晶振和 定时器初值 一定要对应...

晶振是11.0592M, 定时器初值是指UBRR0L = 0x47;UBRR0H = 0x00;,对吧?这个是用ICC生成的,不会错的.
ningling_21 发表于 2014-6-5 17:08 | 显示全部楼层
cpu51 发表于 2014-6-5 16:24
晶振是11.0592M, 定时器初值是指UBRR0L = 0x47;UBRR0H = 0x00;,对吧?这个是用ICC生成的,不会错的. ...

这个晶振我也试过,波特率误差太大...

后来换成8MHZ,初值设置为UBRR0L = 0x33; 就正常了9600...

当然熔丝也要设置正确...
 楼主| cpu51 发表于 2014-6-5 19:47 | 显示全部楼层
本帖最后由 cpu51 于 2014-6-5 19:56 编辑

没有问题,我接收端换了1200一直到14400都这样.
另外一个现象:我将PORTE的口线TX0置输出低电平,RX0置输入低电平,不发送无接收,测量TX0线为5V, RX0为1.3V,这没有道理吧?
ningling_21 发表于 2014-6-6 10:42 | 显示全部楼层
cpu51 发表于 2014-6-5 19:47
没有问题,我接收端换了1200一直到14400都这样.
另外一个现象:我将PORTE的口线TX0置输出低电平,RX0置输入低 ...

用做UART后,端口就不再需要设置输入输出...
 楼主| cpu51 发表于 2014-6-6 11:15 | 显示全部楼层
熔丝设置如下

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×

评论

熔丝设置有问题  发表于 2014-6-9 11:16
ningling_21 发表于 2014-6-9 11:16 | 显示全部楼层


就是熔丝设置有问题

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
mingsealtyj 发表于 2014-6-10 13:02 | 显示全部楼层
不知道楼主解决没有 建议先置位 UCSRC的URSEL位
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:承接工业远程控制系统及设计研发,DCS控制系统,无线采集控制系统,单片机设计,工业设备维修,仪器仪表、控制系统维护、检修。

99

主题

461

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部