一种无晶振单片机RS232通信思路,不知可行否

[复制链接]
3637|12
 楼主| xsl. 发表于 2009-2-28 22:38 | 显示全部楼层 |阅读模式
缘由: 有一单片机,内置RC振荡,指令周期2~3us.
      单片机需要通过R232向PC端发送数据,
      但RC振荡精度差(+/-10%),不能用于R232的通信的定时器. 

思路: PC 端 TX 信号(经过max232)连接到 MCU 的外部中断口INT0.
      PC 定时(每隔4ms)向发送 0xAA(10101010),MCU利用此脉冲中断信号做为基准,同时向外发送比特流. 实现MCU到PC的单向通信.

不知道可行否?  
gw29 发表于 2009-2-28 23:33 | 显示全部楼层

re

不行

 楼主| xsl. 发表于 2009-2-28 23:42 | 显示全部楼层

re

为啥?

经计算,2400波特率,每bit 416.7us

1, 3%的误差相当于 416.7*3%= 12.5us  ,单片机指令2us, 在这个误差之内.
2, 而且,利用脉冲触发中断, 发送完 一个字节的数据之后 误差不会累积.

这两天看看有没有空,试试看
李冬发 发表于 2009-3-1 00:35 | 显示全部楼层

用不着每4ms发一次0xaa吧

在收到不到合法的数据包时,测串行数据脉宽就可以了。多测几个,值应该在某值的附近或其倍数的附近。否则继续测,一直到有几个合理值后就可以计算出自己的时钟值。再重设波特率参数。
quakegod 发表于 2009-3-1 03:23 | 显示全部楼层

嗯,你看那个STC单片机的串行下载

单片机刚上电的时候,对收到的数据包进行分析,
就能知道自己的时钟频率是多少了
然后以这个时钟频率为基础,设置波特率参数。
bg6nw 发表于 2009-3-1 06:24 | 显示全部楼层

记得匠人的BLOG里面

有一个自适应波特率的例子,可以参考一下
 楼主| xsl. 发表于 2009-3-1 10:05 | 显示全部楼层

好!大好! 借一下乘虚匠人的经验!

 楼主| xsl. 发表于 2009-3-1 10:26 | 显示全部楼层

匠人那里说的是自动检测标准的波特率,不合用

假设PC使用2400的波特率.
MCU用IO模拟,且用内置的1M RC 振荡做为时钟.

问题是如何纠正由于 RC振荡误差 引起的波特率的误差. 像4 5 楼提到的那样.
ayb_ice 发表于 2009-3-1 11:52 | 显示全部楼层

降低波特率

chunyang 发表于 2009-3-1 20:54 | 显示全部楼层

能否修正还要看MCU是否支持高分辨的波特率发生器

    比如普通51的12分频就很难修正,不分频的话,修正率就会高出12倍。至于方法问题,就是根据PC发出的定周期信号用定时器测量,然后做常数修正即可,很简单的。
 楼主| xsl. 发表于 2009-3-1 22:51 | 显示全部楼层

MCU没有波特率发生器,只能用IO模拟

RTC也只有 最高1/128s的中断速率.

效仿SPI的,用PC端TXD信号做为时钟,MCU根据TXD"时钟信号",每隔周期发送一个位数据.  这样就不需要做"校正"RC
wh6ic 发表于 2009-3-2 11:55 | 显示全部楼层

没必要4mS重发一次

上电热稳定后RC振荡器的输出只于电源电压有关,可以认为是不变的,握手成功后就基本上不用测了。当然前端经常上下电还是需要超时后发出握手字节。
cooperate 发表于 2009-3-2 20:56 | 显示全部楼层

有点困难

    MCU才0.4-05MIPS,RC误差最大已10%,做1200bps下勉强可行,速度再高的话估计软件很难做。当然具体要看你用的是什么mcu了。
   从性能看,LZ的MCU应该是低端的台湾mcu,要做好,恐怕要多费点脑汁了,呵呵
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

86

帖子

0

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