楽天市場
[無料でホームページを作成] [通報・削除依頼]

PIC10F322 3-ch リモコンライン切り替え器


PIC10F322を用いた3-chビデオライン切り替え器(リモコン受信器)です。

NECフォーマットに対応しています。
先に公開した4-SWリモコン送信器と対で使用できます。
リモコン信号を受信すると、Video1ch,音声2chを切り替えます。
モニタ用のLEDを取り付ければ、現在どのchを選択しているか、判別可能です。

ブートローダー下ではなく、スタンドアローンで作動します。

リモコンのパラメータは4-SWリモコン送信器に示したものと同一のものを使用しています。
NECフォーマットで出力する市販のリモコンを使用する際はリモコンコードのパラメーター
を変更する必要があります。

<リモコンコードのパラメーター>

カスタムコード(上位8ビット)
カスタムコード(下位8ビット)
データコード(上位8ビット)
データコード(下位8ビット)


本プログラムで行っていること

リモコン信号を受信。

パルスの立ち上がり、立下りを検出して、規定の信号幅になっているかチェック

リモコン信号からカスタムコード、データコードを読み取る

読み取った、カスタムコード、データコードがあらかじめ書き込まれたものと一致するかチェック

データが一致すればVideo1ch、音声2ch、LEDを切り替え、リモコン信号受信に戻る。

データが一致しなければ、何もせず、リモコン信号受信に戻る

(2013.1.12) ソースプログラム改訂

<回路図、基板レイアウト>

img_20130110-222937.jpg


img_20130110-011805.jpg










<ソースプログラム>

  
LIST P=PIC10F322
#INCLUDE <P10F322.INC>
;
__CONFIG _FOSC_INTOSC & _BOREN_OFF & _WDTE_OFF & _PWRTE_ON & _MCLRE_OFF & _CP_OFF & _LVP_OFF & _LPBOR_OFF & _BORV_HI & _WRT_OFF

#DEFINE OUT0 0 ;出力用ビット0
#DEFINE OUT1 1 ;出力用ビット1
#DEFINE OUT2 2 ;出力用ビット2
#DEFINE REMIN 3 ;リモコン入力

; ********************************************************************
; Define General Purpose Registers (64 bytes maximum ; 40h-7fh)
; Bank 0 Only
; ********************************************************************
;
; ********************************************************************
; レジスタ・定数定義
; ********************************************************************
;
CCH EQU 0x40 ;カスタムコード(上位)
CCL EQU 0x41 ;カスタムコード(下位)
DATH EQU 0x42 ;データコード(上位)
DATL EQU 0x43 ;データコード(下位)
IRF EQU 0x44 ;割り込み完了フラグ
TEMP EQU 0x45 ;ワークレジスタ
WORK EQU 0x46 ;ワークレジスタ
CNT EQU 0x47 ;カウンタ
;
; ********************************************************************

ORG 0x0000

nop ;
nop ;
nop ;
goto INIT ;

ORG 0x0004 ;割り込み設定
;
MOVF IOCAP,W ;IOCAPとIOCANを交換
MOVWF TEMP ;
MOVF IOCAN,W ;
MOVWF IOCAP ;
MOVF TEMP,W ;
MOVWF IOCAN ;
;
CLRF IOCAF ;IOCAフラグクリア
BSF IRF,0 ;割り込み完了フラグセット
RETFIE
; ********************************************************************
; データ領域
; ********************************************************************
;
LC_ON_L EQU d'7500'/d'64' ;リーダーコードオン下限7500(us)
LC_ON_U EQU d'11500'/d'64' ;リーダーコードオン上限11500(us)
LC_OF_L EQU (d'9000'+d'3000')/d'64' ;リーダーコードオフ下限12000(us)
LC_OF_U EQU (d'9000'+d'7000')/d'64' ;リーダーコードオフ上限16000(us)

CC_ON_L EQU d'200'/d'64' ;カスタム/データコードオン下限200(us)
CC_ON_U EQU d'700'/d'64' ;カスタム/データコードオン上限700(us)
CC_OF_L EQU (d'560'+d'200')/d'64' ;カスタム/データコードオフ下限760(us)
CC_OF_U EQU (d'560'+d'2100')/d'64' ;カスタム/データコードオフ下限2660(us)

CC_HIGH EQU d'1400'/d'64' ;カスタム/データコードHighしきい値1400(us)

; ********************************************************************

