• slider image 442
  • slider image 483
  • slider image 484
  • slider image 485
  • slider image 486
  • slider image 487
:::


Browsing this Thread:   1 Anonymous Users




(1) 2 »


Re: 用pic如何讀取IR信號
#15
中級會員
中級會員


查看用戶資訊
感謝各位提供的資料和 方向 謝謝

發表於: 2007/7/6 17:53
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 用pic如何讀取IR信號
#14
高級會員
高級會員


查看用戶資訊
謝謝Eigen大大..剛有看了一下..滿多格式的..謝謝
底下程式是擷取出來的..不完整..
接收IR是用取樣的方式寫的..格式跟市售的也不太一樣
不過只要修改checkbit的部份..應該也可以相容...
有機會我再拿家裡的遙控器玩玩看..
感謝各位提供相關寶貴的知識..又認識到滿多東西的...

傳輸碼格式
start bit hi 3.6ms/lo 1.2ms
bit 0 hi 1.2ms/lo 0.6ms
bit 1 hi 0.6ms/lo 1.2ms
end bit hi 0.6ms
hold time lo 12.6ms

; IO定義
iRcv EQU 3 ; PORTB

dRange EQU D'2' ; 取樣次數正負承認範圍
dRcvBit EQU D'63' ; 63bit
dResetDuty EQU '60' ; 12ms/200us = 60 (12.6ms為發射間隔時間)
dStartBitA EQU D'18' ; 3.6ms/200us = 18
dStartBitB EQU D'6' ; 1.2ms/200us = 6
dBitDutyA EQU D'6' ; 1.2ms/200us = 6
dBitDutyB EQU D'3' ; 600us/200us = 3

bRcvBuf0 EQU H'70' ; Command
bRcvBuf1 EQU H'71' ;
bRcvBuf2 EQU H'72' ;
bRcvBuf3 EQU H'73' ;
bRcvBuf4 EQU H'74' ;
bRcvBuf5 EQU H'75' ;
bRcvBuf6 EQU H'76' ;
bRcvBuf7 EQU H'77' ; CheckSum

bRcvACnt EQU H'78' ; Lo 取樣次數
bRcvBCnt EQU H'79' ; Hi 取樣次數
bRcvBitCnt EQU H'7A' ; 64BIT資料位元
bTEMP EQU H'7B'

FLAG_RCV EQU H'7C'
fPinStatus EQU 7 ; 上一次狀態
fRcvStart EQU 6 ;
fRcvBits EQU 5
fRcvEnd EQU 4

;=======================;
; 紅外線接收取樣程式(200us)
;=======================;
pRcvCode:
.. BTFSS PORTB,iRcv
.. GOTO RCV_A
;-----------------------------------------------; HIGH
RCV_B:
.. BANKSEL FLAG_RCV
.. BTFSC FLAG_RCV,fPinStatus
.. GOTO CHK_BCNT
;-----------------------------------------------; LO->HI
.. BSF FLAG_RCV,fPinStatus ;
.. BTFSC FLAG_RCV,fRcvEnd
.. GOTO CLR_BCNT
.. BTFSS FLAG_RCV,fRcvBits
.. GOTO CLR_BCNT
;-----------------------------------------------; CHECK_END_BIT
CHECK_END_BIT:
.. mCheckBit bRcvACnt,dBitDutyB ; END BIT, LO->600us
.. SKPNC
.. GOTO ERR_BCNT

.. CLRC
.. CALL pShiftBit ; 移位1bit(同步資料64bit)

.. CALL pCheckData ; 資料接收成功,檢查CheckSum
.. SKPZ
.. GOTO ERR_BCNT

.. CALL pLoadData ; 資料正確,載入資料
.. BSF FLAG_RCV,fRcvEnd ;
.. GOTO CLR_BCNT
;-----------------------------------------------; HI
CHK_BCNT:
.. MOVLW dResetDuty; CHECK RESET RCV
.. SUBWF bRcvBCnt,W
.. SKPC
.. GOTO INC_BCNT
ERR_BCNT:
.. MOVLW B'10000000'
.. ANDWF FLAG_RCV,F
CLR_BCNT:
.. CLRF bRcvBCnt
INC_BCNT:
.. INCF bRcvBCnt,F
.. GOTO EXIT_RCV
;-----------------------------------------------; LOW
RCV_A:
.. BANKSEL FLAG_RCV
.. BTFSS FLAG_RCV,fPinStatus
.. GOTO INC_ACNT
;-----------------------------------------------; HI->LO
.. BCF FLAG_RCV,fPinStatus ;
.. BTFSS FLAG_RCV,fRcvStart
.. GOTO CHECK_START_BIT
.. BTFSS FLAG_RCV,fRcvBits
.. GOTO CHECK_DATA_BIT
.. GOTO CLR_ACNT
;-----------------------------------------------;CHECK_START_BIT
CHECK_START_BIT:
.. mCheckBit bRcvACnt,dStartBitA
.. SKPNC
.. GOTO CLR_ACNT
.. mCheckBit bRcvBCnt,dStartBitB
.. SKPNC
.. GOTO CLR_ACNT

