Chinaunix首页 | 论坛 | 博客
  • 博客访问: 125940
  • 博文数量: 21
  • 博客积分: 898
  • 博客等级: 准尉
  • 技术积分: 236
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-22 10:32
文章存档

2011年(8)

2010年(1)

2009年(6)

2008年(6)

我的朋友

分类: C/C++

2009-02-06 13:29:12

    最近在做一个液晶电视项目,客户要求RS232通迅,波特率为38400.项目本来使用12M晶振,但达到38400的波特率,12M计算出的T1的定时值不能整除,所以改用14.7456M(所用方案的芯片晶振为12M~15M)。但换了晶振之后,传输的数据都是乱码,也就是说不能正常通讯。
    原来使用12M晶振时,最高波特率能达到9600,14.7456M的能达到19200,但却达不到38400.按正常的计算公式计算T1的值,结果是整数;但是为什么实际上却达到不38400的波特率呢。
    最后没有办法,试了一下用模拟串口看行不行。修改了两天的程序,输出可以达到38400的波特率,但接收时误码很大,无法达到精度要求。头疼!
    在网上查找了很多相关资料,有的说最高只能达到19200的波特率,更高以上只能用模拟串口来实现。到最后,无意中发现说T1装载时也会有一个机器周期的时间误差,那是不是因为到38400的波特率时,正是由于这个误差,导至波特率的误差很大呢。于是试一试,T1的时间值-1,果然成功了。
最初的计算公式为:
    TL1 = 256-(2*2*OSCRate/384/BaudRate);
    TH1 = 256-(2*2*OSCRate/384/BaudRate); 
(PCON = 0x80并且芯片有倍频功能,即使用的频率为晶振*2) 
后来修改的公式为:
    TL1 = 256-(2*2*OSCRate/384/BaudRate)-1;
    TH1 = 256-(2*2*OSCRate/384/BaudRate)-1; 
也就是说把定时的时间延长了。那就是说原来的定时时间有点快了,导致了波特率误差大于了可接受误差。但是为什么定时器T1的定时时间的误差是快一个值而不是慢呢?以后再研究吧。
 
阅读(5753) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~