最近在做一个数码管的显示项目时遇到一个值得注意的问题,
项目架构是用stc15w204s采集另一个单片机送出的并口信号,转换驱动tm1640点亮数码管。
原先项目时通过74138直接驱动12个4511来静态显示的,电流很大,而且很多器件,新架构只要2个芯片就行了,大大节省了元器件数量和成本。
但是在设计过程发现问题,在插拔过程中新显示板总是程序跑乱了,
而且断电后很久,甚至半个小时都无法恢复。
一开始以为是程序被误擦除了,因为串口下载IO用在通信中了,因此怀疑会不会是在插拔过程中单片机刚好上电启动,以为收到了下载信号,因为导致误擦除程序区。要不然不可能重新断电重启还是程序还是乱跑。
后来发现,有一些出现程序跑乱的板子,在一段时间后重新上电又恢复正常了。
左思右想,怀疑会不会是程序在插拔过程中跑乱了,因为有个电容蓄电,芯片没有全部重启。
后来在出现问题的板子重复上电多次无效后,用镊子短接电容彻底放电,奇迹出现了!!
板子再次上电恢复正常。
原来最终问题是因为插拔过程通信信号不完整,导致程序内存访问越界(程序编制有问题,数组访问越界),因为那板子上有一个电容,
而整个电路在电压降低到0.43v后就基本不在吸收电流,电容上电压能在0.43v处维持很久,而stc15w204s在电压低至0.43v时内部没有全部复位。(因为电路没有专门设复位电路,都是通过重新上电自动复位来处理的)按我猜想,至少内存或部分寄存器还保持原值,因此在重启上电后程序还是乱的。
20160826修改
这是一篇耻辱帖,找到根本原因了。
原来不是stc15w204s的问题,stc15w204s有掉电和上电复位吗,而且还有内部低压检测复位,而且测试过出错后的单片机程序正常运行,只是显示错乱了,所以问题出现tm1640这里。是tm1640在热插拔过程中得到了错误的设置数据,而断电后又因为电容蓄电没有得到重新初始化,所以一直保持错误显示。
其实有两个问题,首先是通信时序在热插拔过程中不完整,导致数组访问越界;
其次是tm1640驱动时序,在设置地址时没有把B7 B6 两位置1,导致在写SRAM数据地址自动加1模式中时首地址不正确出错
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报。