REM000 ;DS-DR104 再生、一時停止
DW 0x08 ;カスタムコード(上位)
DW 0xF7 ;カスタムコード(下位)
DW 0x03 ;データコード(上位)
DW 0xFC ;データコード(下位)
;
REM001 ;DS-DR104 早送り
DW 0x08 ;カスタムコード(上位)
DW 0xF7 ;カスタムコード(下位)
DW 0x1F ;データコード(上位)
DW 0xE0 ;データコード(下位)
;
REM002 ;DS-DR104 巻き戻し
DW 0x08 ;カスタムコード(上位)
DW 0xF7 ;カスタムコード(下位)
DW 0x1E ;データコード(上位)
DW 0xE1 ;データコード(下位)
;
; ********************************************************************
; サブルーチン
; ********************************************************************
;
rd ;プログラムデータの読み出し
movlw b'00000001' ;CFGS=0 LWLO=0 FREE=0 WREN=0 RD=1
movwf PMCON1
nop
nop
return

; ********************************************************************
; メインルーチン
; ********************************************************************
;
INIT ;初期化処理
CLRF ANSELA ;digital I/O
CLRF LATA ;
CLRF PORTA ;
MOVLW B'00001000' ;OUT0,OUT1,OUT2=OUT REMIN=IN
MOVWF TRISA ;
MOVWF WPUA ;弱プルアップを有効にする
MOVLW B'00000110' ;TMR0 プリスケーラーx128
MOVWF OPTION_REG ;Step 0.5*128=64us

BSF PORTA,OUT0 ;RA0=High(初期状態)

RESTART
MOVLW B'00001000' ;割り込みの初期設定
MOVWF IOCAN ;IOCA(立ち下がり) セット
BSF INTCON,GIE ;グローバル割り込みを許可
CLRF IOCAF ;IOCAフラグクリア
BSF INTCON,IOCIE ;状態変化割り込みを許可

LC_ON ;リーダーコードの検出
CLRF IRF ;割り込み待ち↓
BTFSS IRF,0 ;
GOTO $-1 ;

CLRF TMR0 ;TMR0=0

LC_OFF ;
CLRF IRF ;割り込み待ち↑
BTFSS IRF,0 ;
GOTO $-1 ;

MOVF TMR0,W ;WORK=TMR0
MOVWF WORK ;

SUBLW LC_ON_U ;W=LC_ON_U-TMR0
BTFSS STATUS,C ;LC_ON_U>=TMR0 ?
GOTO RESTART ;

MOVF WORK,W ;
SUBLW LC_ON_L ;W=LC_ON_L-TMR0
BTFSC STATUS,C ;LC_ON_L<TMR0 ?
GOTO RESTART ;

CLRF IRF ;割り込み待ち↓
BTFSS IRF,0 ;
GOTO $-1 ;

MOVF TMR0,W ;WORK=TMR0
MOVWF WORK ;

SUBLW LC_OF_U ;W=LC_OF_U-TMR0
BTFSS STATUS,C ;LC_OF_U>=TMR0 ?
GOTO RESTART ;

MOVF WORK,W ;
SUBLW LC_OF_L ;W=LC_OF_L-TMR0
BTFSC STATUS,C ;LC_OF_L<TMR0 ?
GOTO RESTART ;

CC ;
MOVLW CCH ;FSR=CCH
MOVWF FSR ;
CC_LP ;
MOVLW 0x08 ;CNT=8
MOVWF CNT ;
CC_ON ;
CLRF TMR0 ;TMR0=0

CLRF IRF ;割り込み待ち↑
BTFSS IRF,0 ;
GOTO $-1 ;

MOVF TMR0,W ;WORK=TMR0
MOVWF WORK ;

SUBLW CC_ON_U ;W=CC_ON_U-TMR0
BTFSS STATUS,C ;CC_ON_U>=TMR0 ?
GOTO RESTART ;

MOVF WORK,W ;
SUBLW CC_ON_L ;W=CC_ON_L-TMR0
BTFSC STATUS,C ;CC_ON_L<TMR0 ?
GOTO RESTART ;

CC_OFF ;
CLRF IRF ;割り込み待ち↓
BTFSS IRF,0 ;
GOTO $-1 ;

MOVF TMR0,W ;WORK=TMR0
MOVWF WORK ;

