作者Deltaguita (贝纳颂)
看板ASM
标题[请益] 请教以8051记录脚位HI-LO时间的CODE
时间Fri Jul 27 11:41:37 2012
各位前辈好:
小弟目前在写一个以8051纪录红外线HI-LO时间的code
打算将波形时间纪录之後 可以再完整发送出去 类似红外线 repeater
目前是以NEC Code 为纪录项目 高准位 +低准位 约134byte
但是在纪录方面就出了一些问题 都只会记录到第76byte就没了
想请前辈帮我看一下 是哪里出了问题,有其他可以更简化的方法吗?
#include <C8051F340.h>
#include <intrins.h> // nop指令需要引用
#define uchar unsigned char
#define uint unsigned int
void exint0();
void IR_repeat(void);
void TT0(bit BT,TH0,TL0);
void interrupt_int(void);
sbit IR_IN = P0^2;//红外线接收电路端
sbit IR_OUT = P1^1;
uchar i;
idata uchar IR_code_time[134];//识别码,操作码存放
/****************** 主函数 *******************/
void main(void)
{
OSCICN = 0x80; //0x80=1.5Mhz 0x81=3Mhz 0x82=6Mhz 0x83-12Mhz
PCA0MD &= 0X9F; //看门狗OFF
P1MDOUT = 0x02;//Push Pull
P2MDOUT = 0xff;//pp
XBR1 = 0x40;//致能crossbar
TMOD=0X01;//timer0工作在模式1 16bit计数器
interrupt_int();
for (i=0;i<=133;i++)初始值IR_code_time 以便除错
{
IR_code_time[i]=0xaa;
}
i=1;
TH0=0;
TL0=0;
while(1)
{
if((TH0==0xFF)|(i==134)){
TR0=0; IE=0x80; break;}//讯号超时 关闭计时器、外部中断,跳出回圈
}
IR_code_time[0]=i-1;//纪录byte数
}
/********************** 中断函数初始************************/
void interrupt_int(void)
{
IT01CF= 0x82; //设定LOW中断脚=P0^2 HIGHT中断脚P0^4
IT0=0; //外部中断0边缘触发
IE = 0x81;
}
/********************** 外部中断函数************************/
void exint0() interrupt 0
{
IR_code_time[i+1]=TL0;
IR_code_time[i]=TH0;
TR0=1;
TL0=0;
TH0=0;
IT01CF^=0x08; //将IN0PL反向 调整HI-LO触发转换
i++;
}
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 60.251.222.115
1F:→ cortex1234:你的8051用哪一颗?基本款只有128byte RAM喔! 07/27 11:57
2F:→ Deltaguita:我是用c8051f340这颗 变数我有宣告为idata 07/27 12:02
3F:→ cortex1234:exint0()里面一次存两个byte但是i只有加1 07/27 12:28
4F:→ Deltaguita:!!! 07/27 12:30
谢谢前辈提醒我这个盲点 我等等有空就马上来去测试!
※ 编辑: Deltaguita 来自: 60.251.222.115 (07/27 12:31)
5F:推 lion21:如果你知道格式 其实 16 bit 就可存了 07/27 13:00
6F:→ Deltaguita:我知道格式 可是repeater并不能只限定NEC码可以使用 07/27 13:03
7F:→ Deltaguita:要有通用性的 所以以最长的NEC码来当作实验对象 07/27 13:04
8F:→ cortex1234:我不是前辈 我是新来的单晶片业余爱好者而已 :D 07/27 17:34
9F:→ WolfLord:用100uS去切割,直接纪录Bit Stream如何? 07/27 19:33
10F:→ Deltaguita:请问Bit Stream 我刚刚查了网路 都是讲影音的@@ 07/27 19:45
11F:→ lion21:如果你不用编码固定格式.. 你连续按键机制要怎样做? 07/27 21:12
12F:→ WolfLord:就是位元流啊~ 遥控器的编码一样可以当做多煤体的位元流 07/27 23:33
13F:→ WolfLord:来看待啊~ 只是遥控器的位元流只有十分之一秒上下,音乐 07/27 23:34
14F:→ WolfLord:、影像的位元流都上小时的。差别就这样而已啊~ 07/27 23:34
15F:→ WolfLord:Lion21: Time Space Mark 07/27 23:35
16F:→ Deltaguita:请问W前辈 有具体的做法可以参考吗@@? 我会尽量google 07/28 00:19
17F:→ Deltaguita:相关做法的 07/28 00:20
18F:推 WolfLord:位元流的格式:BitRate/pre Second我上面不是说100uS为 07/28 00:21
19F:→ WolfLord:单位吗? 换成BitStream的说法就是10Kb/S:每100uS取样一 07/28 00:22
20F:→ WolfLord:次,每800uS为一个Byte这样储存,播放时也这样播放。 07/28 00:24
21F:→ WolfLord:每100uS取出一个位元来播放... 07/28 00:24
22F:推 WolfLord:我没记错的话F340的XRAM打开有4KB 用10Kb记,每一段1/10 07/28 00:29
23F:→ WolfLord:秒的话应该可以纪录32组讯号 07/28 00:30
24F:→ Deltaguita:我大概懂了 是类似MP3取样这样吗? 07/28 00:36
25F:推 WolfLord:yeah,不过不必压缩 07/28 00:46
26F:推 lion21:我说的"连续按键".是比如你按着音量键连续2秒的状况 07/28 11:26
27F:推 WolfLord:lion21 IR是有time space的,wkup+cod+spc+cod+cpc+cod.. 07/28 19:45
28F:推 WolfLord:wkup+cod+spc+cod+spc+cod+spc+cod+spc+cod...直到你放开 07/28 19:46
29F:→ WolfLord:如果要记忆後发伪造指令需要解析WKUP後区分出CODE 07/28 19:48
30F:→ WolfLord:如果是REPEAT 那就很单纯的中实转发bit stream就可以了 07/28 19:49
31F:→ Deltaguita:最终目标 还是要做出具有学习功能的遥控器XD 07/28 20:17
32F:推 WolfLord:所以纪录後写段程式把Wakeup跟code区分出来就好了,其实 07/28 20:43
33F:→ WolfLord:不难判断:Space 10ms以下为连续码,连续码的bitStream 07/28 20:44
34F:→ WolfLord:减去开头的持续状态就能分辨Wakeup了,另外也可以单纯 07/28 20:45
35F:→ WolfLord:以超过2mS的0或1为Wakeup(一般通用)然後後面的波动CUT 07/28 20:46
36F:→ WolfLord:开来当DATA。总之方法很多,简单的根超级聪明的都可以:P 07/28 20:47
37F:→ WolfLord:340可以跑很快,所以不用担心CPU速度不够用 07/28 20:48
38F:→ lion21:我的资讯.持续按压为wkup+cod+spc+cne+spc+cne+spc+cne+... 07/28 22:37
39F:→ lion21:cne是每个按键都相同的 持续码.. 与第一个资料码无关 07/28 22:38
40F:→ lion21:我只是说出我看到的东西 不代表每个遥控器都相同 07/28 22:39
41F:推 WolfLord:不管是怎样的format,码段中间还是有space可以区分啊~ 07/28 22:53
42F:→ WolfLord:不管怎样的format,在Btistream模式下还是都可以复制的。 07/28 22:54
43F:→ WolfLord:除非你拿到一个滚码发射器....那就只能repeat无法伪造了 07/28 22:56
44F:→ Deltaguita:如果是有toggle的要怎麽处理阿? 07/28 23:01
45F:推 WolfLord:那就得写例外了,反正遇山炸山遇水架桥就是了 07/28 23:20
46F:推 lion21:我想表达的意思是.不解码直接存再重发不会比较好做 07/28 23:57
47F:推 WolfLord:我想,这中间有点分歧的是:如何泛用 如果能全部都懂格式 07/29 00:00
48F:→ WolfLord:自然会比教友效率,但是,如果是不特定对象呢?这时候 07/29 00:01
49F:→ WolfLord:记忆猪(Memo-Pig)反而是比较好的方法,只要把一般泛用的 07/29 00:02
50F:→ WolfLord:分析方法放进去,然後把讯号全部展开在记忆体里面。这样 07/29 00:03
51F:→ WolfLord:即使碰到不懂的讯号最多多用些记忆还是可以复制与伪造, 07/29 00:04
52F:→ WolfLord:坊间很多可烧录的无线遥控器就是采用这种模式复制的 07/29 00:06
53F:→ WolfLord:密码遥控器百百种,每一家都有独特的编码法。你要如何 07/29 00:07
54F:→ WolfLord:JUST IN TIME的替每一种新编码推出复制工具? 这时候,仅 07/29 00:08
55F:→ WolfLord:分析共通特徵,讯号完全录制的方式就会通用许多(当然 07/29 00:08
56F:→ WolfLord:有些连基本共通模式都修改的编码法无法复制)不过也够用 07/29 00:09
57F:推 WolfLord:我之前有写一个可以使用红外线遥控器遥控的装置,因为允 07/29 00:12
58F:→ WolfLord:许用户拿自己的遥控器(不特定)来定义功能,所以我的解 07/29 00:13
59F:→ WolfLord:码程式就很OX的用了比较慢得解码速度(会漏BIT)把所有 07/29 00:14
60F:→ WolfLord:的遥控器讯号都作成16BIT的模式,然後我只记忆这个特徵码 07/29 00:15
61F:→ WolfLord:而不是完整的OEM+KEY+SHADOW码。那个产品至今还没碰到 07/29 00:16
62F:→ WolfLord:客户抱怨哪一只遥控器不能用。我觉得通用的方法不一定要 07/29 00:17
63F:→ WolfLord:是最正确的解码,但是只要能用,应该就是个解(我在说啥? 07/29 00:18
64F:→ Deltaguita:我照原来的方式写出来了 虽然照前辈的建议走 07/31 18:37
65F:→ Deltaguita:还是感谢 07/31 18:37