作者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