[請益] 請教以8051記錄腳位HI-LO時間的CODE

看板ASM (組合語言)作者 (貝纳頌)時間11年前 (2012/07/27 11:41), 編輯推噓13(13052)
留言65則, 4人參與, 最新討論串1/1
各位前輩好: 小弟目前在寫一個以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

07/27 11:57, , 1F
你的8051用哪一顆?基本款只有128byte RAM喔!
07/27 11:57, 1F

07/27 12:02, , 2F
我是用c8051f340這顆 變數我有宣告為idata
07/27 12:02, 2F

07/27 12:28, , 3F
exint0()裡面一次存兩個byte但是i只有加1
07/27 12:28, 3F

07/27 12:30, , 4F
!!!
07/27 12:30, 4F
謝謝前輩提醒我這個盲點 我等等有空就馬上來去測試! ※ 編輯: Deltaguita 來自: 60.251.222.115 (07/27 12:31)

07/27 13:00, , 5F
如果你知道格式 其實 16 bit 就可存了
07/27 13:00, 5F

07/27 13:03, , 6F
我知道格式 可是repeater並不能只限定NEC碼可以使用
07/27 13:03, 6F

07/27 13:04, , 7F
要有通用性的 所以以最長的NEC碼來當作實驗對象
07/27 13:04, 7F

07/27 17:34, , 8F
我不是前輩 我是新來的單晶片業餘愛好者而已 :D
07/27 17:34, 8F

07/27 19:33, , 9F
用100uS去切割,直接紀錄Bit Stream如何?
07/27 19:33, 9F

07/27 19:45, , 10F
請問Bit Stream 我剛剛查了網路 都是講影音的@@
07/27 19:45, 10F

07/27 21:12, , 11F
如果你不用編碼固定格式.. 你連續按鍵機制要怎樣做?
07/27 21:12, 11F

07/27 23:33, , 12F
就是位元流啊~ 遙控器的編碼一樣可以當做多煤體的位元流
07/27 23:33, 12F

07/27 23:34, , 13F
來看待啊~ 只是遙控器的位元流只有十分之一秒上下,音樂
07/27 23:34, 13F

07/27 23:34, , 14F
、影像的位元流都上小時的。差別就這樣而已啊~
07/27 23:34, 14F

07/27 23:35, , 15F
Lion21: Time Space Mark
07/27 23:35, 15F

07/28 00:19, , 16F
請問W前輩 有具體的做法可以參考嗎@@? 我會盡量google
07/28 00:19, 16F

07/28 00:20, , 17F
相關做法的
07/28 00:20, 17F

07/28 00:21, , 18F
位元流的格式:BitRate/pre Second我上面不是說100uS為
07/28 00:21, 18F

07/28 00:22, , 19F
單位嗎? 換成BitStream的說法就是10Kb/S:每100uS取樣一
07/28 00:22, 19F

07/28 00:24, , 20F
次,每800uS為一個Byte這樣儲存,播放時也這樣播放。
07/28 00:24, 20F

07/28 00:24, , 21F
每100uS取出一個位元來播放...
07/28 00:24, 21F

07/28 00:29, , 22F
我沒記錯的話F340的XRAM打開有4KB 用10Kb記,每一段1/10
07/28 00:29, 22F

07/28 00:30, , 23F
秒的話應該可以紀錄32組訊號
07/28 00:30, 23F

07/28 00:36, , 24F
我大概懂了 是類似MP3取樣這樣嗎?
07/28 00:36, 24F

07/28 00:46, , 25F
yeah,不過不必壓縮
07/28 00:46, 25F

07/28 11:26, , 26F
我說的"連續按鍵".是比如你按著音量鍵連續2秒的狀況
07/28 11:26, 26F

07/28 19:45, , 27F
lion21 IR是有time space的,wkup+cod+spc+cod+cpc+cod..
07/28 19:45, 27F

07/28 19:46, , 28F
wkup+cod+spc+cod+spc+cod+spc+cod+spc+cod...直到你放開
07/28 19:46, 28F

07/28 19:48, , 29F
如果要記憶後發偽造指令需要解析WKUP後區分出CODE
07/28 19:48, 29F

07/28 19:49, , 30F
如果是REPEAT 那就很單純的中實轉發bit stream就可以了
07/28 19:49, 30F

07/28 20:17, , 31F
最終目標 還是要做出具有學習功能的遙控器XD
07/28 20:17, 31F

07/28 20:43, , 32F
所以紀錄後寫段程式把Wakeup跟code區分出來就好了,其實
07/28 20:43, 32F

