原创 Keil 软件仿真

2010-1-9 19:10 6268 13 16 分类: MCU/ 嵌入式

下面的链接是RC-MM协议的唯一一点资料
  http://www.sbprojects.com/knowledge/ir/rcmm.htm 
 
   最近要做RC-MM的红外解码,首先RC-MM是不公开的协议,还好我们只需要解码出遥控上的POWER键就可以了,而且网上有不少红外解码的程序,但是还没有硬件。我跟老板说,我现在就可以仿真,我觉得用Keil和Proteus就可以解决了,但是问题总到解决的时候才能发现。


   我用示波器量出了POWER键的信号,按照那个资料分析了一下,和我量出来唯一感觉对的上的就是RC-MM不是只对0和1编码,他是四进制的,对00,01,10,11进行了编码。于是我用Proteus的PATTGEN(pattern generator)产生了一个这样的波形,但是仿真结果是乱七八糟,中断随便跳,复位很多次,很莫名其妙,根本没法调试。于是转向了Keil自己的仿真调试工具,发现不是一般的好用。


  Keil的信号函数可以在处理器的IO上产生任何的波形,而且可以用他的逻辑分析仪观察各种变量,这里简单的贴几个图,介绍一下,具体的使用可以参考User Guide,并说明几个可能出现的疑问,贴上自己写的信号函数,及整个工程文件。


3605d4fe-97b7-4c26-9407-7e7664cb6fcd.JPG


这个图是逻辑分析仪里添加各种信号,如果你添加了,但是里面看不到,那你就换个版本安装一下吧,我在办公室里添加就没有显示,导致我和Proteus较了两天的劲。


256023e8-e92e-43dd-8ee8-cf9238668c2c.JPG


这个Toolbox第一个按钮是自带的,后面的按钮是自己定义的,如果不想要可以在命令窗口里输入 KILL BUTTON 1,类似这样。


点击看大图


这个图的第一个信号是在2051的INT0上产生的信号,有一个小技巧就是,可以把Symbols窗口里的变量直接拖到逻辑分析仪里。


9893e4a0-1c6b-4f5f-8bf4-458fbb3d3598.jpg


这里附上信号函数的代码,信号函数里不能使用数组,指针。


//
// Generates a number of pulses on INT0
//
signal void INT0_Square (unsigned int ID,unsigned int key)  {
 
  float time_p;
  unsigned char i,j;


  time_p = 1.0/10000; // 100 us
  printf ("%d Square Pulses on INT0\n", key);


  PORT3 |=  (1 << 2);  
  swatch (50*time_p); // 5ms free time
 
  for(i=0;i<8;i++)
  {  
    PORT3 &= ~(1 << 2);     // reset PORT3_2
    swatch (3*time_p); //300us
    PORT3 |=  (1 << 2);
    switch(ID&0xc000){
     case 0xc000: swatch (26*time_p);break;
     case 0x8000: swatch (16*time_p);break;
     case 0x4000: swatch (12*time_p);break;
     case 0x0: swatch (8*time_p);break; 
   }
   ID = ID<<2;
 }


 PORT3 &= ~(1 << 2);     // reset PORT3_2  
 swatch (3*time_p); //300us
 PORT3 |=  (1 << 2);     
 swatch (130*time_p); // 13ms free time


 for(j=0;j<8;j++)
  {
    PORT3 &= ~(1 << 2);     // reset PORT3_2  
    swatch (3*time_p); //300us
    PORT3 |=  (1 << 2);
    switch(key&0xc000){
     case 0xc000: swatch (26*time_p);break;
     case 0x8000: swatch (16*time_p);break;
     case 0x4000: swatch (12*time_p);break;
     case 0x0: swatch (8*time_p);break; 
   }
   key = key<<2;
 }


 PORT3 &= ~(1 << 2);     // reset PORT3_2  
 swatch (3*time_p); //300us
 PORT3 |=  (1 << 2);    
 swatch (10*time_p); // 1ms free time
}


define button "INT0_power_key",  "INT0_Square (0x2357,0x4030)"


工程打包rar,代码还有bug,有干扰就不能正常工作了,代码没有使用价值。


 

PARTNER CONTENT

文章评论3条评论)

登录后参与讨论

用户142112 2010-2-1 19:32

文章中说错了,我处理的不是RC-MM协议,而是XMP协议,用MCU做STANDBY,现在做到POWER键按下5s之后CPU断电,第一次按下POWER键由CPU进入active standby。

用户1584993 2010-1-11 12:10

支持一下船长

用户142112 2010-1-9 19:16

PORT3和P3的区别: PORT3是指引脚,P3是寄存器
相关推荐阅读
用户142112 2011-01-04 23:43
IEEE Verilog 2001标准翻译
闲来无聊,想翻译Verilog2001标准,有兴趣的联系我,邮箱captainliuy@163.com。英文原版标准见附件。到现在为止翻译了前两章,如果你在阅读的时候,觉得那里翻译的不对,或者用词不准...
用户142112 2011-01-04 21:21
FWFT FIFO读操作注意
    FWFT:First Word Fall Through的缩写,好像是Xilinx的说法,Altera对应的概念是Show-ahead synchronous(SASO)。即数据在rdreq有...
用户142112 2010-10-08 19:36
Modelsim自动化仿真平台--BFM_FIFO
         这次添加了FWFT(First Word Fall Through) FIFO的BFM模型,以及DDR多端口控制器的仿真模型。因为如果写RTL级的DDR多端口控制器比较费时,所以写了...
用户142112 2010-09-21 21:07
Modelsim自动化仿真平台--BFM_CLK
写了第一个简单的BFM模块,时钟和复位。将覆盖原来的BFM文件夹,将两个do文件放在test目录下,打开modelsim执行*sim.do。...
用户142112 2010-09-18 20:09
Modelsim自动化仿真平台
下载后,解压到D盘根目录,打开Modelsim,执行*sim.do,就可以进行仿真。具体内容可以看目录结构和脚本。BFM和用户库文件还没有做,等做好后再上传。...
用户142112 2010-08-20 20:23
TCL 双引号和花括号的区别
用了很一段时间的Modelsim,用TCL脚本仿真,开始注意起来它,看了些资料,有一个问题始终让我很困惑,那就是花括号 的用法,今天Google了一下,觉得有一点豁然了,记录一下。为了不让自己的翻译影...
EE直播间
更多
我要评论
3
13
关闭 站长推荐上一条 /3 下一条