irrxj: call irrxd jbc ttlcnt,7,cmp_rdata return cmp_rdata: clrf irdataj cmp_loop1: mov irtab_pntr,irdataj mult5 irtab_pntr incf irtab_pntr,F ;irtab_pntr=irdataj*5+1 mvi FSR,rxd mov cntr2,ttlcnt ;rxdから最大4バイト比較 ; rgt cntr2,6 jle cntr2,4,cmp_loop2 incf FSR,F ;PANA(5-6Byte)は0x02をスキップ decf cntr2,F incf FSR,F ;PANA(5-6Byte)は0x20をスキップ decf cntr2,F cmp_loop2: call irtab_read subwf INDF,W ;W=INDF-W jnz cmp_next ;not matched(goto cmp_next) incf FSR,F djnz cntr2,cmp_loop2 call beep return ;matched(received data is in irdataj) cmp_next: incf irdataj,F jlt irdataj,(irtab_end-irtab_start)/5,cmp_loop1 mvi ttlcnt,0x80 ;no data matched return irrxd: mvi FSR,rxd mvi rxdcnt,RXDLEN clrf2 TMR0h,TMR0 ;(TMR0h TMR0)=0 bcf INTCON,T0IF ;Clear TMR0 overflow flag bsf INTCON,T0IE ;Enable TMR0 overflow int wbc PORTA,IRIN ;~|____| low:?ms bcf INTCON,T0IE ;Disable TMR0 overflow int movf TMR0h,W jnz kaden ;6.5ms(25us*256)以上(9ms typ)ならばkaden movf TMR0,W andlw 0xc0 jnz sony_light ;1.6ms(25us*64)以上(2.6ms typ)ならばsonyまたはlight ;*********** ; goto irrx_err ;SHARP(No START bit, 2 byte + 2 byte)*********************************** sharp0: jlt rxdcnt,RXDLEN-3,sharp6 ;if(rxdcnt<3) goto sharp6 ...4Byteで終了 jge rxdcnt,RXDLEN-1,sharp1 ;if(rxdcnt>=5) goto sharp1 ...1st,2nd Byte jle rxdcnt,RXDLEN-3,sharp1 ;if(rxdcnt<=3) goto sharp1 ...4th Byte wbs PORTA,IRIN ;if(rxdcnt==4) ...3rd Byte clrf TMR0 ;~~~~~~~~| wbc PORTA,IRIN ;~~~~~~~~|__| sharp1: clrf rxdbuf mvi cntr3,8 ;1バイトは8ビット sharp2: jge TMR0,105,sharp5 ;dur:2.75ms(25us*105)以上ならばチェック jbs PORTA,IRIN,sharp2 ;~|__|~~ high:1ms(0)/2ms(1) movlw 60 ;TMR0(dur)>1.5msならば C=1 subwf TMR0,W ;TMR0(dur)<1.5msならば C=0 rrf rxdbuf,F clrf TMR0 wbc PORTA,IRIN ;~|_|~~~~|_| sharp4: djnz cntr3,sharp2 mov INDF,rxdbuf ;rxdbufをrxdに転送 incf FSR,F djnz rxdcnt,sharp0 sharp6: mvi cntr3,8 ;1バイトは8ビット goto irrx_end sharp5: jgt cntr3,1,irrx_err ;エラー bcf STATUS,C ;C=0 rrf rxdbuf,F goto sharp4 ;家電協(START:9ms typ)**************************************** kaden: clrf TMR0 kaden1: jge TMR0,235,irrx_err ;high:6ms(25us*235)以上ならばエラー jbs PORTA,IRIN,kaden1 ;~|____|~~| high:3ms(typ) jle TMR0,59,irrx_err ;high:1.5ms(25us*59)以下ならばエラー kaden2: clrf rxdbuf mvi cntr3,8 ;1バイトは8ビット kaden3: clrf TMR0 kaden4: jge TMR0,59,irrx_err ;low:1.5ms(25us*59)以上ならばエラー jbc PORTA,IRIN,kaden4 ;~|____|~~|__| low:0.5ms(typ) jle TMR0,16,irrx_err ;low:0.4ms(25us*16)以下ならばエラー mov buf1,TMR0 ;buf1=TMR0 bcf STATUS,C ;C=0 rrf buf1,W addwf buf1,F ;buf1=TMR0+TMR0/2...low時間x1.5 clrf TMR0 kaden5: jge TMR0,156,irrx_end ;high:4ms(25us*156)以上ならば終了 jbs PORTA,IRIN,kaden5 ;~|____|~~|__|~~| high:0.5ms/1.6(typ) jle TMR0,8,irrx_err ;high:0.2ms(25us*8)以下ならばエラー movf buf1,W ;TMR0(high)>?msならば C=1 subwf TMR0,W ;TMR0(high)0.9msならば C=1 subwf TMR0,W ;TMR0(low)<0.9msならば C=0 rrf rxdbuf,F djnz cntr3,sony1 mov INDF,rxdbuf ;1バイトデータをバッファへ incf FSR,F djnz rxdcnt,sony mvi cntr3,8 ;受信終了*************************************************** irrx_err: ;受信Error bcf INTCON,T0IE ;Disable TMR0 overflow int wbc PORTA,IRIN ;___| highを待つ mvi ttlcnt,80h return irrx_end: movf rxdcnt,W ;Byte数算出 sublw RXDLEN movwf cntr2 ;ttlcnt=cntr2=RXDLEN-rxdcnt movwf ttlcnt movf cntr3,W ;端数bit算出 sublw 8 movwf cntr1 ;cntr1=8-cntr3 rz movf rxdcnt,W rz irrx_end2: bcf STATUS,C rrf rxdbuf,F djnz cntr3,irrx_end2 mov INDF,rxdbuf ;端数bitを格納 incf ttlcnt,F return