http://bbs.ednchina.com/BLOG_ARTICLE_366339.HTM
下面的链接是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,并说明几个可能出现的疑问,贴上自己写的信号函数,及整个工程文件。
这个图是逻辑分析仪里添加各种信号,如果你添加了,但是里面看不到,那你就换个版本安装一下吧,我在办公室里添加就没有显示,导致我和Proteus较了两天的劲。
这个Toolbox第一个按钮是自带的,后面的按钮是自己定义的,如果不想要可以在命令窗口里输入 KILL BUTTON 1,类似这样。
这个图的第一个信号是在2051的INT0上产生的信号,有一个小技巧就是,可以把Symbols窗口里的变量直接拖到逻辑分析仪里。
这里附上信号函数的代码,信号函数里不能使用数组,指针。
//
// 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)"
工程打包,代码还有bug,有干扰就不能正常工作了,代码没有使用价值。