.. BSF FLAG_RCV,fRcvStart
.. MOVLW dRcvBit
.. MOVWF bRcvBitCnt
.. GOTO CLR_ACNT
;-----------------------------------------------; CHECK_DATA_BIT
CHECK_DATA_BIT:
.. mCheckBit bRcvACnt,dBitDutyA
.. SKPNC
.. GOTO _CDB10
.. mCheckBit bRcvBCnt,dBitDutyB
.. SKPNC
.. GOTO ERR_ACNT
.. CLRC
.. GOTO _CDB20
_CDB10:
.. mCheckBit bRcvACnt,dBitDutyB
.. SKPNC
.. GOTO ERR_ACNT
.. mCheckBit bRcvBCnt,dBitDutyA
.. SKPNC
.. GOTO ERR_ACNT
.. SETC
_CDB20:
.. CALL pShiftBit
.. DECFSZ bRcvBitCnt,F
.. GOTO CLR_ACNT

.. BSF FLAG_RCV,fRcvBits
.. GOTO CLR_ACNT
;-----------------------------------------------;
ERR_ACNT:
.. MOVLW B'10000000'
.. ANDWF FLAG_RCV,F
CLR_ACNT:
.. CLRF bRcvACnt
INC_ACNT:
.. INCF bRcvACnt,F
EXIT_RCV:
.. BANKSEL PORTB
.. BCF STATUS,PA0
.. GOTO MAIN_10



發表於: 2007/7/6 12:58
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 用pic如何讀取IR信號
#13
新會員
新會員


查看用戶資訊
若以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
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 用pic如何讀取IR信號
#12
資深會員
資深會員


查看用戶資訊
http://www.sbprojects.com/knowledge/ir/rca.htm

市售產品常見的 遙控器 ir protocol


發表於: 2007/7/6 8:44
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 用pic如何讀取IR信號
#11
高級會員
高級會員


查看用戶資訊
版大是不是有曼徹斯特碼或NRZ相關的格式說明...
因為目前小弟用的信號格式是上頭規定的方式
我並不清楚這是屬於哪一種編碼系統..
想多了解一點...謝謝

發表於: 2007/7/6 8:28
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 用pic如何讀取IR信號
#10
版主
版主


查看用戶資訊
IR 傳送的方式是先編碼後再調變發射。編碼方式有很多種
曼徹斯特、NRZ 也有人用。找隻遙控器量量看。一般為避免IR被干擾,所發出的 IR 訊號會在經 38KHz 的調變後送出。

發表於: 2007/7/5 16:21
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 用pic如何讀取IR信號
#9
高級會員
高級會員


查看用戶資訊
發射、接收程式都有寫..
不過傳送的資料格式是自己訂的...
基本上..格式不同..就不相容...
但是只要知道傳輸資料位元..
1bit hi/lo ,Startbit, Endbit週期時間
修改些參數應該就可以相容了吧..(如果傳輸格式一樣的話)
沒研究過市販的遙控器送的是什麼碼...sorry
等手上案子趕完..有機會再把程式碼po上來..

發表於: 2007/7/5 11:08
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 用pic如何讀取IR信號
#8
新會員
新會員


查看用戶資訊
Hi ! Blake

照如此看來 , 發射器也是自己作的 ?!

有無接收市販的遙控器 , 結果也 OK 嗎 ?

發表於: 2007/7/5 8:41
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 用pic如何讀取IR信號
#7
高級會員
高級會員


查看用戶資訊
我不知道我所說的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
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 用pic如何讀取IR信號
#6
中級會員
中級會員


查看用戶資訊
ksj0120 可以多說一點嗎?
ir信號進來一定是用外部中斷!!

"Timer或者直接用Capture的中斷將Timer存在buffer,在主程式有空的時候再去檢查buffer裏面的Timer值再做判斷。
"
這有點難懂!可以多說明一下嗎?

發表於: 2007/7/4 19:10
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部







You can view topic.
不可以 發起新主題
You cannot reply to posts.
You cannot edit your posts.
You cannot delete your posts.
You cannot add new polls.
You cannot vote in polls.
You cannot attach files to posts.
You cannot post without approval.
You cannot use topic type.
You cannot use HTML syntax.
You cannot use signature.
You cannot create PDF files.
You cannot get print page.

[進階搜尋]


:::

Microchip連結

https://www.facebook.com/microchiptechnologytaiwan/
http://www.microchip.com.tw/modules/tad_uploader/index.php?of_cat_sn=13
https://mu.microchip.com/page/tmu
http://elearning.microchip.com.tw/modules/tad_link/index.php?cate_sn=1
https://page.microchip.com/APAC-PrefCenters-TW.html
http://www.microchip.com/
http://www.microchip.com/treelink
http://www.microchipdirect.com/
http://www.microchip.com.cn/newcommunity/index.php?m=Video&a=index&id=103
http://www.microchip.com.tw/modules/tad_uploader/index.php?of_cat_sn=2
http://www.microchip.com.tw/Data_CD/eLearning/index.html
http://www.microchip.com.tw/RTC/RTC_DVD/
https://www.microchip.com/development-tools/
https://www.youtube.com/user/MicrochipTechnology
[ more... ]

教育訓練中心

!開發工具購買
辦法說明 [業界客戶] [教育單位]
----------------------------------
!校園樣品申請
辦法說明 [教師資格] [學生資格]
----------------------------------