在第1篇(
https://bbs.eeworld.com.cn/thread-446581-1-1.html)中有介绍风火轮的基本设计思想和最终效果图
本篇继续来详细说明下设计原理和遇到一些问题总结
详细设计其他比较简单:
注:图中省略了霍尔开关和各芯片的的VCC和GND连线)
工作流程:
1.用TIMER1计量两个霍尔低电平的间隔时间(TDR01的计数值),设若为T1
2.T1等分成72份(份数越多越精细,但是越有可能发生中断嵌套导致出图失败,越小的话图越粗糙,这里取72)
写入计时器TIMER0的TDR00,TIMER0作为间隔定时计数器。这样,轮子每转一圈,TIMER0会产生72个中断,让我们来控制LED灯组。
3.每个TIMER0的中断发生时,打入一串数据给LED组写入颜色
4.一圈下来,LED组写入了72组颜色,显示成图案。
其中,步3中:
LDP6803的时序如下,DCLK接6,DIN连7。每个TIMER0中断发生时,写入32bit的起始帧,再根据LED灯组的LED个数,写入16*LEDCOUNT的数据。
每个三色LED由16bit数据控制,RGB分别为6,5,5bit。
可改进的地方:
1. LED灯组用的是8个,但其实真实场景下32个或48个LED组成的图片更炫目。只用8个的原因有二,一是手工焊太累了,二是担心太多LED会产生嵌套中断导致出图失败,即一组LED的数据还没写完,下一组中LED数据又该写了。
2. 一圈只有一个LED组的出图速度是30Km/h, 这个速度对骑手的要求较高,可以再接出两个GPIO,控制两组LED,这样的出图速度降为15Km/h
3. LDP6803的成本较高(0.47RMB PCS),功能也很牛B, 可以控制3色LED产生全彩效果, 而实际上限于R7F0C80212的存储能力和工作频率,我
人为地将它限制成了多彩(即只有RGB三种颜色),浪费了LDP6803的能力。
4. 通过手机,用蓝牙控制风火轮,感觉会更拉风,当然这更远超R7F0C80212的 能力范围了,如果要考虑实现这点,可以考虑自带蓝牙的其他芯片。
问题总结:
1.
TDR0nH 和TDR0nL的读写顺序不对会导致读写出错,这点在DATASHEET里有明确的说明,如果不慎忽略掉会导致抓狂的结果。另外,需要注意的是在调试时在Watch中添加TDR0n也相当于读取,可能会出错。
2. 虽然DATASHEET里说flash的0x0000被向量中断表占用,但是如果先定义的是const常量并不超过一定空间是会从0x00C0前面
分配flash的. 这在DATASHEET中好像没有说明
3.变量在内存中分配,常量在flash中,but若先定义了变量再定义常量,const常量也会分配到ram中
4.变量定义要在函数体内提前,这跟原先我个人学的C99不同,导致很纠结。
5.有一段时间写Pn老会引起栈中的变量变化,不懂原因。
项目总结:
R7F0C80212就不一块不错的低成本的MCU,虽然说并没有提供类似其他MCU的函数式调用, 但基于寄存器的调用效率高。
不过因此而导致初线学习曲线过陡(我曾经花了好几天光看DATASHEET,当然可能跟我初次接触嵌入式能力不够有关),较低人的学习兴趣。
另外,鉴于R7F0C80212的256/512Byte的内存和1K/2K的flash, 不适合用于需求变化多端的消费类电子,而更适合于需求比较固定的产品,比如电饭煲?洗衣机?
通过这次比赛学到了嵌入式的基本知识,巩固了CS的知识,感谢舍友mars4zhu和管理员nmg的热心指导、回应。
--2014.09.07于深圳
本帖最后由 xsunset 于 2014-9-7 17:10 编辑