打印
[AVR单片机]

ATMEGA64L运行中修改串口波特率波特率

[复制链接]
2681|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
伟峰电子|  楼主 | 2013-9-4 14:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
   目前在做一个案子,要求能监测到485、232的数据,这里只说232部分的。
   主程序运行之后,根据键盘输入,需要修改232的串口波特率,现在我的情况是根据键盘输入,跟初始化一样,那样子去修改波特率。如下:
   初始化::
   //UART1 initialize
// desired baud rate:9600
void uart1_init(void)
{
UCSR1B = 0x00; //disable while setting baud rate
UCSR1A = 0x00;
UCSR1C = 0x06;
UBRR1L = 0x33; //set baud rate lo
UBRR1H = 0x00; //set baud rate hi
UCSR1B = 0x18;
}

  运行中需要修改波特率时,比如改为2400,我就调用下面的语句:
  void uart1_2400(void)
{
  uchar i;
  CLI(); //disable all interrupts
UCSR1B = 0x00; //disable while setting baud rate
UCSR1A = 0x00;
UCSR1C = 0x06;
UBRR1L = 0xCF; //set baud rate lo
UBRR1H = 0x00; //set baud rate hi       
UCSR1B = 0x18;
UCSR1A = 0x00;
delay(100);
   for(i=0;i<200;i++)
      Comm_ReceiveData[0]=UDR1;
SEI(); //re-enable interrupts
}
  结果是修改了波特率之后,没有反应,程序中,没有使用中断,我是用查询的方式来做检测是否收到数据,如下:
  void new_dat5(void)//数据监视数据更新
{
  //baud_chage();
  uart1_rx_isr11();
  if(oldData_Count!=Data_Count)
    {
          draw_data();
          oldData_Count=Data_Count;
        }
}
//uart1_rx的查询处理方式
void uart1_rx_isr11(void)
{
  if((UCSR1A&0x80))
   {
    UCSR1A=0;
    Comm_ReceiveData[Data_Count]=UDR1;
    Data_Count++;
        uart1_tran(UDR1);
   }
}
现在是用电脑上串口调试工具,发数据(波特率什么的都设置好了),结果是没有回数据。不知道为什么,请做过的朋友指导一下。谢谢!

相关帖子

沙发
伟峰电子|  楼主 | 2013-9-4 15:49 | 只看该作者
顺便说下,我的是异步串口操作,主晶振8MHZ。

使用特权

评论回复
板凳
huangxz| | 2013-9-4 23:15 | 只看该作者
描述的不是很清楚,是不是所有波特率都没收到数据啊

使用特权

评论回复
地板
伟峰电子|  楼主 | 2013-9-5 07:46 | 只看该作者
最新进展:
    我把串口改为中断接收,如下:
#pragma interrupt_handler uart1_rx_isr:31
void uart1_rx_isr(void)
{
UCSR1A&=0x7f;
  if(Data_Count>21)
    {
          Data_Count=0;
        }
Comm_ReceiveData[Data_Count]=UDR1;
Data_Count++;
//uart1_tran(Data_Count);
uart1_tran(UDR1);
}
   下载程序之后,过程是这样的,初始化9600》进入波特率修改,修改为2400;上位机的串口调试工具发一个字节0x01,刚开始还可以接收,也能在液晶屏上显示;然后我改成发两个字节 0x01,0x02,手动试的,也正常,增加到5个字节的时候,刚开始是正常的,后来我点了下自动发送,时间间隔0.5ms,一会就异常了。单片机自动发送了几千个字节(程序正常的话不会有这样的动作),然后就不发送数据了,下面我再点发送数据,单片机没有反应,好像是没有接收到数据一样。我关机,再开,也是没反应。但是单片机的其他操作,如键盘,还是正常的。

使用特权

评论回复
5
伟峰电子|  楼主 | 2013-9-5 07:49 | 只看该作者
貌似是修改波特率之后,稳定了一会,然后就一直陷入在串口中断里面了。

使用特权

评论回复
6
huangxz| | 2013-9-5 09:32 | 只看该作者
呵呵,楼主这是典型的流程处理问题。
在写实际应用的程序之前,要对单片机的处理能力要十分有数,而且每一步执行都要做到在自己的意料之中。

使用特权

评论回复
7
伟峰电子|  楼主 | 2013-9-5 13:43 | 只看该作者
关键是在MEGA16上都可以实现的,但是到MEGA64上就出现了这样的问题。。。。。。。。。

使用特权

评论回复
8
qin552011373| | 2013-9-6 08:20 | 只看该作者
肯定可以修改   楼主应该从逻辑上再下点功夫

使用特权

评论回复
9
伟峰电子|  楼主 | 2013-9-7 19:24 | 只看该作者
我的是键盘操作,检测到那个按键之后,设置标志位,判断该标志位成立,就修改成相应的那个波特率,逻辑上按键依次选择一个波特率,只修改这一次,并且在修改之后,还有100ms的延时。逻辑上应该是没错。

使用特权

评论回复
10
ar3000a| | 2014-5-12 09:24 | 只看该作者
解决了没有? 理论上没问题啊。直接改波特率寄存器就行。

使用特权

评论回复
11
grasswolfs| | 2014-5-12 09:53 | 只看该作者
伟峰电子 发表于 2013-9-5 13:43
关键是在MEGA16上都可以实现的,但是到MEGA64上就出现了这样的问题。。。。。。。。。 ...

之前记得mega64和mega16兼容在晶振这里有点问题,有可能是8M晶振的问题,换个高的试试

使用特权

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

本版积分规则

3

主题

24

帖子

0

粉丝