3818|3

32

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

【瑞萨电子MCU套件免费试用】自行车炫彩风火轮开发应用笔记——(3)软件流程与代码 [复制链接]

1 软件开发设计
1.1. 软件流程图
根据功能需求,编制软件流程如下:



41 自行车风火轮软件流程图
上述流程中,初始化部分由main函数完成。之后main函数进入idle
Timer01中断记录车轮旋转一周的时间T,并将该时间T/2n得到每一个等分间隔的时间,该时间为Timer00的中断。
在每次Timer00中断将LED灯条按照存储的图像数据逐个控制LED的亮度和颜色。


42 软件代码执行时间片示意图

1.2.
代码

1.2.1
Main函数
  1. void main(void)  
  2. {        
  3.         UINT8 k;
  4.         unsigned char mode;
  5.         
  6.         mode=0;
  7.         
  8.         init_io();
  9.         
  10.         init_timer();
  11.         
  12.         /* Enable Interrupt */
  13.         EI();
  14.         /* Start Timer, i.e. PWM output */
  15.         start_timer();

  16.         while(1){
  17.                 if (P13.7 == 0)
  18.                 {
  19.                         if (mode)
  20.                         {
  21.                                 mode = 0;
  22.                                 stop_timer();
  23.                         }
  24.                 }
  25.                 else
  26.                 {
  27.                         if (mode == 0)
  28.                         {
  29.                                 mode = 1;
  30.                                 start_timer();
  31.                         }
  32.                 }                                
  33.         }
  34. }
复制代码


1.2.2 Timer01中断函数
  1. __interrupt void interrupt_inttm01(){
  2. unsigned long div, count ;
  3. int h;
  4. if(isFirst){ isFirst = 0;return;}
  5. count =  (unsigned)TDR01L + (unsigned)TDR01H * 256  ;
  6. /*TODO: OVF should be counted */
  7. //count = 0x10000 *

  8. div = count / 72;
  9. h = div / 256;
  10. TDR00H = h;
  11. TDR00L = div - h * 256;
  12. // the end
  13. }
复制代码

1.2.3 Timer00中断函数
  1. __interrupt void interrupt_inttm00(){        
  2. char temp;
  3. UINT8 i, r=0,g=0,b=0;
  4. preamble();
  5. if( index >= LEDCOUNT*2-2){
  6. index = 0;
  7. }
  8. for(i=0;i<LEDCOUNT;i++){
  9. temp = figure[index][i];        
  10. r = (temp & 0x4)<< 5 >> 7;
  11. g = (temp & 0x2) << 6 >> 7;
  12. b = (temp & 0x1) << 7 >> 7;        
  13. light_single_led(r,g,b);
  14. }
  15. postfix();        
  16. index ++;        
  17. }// the end
复制代码


1.2.4 LED灯带控制函数在每个dT=T/2n的时间间隔内,输出控制LED灯条的颜色亮度数据。时序波形按照LPD6803的要求生成。其中DLCKP00DINP01,采用GPIO生成时序波形图。


43  LPD6803时序波形

  1. const static UINT8 figure[][LEDCOUNT+1] = {
  2. { 0x04 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 } ,
  3. { 0x02 , 0x04 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 } ,
  4. { 0x01 , 0x02 , 0x04 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 } ,
  5. { 0x04 , 0x01 , 0x02 , 0x04 , 0x00 , 0x00 , 0x00 , 0x00 } ,
  6. { 0x02 , 0x04 , 0x01 , 0x02 , 0x04 , 0x00 , 0x00 , 0x00 } ,
  7. { 0x01 , 0x02 , 0x04 , 0x01 , 0x02 , 0x04 , 0x00 , 0x00 } ,
  8. { 0x00 , 0x01 , 0x02 , 0x04 , 0x01 , 0x02 , 0x04 , 0x00 } ,
  9. { 0x01 , 0x02 , 0x04 , 0x01 , 0x02 , 0x04 , 0x00 , 0x00 } ,
  10. { 0x02 , 0x04 , 0x01 , 0x02 , 0x04 , 0x00 , 0x00 , 0x00 } ,
  11. { 0x04 , 0x01 , 0x02 , 0x04 , 0x00 , 0x00 , 0x00 , 0x00 } ,
  12. { 0x01 , 0x02 , 0x04 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 } ,
  13. { 0x02 , 0x04 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 } ,
  14. { 0x04 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 } };
  15. //long count;
  16. UINT8 status ;
  17. UINT8 isFirst;
  18. UINT8 index ;
  19. void clk(void){
  20.     P0 &= ~CLK_PIN_BIT;
  21.     P0 |=  CLK_PIN_BIT;
  22. }

  23. void write_bit(UINT8 data){
  24.            //P0 |= (0x1&data) << DAT_PIN ;        
  25.            //clk();
  26.            P0 = (   (0x1&data) << DAT_PIN ) & ~CLK_PIN_BIT ;
  27.            P0 |= CLK_PIN_BIT;
  28. //P0 = (data<<4) ;
  29. //P0 = 0x08 |(data<<4) ;
  30. }

  31. void write_bits(UINT8 data, UINT8 bitcount){
  32. /* bitcount should be less than 8*/
  33. UINT8 tmp,  i=0, k=(0x01<<(bitcount-1));        

  34. for(i=1;i<=bitcount;i++){
  35. tmp = (data & k)>>(bitcount-i);
  36. write_bit(tmp);        
  37.             k=k>>1;        
  38. }
  39. }
  40. void preamble(void){  
  41. UINT8 i;         
  42.             for(i=0;i<32;i++){        
  43. write_bit(0);
  44.             }
  45. }
  46. void postfix(void){
  47. int i;        
  48. for(i=0;i<LEDCOUNT;i++){
  49. write_bit(0);
  50. }
  51. }
  52. void write_single_channel(UINT8 ch){   
  53. // UINT8 tp = ch & 0x1f;
  54.            write_bits( ch & 0x1f, 5); // ignore the first 3 bits
  55. }
  56. void light_single_led(UINT8 r, UINT8 g, UINT8 b){
  57. write_bit(0x01);        
  58. write_single_channel(r);
  59. write_single_channel(g);
  60. write_single_channel(b);        
  61. } 【瑞萨电子MCU套件免费试用】自行车炫彩风火轮开发应用笔记——(3)软件流程与代码.pdf (222.03 KB, 下载次数: 48)



复制代码

最新回复

楼主厉害   详情 回复 发表于 2014-12-14 20:04
点赞 关注

回复
举报

32

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
继续吐槽论坛的word复制功能,请下载pdf查看。恳请指点。

点评

你将pdf复制到word试一试,估计样式没复制下来。  详情 回复 发表于 2014-9-22 17:43
 
 

回复

227

帖子

2392

TA的资源

管理员

板凳
 
xsunset 发表于 2014-9-22 16:26
继续吐槽论坛的word复制功能,请下载pdf查看。恳请指点。

你将pdf复制到word试一试,估计样式没复制下来。
加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身
 
个人签名

个人签名111

 
 

回复

57

帖子

0

TA的资源

一粒金砂(中级)

4
 
楼主厉害


 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表