1 软件代码分析
1.1. 代码量与数据量经过编译器的输出信息中,代码量为1750Byte,数据量为。34Byte
由于本项目使用的MCU的ROM大小为2KB,RAM大小为256B,而如果整个圆周面的2n*m个像素,每个像素存储RGB2个Byte(一般是RGB三种颜色各占8bit,共3个Byte,但是LPD6803采用R5G5B5格式,只需要2Byte即可存储一个像素点的颜色数据),需要2n*m*2的ROM存储空间。这里选取2n=64,m=5,则一幅图像需要,640Bytes,已经将近超出了ROM区域。
一种办法是降低2n或者m,但是这样导致图像不精细。不符合风火轮项目的设计要求。
为了解决上述矛盾,本项目巧妙地利用旋转图像的旋转对称性,即只使用0-30°的颜色数据,另外的30-360°的数据采取0-30°的数据的循环,这样生成的图像是12边形对称的。
1.2. 代码执行速度
执行速度的瓶颈在控制LED灯条的Timer00中断。
每个LED需要16个bit,总共需要m*16个bit的时间,同时还有前导32bit和后续的m个附加脉冲,所需的脉冲数总数为 (16*m + 32 + m)。由于采用的是瑞萨芯片的RL78架构,在每个指令一般需要两个周期。而一个bit输出时间约X个汇编指令,LED灯条总共需要略多于(16*m + 32 + m)*X的指令数。
则要求
(16*m + 32 + m)*X < dT = T/2n
LED数量增多,则Timer00的中断服务程序加长,而如果车速较快,则旋转一周的时间T缩短,此时Timer00的中断服务程序消耗的时间可能超过dT=T/2n,造成当前角度的LED灯条没有全部点亮,就已经旋转到了下一个角度,进入下一个中断。造成错误。
本项目选取的m=5,(LED数量较少),2n=64(角度等分较多,图像较精细),在调试中没有优化过的bit输出代码,容易导致上述显示不正确的情况。在优化后则无异常。
1.3. 代码开发心得
1. TDR0nH 和TDR0nL的读写顺序不对会导致读写出错,这点在DATASHEET里有明确的说明,如果不慎忽略掉会导致抓狂的结果。另外,需要注意的是在调试时在Watch中添加TDR0n也相当于读取,可能会出错。
2. 虽然DATASHEET里说flash的0x0000被向量中断表占用,但是如果先定义的是const常量并不超过一定空间是会从0x00C0前面。
分配flash的. 这在DATASHEET中好像没有说明。
3.变量在内存中分配,常量在flash中,but若先定义了变量再定义常量,const常量也会分配到ram中。
4.变量定义要在函数体内提前,这跟原先我个人学的C99不同,导致很纠结。
5.有一段时间写Pn老会引起栈中的变量变化,不懂原因。
2 实现效果
经过调试和测试后,最终实物效果图如下:
图 61 自行车风火轮的电路搭建实物图
图 62 自行车风火轮实物效果图
图 63 自行车风火轮实物效果图
图 64 自行车风火轮实物效果图
【瑞萨电子MCU套件免费试用】自行车炫彩风火轮开发应用笔记——(4)代码分析与效果.pdf
(276.12 KB, 下载次数: 41)