Re: 用pic如何讀取IR信號
|
||||
---|---|---|---|---|
中級會員
|
感謝各位提供的資料和 方向 謝謝
發表於: 2007/7/6 17:53
|
|||
|
Re: 用pic如何讀取IR信號
|
||||
---|---|---|---|---|
新會員
|
若以NEC 的編碼來說,前面的Leader code在接收端會是low 9ms再high4.5ms後面才是4個byte的address&data。
在沒雜訊的情形下接收端Normal狀況應該是high,所以前面的Leader code 從一開始的falling edge到下一次的falling edge會是9ms+4.5ms=13.5ms,所以你可以將中斷設定成falling edge觸發,中斷發生就先檢查Timer,若Timer接近13.5ms則開始存在Buffer,再將Timer清除離開中斷。主程式有空再去檢查buffer。 ex. void INT_ISR(void){ // 外部中斷副程式 INT0IF = 0; // clear interrupt flag ucIrTime = TMR1; // get Timer TMR1 = 0; // clear timer if ((ucIrTime>=13000) && (ucIrTime<=14000)){//Normal Leader 13.5ms ucIrCnt = 0; IRIdleCnt = 0; } else if((ucIrTime>=11000) && (ucIrTime<=12000)){//Repaet Leader 1.13ms ucIrCnt = 0; IRIdleCnt = 0; INT0IE = 0; // 收到Repeat code關閉中斷 } ucIRReceiveBuffer[ucIrCnt] = ucIrTime; ucIrCnt++; if (ucIrCnt >= 33) //Leader+4byte=33bits INT0IE = 0; // 收滿33bits關閉中斷 } 在主程式裏如果檢查到外部中斷INT0IE disable表示收到repeat code或者收滿33bits,接著就可以來看ucIRReceivrBuffer[]裏面的資料得知收到IR 碼是什麼了。 union{ u8 all[4]; struct{ u8 CustomCode; u8 CustomCodeNot; u8 DataCode; u8 DataCodeNot; }bytes; }IRCommand; if (INT0IE==0){ if ((ucIrTime>=13000) && (ucIrTime<=14000)){ ucIrCnt = 1; for (irbytecnt = 0; irbytecnt < 4; irbytecnt++){ for (irbitcnt = 0; irbitcnt < 8; irbitcnt++){ if (ucIRReceiveBuffer[ucIrCnt] > 2000) // IRCommand.all[irbytecnt]|=(0x01<<irbitcnt);//2.25ms='1' else IRCommand.all[irbytecnt] &= ~(0x01 << irbitcnt); //1.125ms='0' ucIRReceiveBuffer[ucIrCnt] = 0x00; ucIrCnt++; } } } else if((ucIrTime>=11000) && (ucIrTime<=12000)) { // repeat event } IRStatus = 0xFF; IRReceiveStatus = 1; ucIrCnt = 0; INTCONbits.INT0IE = 1; }
發表於: 2007/7/6 9:23
|
|||
|
Re: 用pic如何讀取IR信號
|
||||
---|---|---|---|---|
資深會員
|
發表於: 2007/7/6 8:44
|
|||
|
Re: 用pic如何讀取IR信號
|
||||
---|---|---|---|---|
高級會員
|
版大是不是有曼徹斯特碼或NRZ相關的格式說明...
因為目前小弟用的信號格式是上頭規定的方式 我並不清楚這是屬於哪一種編碼系統.. 想多了解一點...謝謝
發表於: 2007/7/6 8:28
|
|||
|
Re: 用pic如何讀取IR信號
|
||||
---|---|---|---|---|
版主
|
IR 傳送的方式是先編碼後再調變發射。編碼方式有很多種
曼徹斯特、NRZ 也有人用。找隻遙控器量量看。一般為避免IR被干擾,所發出的 IR 訊號會在經 38KHz 的調變後送出。
發表於: 2007/7/5 16:21
|
|||
|
Re: 用pic如何讀取IR信號
|
||||
---|---|---|---|---|
高級會員
|
發射、接收程式都有寫..
不過傳送的資料格式是自己訂的... 基本上..格式不同..就不相容... 但是只要知道傳輸資料位元.. 1bit hi/lo ,Startbit, Endbit週期時間 修改些參數應該就可以相容了吧..(如果傳輸格式一樣的話) 沒研究過市販的遙控器送的是什麼碼...sorry 等手上案子趕完..有機會再把程式碼po上來..
發表於: 2007/7/5 11:08
|
|||
|
Re: 用pic如何讀取IR信號
|
||||
---|---|---|---|---|
新會員
|
Hi ! Blake
照如此看來 , 發射器也是自己作的 ?! 有無接收市販的遙控器 , 結果也 OK 嗎 ?
發表於: 2007/7/5 8:41
|
|||
|
Re: 用pic如何讀取IR信號
|
||||
---|---|---|---|---|
高級會員
|
我不知道我所說的IR碼跟你的一不一樣..
不一樣就參考看看囉. 1BIT 有HI/LO 變化...由HI/LO 週期來決定為1或0 HI:LO 2:1 -> 1 HI:LO 1:2 -> 0 用取樣的方式..如果接收每個BIT HI/LO寬度固定.. 其實取樣數誤差放寬可以調整靈敏度.. 只要再加入CheckSum檢查..資料接收應該還ok.. 我用16f505,沒有中斷..只能用輪詢來取樣.. 取樣時間就有3~5us的變化 ..但是目前測試還滿ok的.. 至於重複信號..我想每發射一筆資料應該有一段hold time.. 只要取樣hi或lo counter值大於非正常範圍的話.. 應該要重置接收,或有接收到一個正確的Start Bit... 應該就要準備接收資料... 另外按1次鍵,碼發射2次會是比較好的做法... 因為接收端一直持續會有雜訊進入... 不過雜訊同時要與hi/lo取樣值相同,再加上checksum檢查無誤 造成誤判的機會...資料量越多就越不可能... 第一次發射的信號很容易會被雜訊影響.. 第二次信號就漂亮多了... 有做過小測試..就是發射2次..距離能拉的比較遠一點.. 至於資料長度時間多久...就不需要去考慮了... 以上是小弟最近寫IR的心得....希望能有所幫助...
發表於: 2007/7/4 22:40
|
|||
|
Re: 用pic如何讀取IR信號
|
||||
---|---|---|---|---|
中級會員
|
ksj0120 可以多說一點嗎?
ir信號進來一定是用外部中斷!! "Timer或者直接用Capture的中斷將Timer存在buffer,在主程式有空的時候再去檢查buffer裏面的Timer值再做判斷。 " 這有點難懂!可以多說明一下嗎?
發表於: 2007/7/4 19:10
|
|||
|