[求助] 关于点阵屏驱动的问题

GoldenPoato   2018-6-14 12:35 楼主
RT,本菜鸡最近一段时间自己娱乐了几块可级联的点阵屏。

想法是每块点阵屏由4块8*8的点阵组成,每块都有一片STC15w404AS来控制,并由74HC573来锁存输出。
由两根线统一对点阵屏组进行控制,一根为数据线,另外一根用于判断数据线是否有更新。由每块板上单片机解析并输出。

但我经实践后发现,若刷新频率过高,很有可能在输出过程中数据有更新,造成类似于马达缺步一样的问题。
请问各位dalao,如何提高这个程序的效率,减少缺步的可能性。

代码直接贴上来就太乱了,我放在ubuntu剪切板里
单片机上的C代码

另:本程序在48*32的点阵组下,以最高频率运行,每秒只能刷新10次左右,不符合我的需求。

多谢各位的帮助!

回复评论 (15)

很好奇Ubuntu这么好用怎么没有流行起来,其实电脑是可以不玩游戏的
点赞  2018-6-19 12:21
你这个程序一条道跑到黑不太好.
扫描用定时器定时完成,接收数据用中断.
点赞  2018-6-19 12:56
引用: huo_hu 发表于 2018-6-19 12:56
你这个程序一条道跑到黑不太好.
扫描用定时器定时完成,接收数据用中断.

感谢版主大大的回复。
但是我对定时器和中断不是很了解,能详细说说吗?
谢谢!
点赞  2018-6-19 18:36
引用: GoldenPoato 发表于 2018-6-19 18:36
感谢版主大大的回复。
但是我对定时器和中断不是很了解,能详细说说吗?
谢谢!

哪个书上都有
点赞  2018-6-19 18:50
引用: huo_hu 发表于 2018-6-19 18:50
哪个书上都有

我又仔细了解了一下,这种情况下是只能硬件中断吗?能软件中断吗?因为硬件中断的话又得多一条跳线,会很不耐用。
点赞  2018-6-19 22:59
你这个设计也没太看明白,你有原理图吗
点赞  2018-6-20 11:48
引用: huo_hu 发表于 2018-6-20 11:48
你这个设计也没太看明白,你有原理图吗

抱歉,我没画原理图,直接画的电路图 无标题.png
就是两条线控制,一条线用于传输数据,另一条线用于判断数据是否有变化。
现在我初步想法是从COM2拉一条跳线到某一个中断引脚,这样就可以方便看出是否有数据传输了。
但是跳线即不美观也不方便,但我又想不到软件中断的办法。
请问您有什么方法吗?

点赞  2018-6-20 23:00
有个疑问,你好像是多台下位机并联在通讯线上,如何界定数据是发送给哪一台下位机的?
如果有时钟线就用spi来实现,能实现很高的速率,你这个没有时钟,用单工的串口就行了.com2的作用是多余的,串口会检测数据线的跳变作为起始信号和你那个作用是一样的,用串口实现已经包含这部分了.
另外你说的"数据是否有变化"是什么意思?没变化就不发送就行了呗.
还有我看你是打算四个方向公用数据总线,那么通讯的速率你最好核算一下能否满足最坏情况的需要.
点赞  2018-6-21 08:15
回复了,怎么还要审核呀
点赞  2018-6-21 08:17
引用: GoldenPoato 发表于 2018-6-20 23:00 抱歉,我没画原理图,直接画的电路图 就是两条线控制,一条线用于传输数据,另一条线用于判断数据是否有 ...
重新编辑 有这么几个问题希望楼主考虑 1.你说的"数据是否有变化"逻辑上没理解什么意思,不更新就不发数据就行了呀. 2.数据收发没有时钟线你最好用串口实现,硬件上都是现成的.串口自己会检测数据线上的跳变作为起始信号. 3.你的设计好像是一主机多从机的结构,单条com2无法界定是发给哪个从机的,9位串口模式你可以考虑一下. 4.另外所有模块的刷新开始要有一个同步信号.(是不是就是com2呀^_^) 设计方案先做好再搞程序,这样少走弯路. 本帖最后由 huo_hu 于 2018-6-21 08:41 编辑
点赞  2018-6-21 08:26
你这个设计在显示静态画面的时候可以大幅减少数据传输量,但动态显示比如滚屏时就比较麻烦要结合软件指令才能达到最好的效果.
点赞  2018-6-21 08:50
引用: huo_hu 发表于 2018-6-21 08:26
重新编辑
有这么几个问题希望楼主考虑
1.你说的"数据是否有变化"逻辑上没理解什么意思,不更新就不发数 ...

我又去查了一轮资料,才刚刚知道我的COM2就是时钟线(我一开始的想法就是让它成为时钟线,但是不知道它的技术名称)。
为了防止我理解错误,我还是说明一下我COM2的意思以及这个项目的整体想法吧。

整个点阵屏我是打算一主多从机的结构。
我为了让从机界定数据接线,就制定了一个规则:
无标题.png

然后COM1就是那个数据线了,1表示当前点亮,0则反之。
COM2用于让判断COM1的数据是否有更新(即是否切换至下一个点更新) (应该就是类似时间信号了吧)

我的单片机代码是有新的数据才会更新新数据的所在的点的,这样基本上可以保证在刷新的时候不会闪屏,也可以减少静止时的数据传输量。
至于主机上的代码,为了切合我的那个规则,我专门写了一个c++的.h头文件来实现数据的发送。


然后我今天惊讶的发现,COM2线正好接的是单片机的INT2口。所以说我大概就可以不用更新硬件,更新一下软件就可以解决问题了。



但是我还是不是很懂您的只需要一根线来传输是什么意思,能说一下吗?


多谢万分!



点赞  2018-6-21 23:03
引用: 陈韶华 发表于 2018-6-19 12:21
很好奇Ubuntu这么好用怎么没有流行起来,其实电脑是可以不玩游戏的

嘛,这个......
我一般情况下还是习惯用windows,用ubuntu剪切板是竞赛那帮同学们推荐的。

ubuntu还是挺好用的,但感觉比windows更吃配置一点,而且折腾好累啊233。
点赞  2018-6-21 23:04
引用: GoldenPoato 发表于 2018-6-21 23:03
我又去查了一轮资料,才刚刚知道我的COM2就是时钟线(我一开始的想法就是让它成为时钟线,但是不知道它的 ...

那你这个就是和spi一样的,串口单工接收就一条线
如果全刷那就和锁存器一样了,就没必要加单片机了,不合适
点赞  2018-6-22 11:36
引用: huo_hu 发表于 2018-6-22 11:36
那你这个就是和spi一样的,串口单工接收就一条线
如果全刷那就和锁存器一样了,就没必要加单片机了,不合适

版主大大,我去试了一下INT2中断的方法,还是满足不了性能要求,还是只能大概每秒15帧。

您能帮忙看一下这个代码还有什么能优化的吗?

INT2版

多谢!
点赞  2018-6-27 18:10
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复