SUBLW CC_OF_U ;W=CC_OF_U-TMR0
BTFSS STATUS,C ;CC_OF_U>=TMR0 ?
GOTO RESTART ;

MOVF WORK,W ;
SUBLW CC_OF_L ;W=CC_OF_L-TMR0
BTFSC STATUS,C ;CC_OF_L<TMR0 ?
GOTO RESTART ;

MOVLW CC_HIGH ;W=WORK-CC_HIGH
SUBWF WORK,W ;
RRF INDF,F ;IF TMR0>=CC_HIGH THEN Carry=1

DECFSZ CNT,F ;CNT=CNT-1 CNT=0?
GOTO CC_ON

INCF FSR,F ;FSR=FSR+1
BTFSS FSR,2 ;FSR=0x44?
GOTO CC_LP
STPB
CLRF IRF ;割り込み待ち↑
BTFSS IRF,0 ;
GOTO $-1 ;

BCF INTCON,IOCIE ;状態変化割り込みを禁止

CMPTBL ;リモコンデータとの比較
MOVLW REM000-1 ;PMADR=REM000-1
MOVWF PMADRL ;
CLRF PMADRH ;
MOVLW 0x03 ;CNT=3
MOVWF CNT ;
CMPLP
INCF PMADRL,F ;PMADRL=PMADRL+1
CALL rd ;プログラムデータの読み出し
MOVF PMDATL,W ;W=CCH-PMDATL
SUBWF CCH,W ;
MOVWF WORK ;

INCF PMADRL,F ;PMADRL=PMADRL+1
CALL rd ;プログラムデータの読み出し
MOVF PMDATL,W ;W=CCL-PMDATL
SUBWF CCL,W ;
IORWF WORK,F ;WORK=OR(WORK,W)

INCF PMADRL,F ;PMADRL=PMADRL+1
CALL rd ;プログラムデータの読み出し
MOVF PMDATL,W ;W=DATH-PMDATL
SUBWF DATH,W ;
IORWF WORK,F ;WORK=OR(WORK,W)

INCF PMADRL,F ;PMADRL=PMADRL+1
CALL rd ;プログラムデータの読み出し
MOVF PMDATL,W ;W=DATL-PMDATL
SUBWF DATL,W ;
IORWF WORK,F ;W=OR(WORK,W)
skpnz ;
GOTO TMATCH ;CNT=[3,2,1]該当テーブルあり

DECFSZ CNT,F ;CNT=CNT-1,CNT=0?
GOTO CMPLP ;CNT>0
NOMATCH ;CNT=0,該当テーブルなし
GOTO RESTART ;

TMATCH ;該当テーブルあり
DECF CNT,W ;W=CNT-1
skpnz ;
DECF CNT,F ;CNT=[3,2,1] -> [3,2,0]
MOVF CNT,W ;W=4-CNT=[1,2,4]
SUBLW 0x04 ;
MOVWF PORTA ;ポート出力

MOVLW 0x10 ;WAIT
MOVWF CNT
CLRF TEMP
CLRF WORK
DECFSZ WORK,F
GOTO $-1
DECFSZ TEMP,F
GOTO $-4
DECFSZ CNT,F
GOTO $-7

GOTO RESTART ;無限ループ
;
END







<HEXファイル>



:020000040000FA
:100000000000000000001E281A08C5001B089A0006
:1000100045089B009C01441409000800F7000300F8
:10002000FC000800F7001F00E0000800F7001E00B9
:10003000E1000130A40000000000080088018701F1
:10004000850108308600890006308E0005140830CE
:100050009B008B179C018B15C401441C2D2881012A
:10006000C401441C31280108C600B33C031C2728E6
:100070004608753C03182728C401441C3D28010884
:10008000C600FA3C031C27284608BB3C0318272857
:10009000403084000830C7008101C401441C4E2850
:1000A0000108C6000A3C031C27284608033C031825
:1000B0002728C401441C5A280108C600293C031CF7
:1000C000272846080B3C0318272815304602800CC9
:1000D000C70B4C28840A041D4A28C401441C6E28FE
:1000E0008B110C30A000A1010330C700A00A192019
:1000F00022084002C600A00A192022084102C604B4
:10010000A00A192022084202C604A00A19202208C7
:100110004302C60403198F28C70B762827284703F4
:100120000319C7034708043C85001030C700C50108
:10013000C601C60B9928C50B9828C70B97282728F6
:02400E008038F8
:00000001FF









































































































.