打印
[C语言]

这样的通信方式代码怎么写?各位有什么高见?

[复制链接]
1613|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hualiming025|  楼主 | 2014-3-21 11:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 hualiming025 于 2014-3-24 10:49 编辑

这样的通信方式代码怎么写?各位有什么高见?
用的是avr16单片机,现在需要和一电动车仪表通信,一帧10个字节。通信本不是难事,但是这个仪表通信采用非标准通信方式。见通信协议原文的部分说明:
本约定自带传送速率基准,主从方式采用单线单向传输,即只需要一根传输线路,接口通用方便;
1.以下时间宽度误差允许范围+-20%


上面的通信约定我分析了下,在单片机中只要写出三个最基本的函数代码就行了,分别是
同步信号()
发送1()
发送0()
函数实现,关键在于时间的控制,然后在时间点上在IO口输出电平。
在单片机中实现这三个函数最容易的应该是使用延时函数,但ms级的延时要不得啊,其他代码得执行。
此外就是使用定时器控制时间,但是这三个函数如何实现难度就比较大了。
另外,我程序主循环时间是us级的,我的设想是,设置一个计数变量,循环个n次之后时间刚好1ms,这时调用一下发送函数,来实现发送。这个想法的难点也在于上述三个基本函数的实现,代码怎么写现在还没个明确的头绪。

请问各位,有何高见?尽管说说看  


补充说明一下,跟仪表通信,我单片机只要发送,不要接收







搜狗截图20140321103401.png (9.85 KB )

搜狗截图20140321103401.png

相关帖子

沙发
ningling_21| | 2014-3-21 11:43 | 只看该作者
用定时器定时1毫秒的时基,其它根据状态机在定时中断中实现...

使用特权

评论回复
板凳
hualiming025|  楼主 | 2014-3-21 11:51 | 只看该作者
ningling_21 发表于 2014-3-21 11:43
用定时器定时1毫秒的时基,其它根据状态机在定时中断中实现...

不错的一个思路,请问使用状态机又如何划分状态呢?

使用特权

评论回复
地板
ayb_ice| | 2014-3-21 11:52 | 只看该作者
这信号差别太明显了

使用特权

评论回复
5
hualiming025|  楼主 | 2014-3-21 12:12 | 只看该作者
ayb_ice 发表于 2014-3-21 11:52
这信号差别太明显了

您想表达什么?

使用特权

评论回复
6
ayb_ice| | 2014-3-21 13:30 | 只看该作者
明显就好弄啊
信号最小分辨率是1MS,以2倍的过采样频率采样就能轻松处理了,也就是0.5MS

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
hualiming025 + 2 说得对,不过这个单片机跟仪表通信只要按格.
7
gx_huang| | 2014-3-21 13:49 | 只看该作者
ayb_ice 发表于 2014-3-21 13:30
明显就好弄啊
信号最小分辨率是1MS,以2倍的过采样频率采样就能轻松处理了,也就是0.5MS ...

最小脉冲时间1MS,采用0.5MS采样一次是可以的,但是如果加滤波,最好定时时间再短一些。
所谓的2倍频率采样,指的是有限带宽的信号。
对于脉冲波,不是这么理解的。

使用特权

评论回复
8
hualiming025|  楼主 | 2014-3-21 13:50 | 只看该作者
ayb_ice 发表于 2014-3-21 13:30
明显就好弄啊
信号最小分辨率是1MS,以2倍的过采样频率采样就能轻松处理了,也就是0.5MS ...

单片机不要接收只要按格式发送

使用特权

评论回复
9
ayb_ice| | 2014-3-21 15:13 | 只看该作者
hualiming025 发表于 2014-3-21 13:50
单片机不要接收只要按格式发送

发送更方便了

使用特权

评论回复
10
ningling_21| | 2014-3-21 15:44 | 只看该作者
hualiming025 发表于 2014-3-21 11:51
不错的一个思路,请问使用状态机又如何划分状态呢?

基本的几个状态:
发送未开始,正在发送,发送结束;
发送0,发送1;
其它根据需要添加。

使用特权

评论回复
11
xiaox314| | 2014-3-21 23:09 | 只看该作者
实现起来应该不困难~

使用特权

评论回复
12
江枫渔火| | 2014-3-21 23:13 | 只看该作者
只要从信号的起始边沿开始延迟一个时间,这个时间干好落在vail的时间段,就可以判定bit0还是bit1了。应该这样的单线协议都跟DQ协议类似,就是那个18B20用的那玩意儿。

使用特权

评论回复
13
hualiming025|  楼主 | 2014-3-24 11:15 | 只看该作者
江枫渔火 发表于 2014-3-21 23:13
只要从信号的起始边沿开始延迟一个时间,这个时间干好落在vail的时间段,就可以判定bit0还是bit1了。应该这 ...

这个通信方式接收倒好办,烦的是发送,程序如何组织。

使用特权

评论回复
14
hualiming025|  楼主 | 2014-3-24 11:15 | 只看该作者
xiaox314 发表于 2014-3-21 23:09
实现起来应该不困难~

具体讲讲撒

使用特权

评论回复
15
xiaox314| | 2014-3-24 14:38 | 只看该作者
hualiming025 发表于 2014-3-24 11:15
具体讲讲撒

具体就是用定时器加上状态机,定时器1ms定时,第一个状态是10ms低电平,第二个状态1ms高电平,第三个状态就是先1ms电平之后再判断数据是1还是0,比如是1,就跳到状态3,是0就跳到状态4,状态3就是2ms高电平,状态4就是1ms低电平再到状态5,状态51ms高电平~

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
hualiming025 + 2 很给力!
16
liub_2014| | 2014-4-11 14:51 | 只看该作者
楼主啊,按照协议在空闲状态上电平应该是L还H?

使用特权

评论回复
17
hualiming025|  楼主 | 2014-4-14 12:13 | 只看该作者
liub_2014 发表于 2014-4-11 14:51
楼主啊,按照协议在空闲状态上电平应该是L还H?

空闲状态为L

使用特权

评论回复
18
hualiming025|  楼主 | 2014-4-14 12:15 | 只看该作者
现在通信已经做好了,等我有时间过来结贴,说说自己是怎么做的

使用特权

评论回复
19
liub_2014| | 2014-4-14 14:18 | 只看该作者
hualiming025 发表于 2014-4-14 12:13
空闲状态为L

这样的话你的协议是通过高电平的宽度决定信号类型,可以设置0.1ms左右的定时器,加上一个定时计数变量和一个比较变量,在发送函数里设置比较变量的值,清零计数器,并输出H。在定时器中断中判断计数器与比较值,大于就输出输出为L,并清零比较值。不过要注意调用发送函数的间隔

使用特权

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

本版积分规则

32

主题

114

帖子

2

粉丝