07/28 20:44, , 33F
不難判斷:Space 10ms以下為連續碼,連續碼的bitStream
07/28 20:44, 33F

07/28 20:45, , 34F
減去開頭的持續狀態就能分辨Wakeup了,另外也可以單純
07/28 20:45, 34F

07/28 20:46, , 35F
以超過2mS的0或1為Wakeup(一般通用)然後後面的波動CUT
07/28 20:46, 35F

07/28 20:47, , 36F
開來當DATA。總之方法很多,簡單的根超級聰明的都可以:P
07/28 20:47, 36F

07/28 20:48, , 37F
340可以跑很快,所以不用擔心CPU速度不夠用
07/28 20:48, 37F

07/28 22:37, , 38F
我的資訊.持續按壓為wkup+cod+spc+cne+spc+cne+spc+cne+...
07/28 22:37, 38F

07/28 22:38, , 39F
cne是每個按鍵都相同的 持續碼.. 與第一個資料碼無關
07/28 22:38, 39F

07/28 22:39, , 40F
我只是說出我看到的東西 不代表每個遙控器都相同
07/28 22:39, 40F

07/28 22:53, , 41F
不管是怎樣的format,碼段中間還是有space可以區分啊~
07/28 22:53, 41F

07/28 22:54, , 42F
不管怎樣的format,在Btistream模式下還是都可以複製的。
07/28 22:54, 42F

07/28 22:56, , 43F
除非你拿到一個滾碼發射器....那就只能repeat無法偽造了
07/28 22:56, 43F

07/28 23:01, , 44F
如果是有toggle的要怎麼處理阿?
07/28 23:01, 44F

07/28 23:20, , 45F
那就得寫例外了,反正遇山炸山遇水架橋就是了
07/28 23:20, 45F

07/28 23:57, , 46F
我想表達的意思是.不解碼直接存再重發不會比較好做
07/28 23:57, 46F

07/29 00:00, , 47F
我想,這中間有點分歧的是:如何泛用 如果能全部都懂格式
07/29 00:00, 47F

07/29 00:01, , 48F
自然會比教友效率,但是,如果是不特定對象呢?這時候
07/29 00:01, 48F

07/29 00:02, , 49F
記憶豬(Memo-Pig)反而是比較好的方法,只要把一般泛用的
07/29 00:02, 49F

07/29 00:03, , 50F
分析方法放進去,然後把訊號全部展開在記憶體裡面。這樣
07/29 00:03, 50F

07/29 00:04, , 51F
即使碰到不懂的訊號最多多用些記憶還是可以複製與偽造,
07/29 00:04, 51F

07/29 00:06, , 52F
坊間很多可燒錄的無線遙控器就是採用這種模式複製的
07/29 00:06, 52F

07/29 00:07, , 53F
密碼遙控器百百種,每一家都有獨特的編碼法。你要如何
07/29 00:07, 53F

07/29 00:08, , 54F
JUST IN TIME的替每一種新編碼推出複製工具? 這時候,僅
07/29 00:08, 54F

07/29 00:08, , 55F
分析共通特徵,訊號完全錄製的方式就會通用許多(當然
07/29 00:08, 55F

07/29 00:09, , 56F
有些連基本共通模式都修改的編碼法無法複製)不過也夠用
07/29 00:09, 56F

07/29 00:12, , 57F
我之前有寫一個可以使用紅外線遙控器遙控的裝置,因為允
07/29 00:12, 57F

07/29 00:13, , 58F
許用戶拿自己的遙控器(不特定)來定義功能,所以我的解
07/29 00:13, 58F

07/29 00:14, , 59F
碼程式就很OX的用了比較慢得解碼速度(會漏BIT)把所有
07/29 00:14, 59F

07/29 00:15, , 60F
的遙控器訊號都作成16BIT的模式,然後我只記憶這個特徵碼
07/29 00:15, 60F

07/29 00:16, , 61F
而不是完整的OEM+KEY+SHADOW碼。那個產品至今還沒碰到
07/29 00:16, 61F

07/29 00:17, , 62F
客戶抱怨哪一隻遙控器不能用。我覺得通用的方法不一定要
07/29 00:17, 62F

07/29 00:18, , 63F
是最正確的解碼,但是只要能用,應該就是個解(我在說啥?
07/29 00:18, 63F

07/31 18:37, , 64F
我照原來的方式寫出來了 雖然照前輩的建議走
07/31 18:37, 64F

07/31 18:37, , 65F
還是感謝
07/31 18:37, 65F
文章代碼(AID): #1G4WtrWo (ASM)
文章代碼(AID): #1G4WtrWo (ASM)