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

PIC10F322 4-SW リモコン送信器


PIC10F322を用いた4-SWリモコン送信器です。

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

変調周波数は38kHzに設定してありますが、PWM制御ですので変更が容易です。


ご使用にあたってはリモコンコードのパラメーターを書き換える必要があります。(REM000からREM004)

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

カスタムコード(上位8ビット)
カスタムコード(下位8ビット)
データコード(上位8ビット)
データコード(下位8ビット)
リーダーコードオン時間(us)/ビットデータの幅(us)
リーダーコードオフ時間(us)/ビットデータの幅(us)
ビット0オン時間(us)/ビットデータの幅(us)
ビット0オフ時間(us)/ビットデータの幅(us)
ビット1オン(us)/ビットデータの幅(us)
ビット1オフ(us)/ビットデータの幅(us)
繰り返し回数(8ビット)
ビットデータの幅(上位8ビット)
ビットデータの幅(上位8ビット)


ビットデータの幅とはON-OFFの識別単位となる時間のことで、
NECフォーマットの場合560μsになります。




以下は一般的なNECフォーマットの設定例です。

◎リーダコード

 リーダコードは9000μsのONと4500 μsのOFFからなる。

◎カスタムコード16ビット

 カスタムコードは上位、下位の順に8ビットづつLSBファーストで送出する。

 ビットが0のとき560μsのONと 560μsのOFF
 ビットが1のとき560μsのONと 1680μsのOFF

◎データコード16ビット

 データコードは上位、下位の順に8ビットづつLSBファーストで送出する。

 ビットが0のとき560μsのONと 560μsのOFF
 ビットが1のとき560μsのONと 1680μsのOFF

◎ストップコード
 560μsのONの後、OFF

参考ページ
https://sites.google.com/site/zoxrimokonkodo/



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

SWが押されたことを検出。

押されたSWに該当するリモコンコードのパラメーターを選択。

選択されたリモコンコードのパラメーターからビットデータの幅ごとに、1/0のパルス列をRAM上に生成。

生成されたパルス列をビットデータの幅ごとに再生、LED出力(1:変調出力/0:ローレベル)

レベル変化割り込みを許可して、スリープモードに入る。



<回路図、製作例>
img_20130104-213211.jpg


img_20130104-213238.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 OUTP 0 ;パルス出力用ポート
#DEFINE SC0 1 ;スキャン出力
#DEFINE SC1 2 ;スキャン出力
#DEFINE SCIN 3 ;スキャン入力

; ********************************************************************
; Define General Purpose Registers (64 bytes maximum ; 40h-7fh)
; Bank 0 Only
; ********************************************************************
;
; ********************************************************************
; レジスタ・定数定義
; ********************************************************************
cblock 0x40
buffer:0x20
endc

LC EQU 0x60 ;再生回数
LL EQU 0x61 ;再生ビット数
DM EQU 0x62 ;WAIT(上位)
DL EQU 0x63 ;WAIT(下位)
MSCN EQU 0x64 ;現在のリモコンパラメ-ターテーブル
WORK EQU 0x65 ;ワークレジスタ
rs EQU 0x66 ;ワークレジスタ
cn EQU 0x67 ;ワークレジスタ
rxd EQU 0x68 ;ワークレジスタ

WK0 EQU 0x73 ;カスタムコード(上位)
WK1 EQU 0x74 ;カスタムコード(下位)
WK2 EQU 0x75 ;データコード(上位)
WK3 EQU 0x76 ;データコード(下位)
WK4 EQU 0x77 ;リーダーコードオン
WK5 EQU 0x78 ;リーダーコードオフ
WK6 EQU 0x79 ;ビット0オン
WK7 EQU 0x7A ;ビット0オフ
WK8 EQU 0x7B ;ビット1オン
WK9 EQU 0x7C ;ビット1オフ
WK10 EQU 0x7D ;繰り返し回数
WK11 EQU 0x7E ;ビットデータの幅(上位)
WK12 EQU 0x7F ;ビットデータの幅(下位)

; ********************************************************************
; プログラムコード
; ********************************************************************
;
ORG 0x0000
;
NOP ;
NOP ;
NOP ;
GOTO INIT ;
;
ORG 0x0004 ;割り込み設定
;
BCF INTCON,IOCIE ;状態変化割り込みを禁止
RETFIE
;
; ********************************************************************
; データ領域
; ********************************************************************
;
REM000 ;DS-DR103,104 再生、一時停止
DATWD0 EQU d'560' ;ビットデータの幅
DW 0x08 ;カスタムコード(上位)
DW 0xF7 ;カスタムコード(下位)
DW 0x03 ;データコード(上位)
DW 0xFC ;データコード(下位)
DW d'9000'/DATWD0 ;リーダーコードオン(us)
DW d'4500'/DATWD0 ;リーダーコードオフ(us)
DW d'560' /DATWD0 ;ビット0オン(us)
DW d'560' /DATWD0 ;ビット0オフ(us)
DW d'560' /DATWD0 ;ビット1オン(us)
DW d'1680'/DATWD0 ;ビット1オフ(us)
DW 1 ;繰り返し回数
DW DATWD0 /0x0100 ;ビットデータの幅(上位)
DW DATWD0 %0x0100 ;ビットデータの幅(上位)
;
REM001 ;DS-DR103,104 停止
DATWD1 EQU d'560' ;ビットデータの幅
DW 0x08 ;カスタムコード(上位)
DW 0xF7 ;カスタムコード(下位)
DW 0x04 ;データコード(上位)
DW 0xFB ;データコード(下位)
DW d'9000'/DATWD1 ;リーダーコードオン(us)
DW d'4500'/DATWD1 ;リーダーコードオフ(us)
DW d'560' /DATWD1 ;ビット0オン(us)
DW d'560' /DATWD1 ;ビット0オフ(us)
DW d'560' /DATWD1 ;ビット1オン(us)
DW d'1680'/DATWD1 ;ビット1オフ(us)
DW 1 ;繰り返し回数
DW DATWD1 /0x0100 ;ビットデータの幅(上位)
DW DATWD1 %0x0100 ;ビットデータの幅(上位)
;
REM002 ;DS-DR103,104 早送り
DATWD2 EQU d'560' ;ビットデータの幅
DW 0x08 ;カスタムコード(上位)
DW 0xF7 ;カスタムコード(下位)
DW 0x1F ;データコード(上位)
DW 0xE0 ;データコード(下位)
DW d'9000'/DATWD2 ;リーダーコードオン(us)
DW d'4500'/DATWD2 ;リーダーコードオフ(us)
DW d'560' /DATWD2 ;ビット0オン(us)
DW d'560' /DATWD2 ;ビット0オフ(us)
DW d'560' /DATWD2 ;ビット1オン(us)
DW d'1680'/DATWD2 ;ビット1オフ(us)
DW 1 ;繰り返し回数
DW DATWD2 /0x0100 ;ビットデータの幅(上位)
DW DATWD2 %0x0100 ;ビットデータの幅(上位)
;
REM003 ;DS-DR103,104 巻き戻し
DATWD3 EQU d'560' ;ビットデータの幅
DW 0x08 ;カスタムコード(上位)
DW 0xF7 ;カスタムコード(下位)
DW 0x1E ;データコード(上位)
DW 0xE1 ;データコード(下位)
DW d'9000'/DATWD3 ;リーダーコードオン(us)
DW d'4500'/DATWD3 ;リーダーコードオフ(us)
DW d'560' /DATWD3 ;ビット0オン(us)
DW d'560' /DATWD3 ;ビット0オフ(us)
DW d'560' /DATWD3 ;ビット1オン(us)
DW d'1680'/DATWD3 ;ビット1オフ(us)
DW 1 ;繰り返し回数
DW DATWD3 /0x0100 ;ビットデータの幅(上位)
DW DATWD3 %0x0100 ;ビットデータの幅(上位)
;
; ********************************************************************
; サブルーチン
; ********************************************************************
;
W001
CLRF PCLATH ;Select Page 0
MOVF DL,W ;W=[0_15]
ADDWF PCL,F ;PCL=PCL+W
NOP ;W=0
NOP ;W=1
NOP ;W=2
NOP ;W=3
NOP ;W=4
NOP ;W=5
NOP ;W=6
NOP ;W=7
NOP ;W=8
NOP ;W=9
NOP ;W=10
NOP ;W=11
NOP ;W=12
NOP ;W=13
NOP ;W=14
MOVF cn,W ;W=15
ADDWF PCL,F ;PCL=PCL+W
W240 CALL ret0C ;W=0
CALL ret0C ;W=1
CALL ret0C ;W=2
CALL ret0C ;W=3
CALL ret0C ;W=4
CALL ret0C ;W=5
CALL ret0C ;W=6
CALL ret0C ;W=7
CALL ret0C ;W=8
CALL ret0C ;W=9
CALL ret0C ;W=10
CALL ret0C ;W=11
CALL ret0C ;W=12
CALL ret0C ;W=13
CALL ret0C ;W=14
RETURN ;W=15
;
W256
ADDLW 0x01
BTFSC STATUS,Z
GOTO $+6
MOVWF WORK
CALL $+4
INCFSZ WORK,F
GOTO $-2
NOP
NOP ;1
CALL W240 ;2+240+2=244
ret04 GOTO ret02 ;2
ret02 GOTO ret00 ;2
ret00 RETURN ;2 TOTAL:1+244+2+2+2=251
;
ret0C
CALL ret04 ;2+2+2+2=8
GOTO ret02 ;2+2+2=6 TOTAL:8+6=14
;
rd ;プログラムメモリーの読み出し
movlw b'00000001' ;CFGS=0 LWLO=0 FREE=0 WREN=0 RD=1
movwf PMCON1
nop
nop
return
;
LSHIFT ;0を書き込み
BCF STATUS,C ;Carry=0
GOTO $+2 ;
HSHIFT ;1を書き込み
BSF STATUS,C ;Carry=1
RRF INDF,F ;[FSR]=XXXXXXXX -> CXXXXXXX
INCF FSR,F ;FSR=FSR+1
BSF FSR,6 ;FSR>=0x40
BCF FSR,5 ;FSR<0x60
INCF LL,F ;LL=LL+1
RETURN ;
;
SETB
BTFSC STATUS,C ;Carry=0?
GOTO SETH ;
;
SETL ;Carry=0
MOVF WK6,W ;DM=WK6
MOVWF DM ;
B0H
CALL HSHIFT ;
DECFSZ DM,F ;DM=DM-1 DM=0?
GOTO B0H ;

MOVF WK7,W ;DM=WK7
MOVWF DM ;
B0L
CALL LSHIFT ;
DECFSZ DM,F ;DM=DM-1 DM=0?
GOTO B0L ;
RETURN
;
SETH ;Carry=1
MOVF WK8,W ;DM=WK8
MOVWF DM ;
B1H
CALL HSHIFT ;
DECFSZ DM,F ;DM=DM-1 DM=0?
GOTO B1H ;

MOVF WK9,W ;DM=WK9
MOVWF DM ;
B1L
CALL LSHIFT ;
DECFSZ DM,F ;DM=DM-1 DM=0?
GOTO B1L ;
RETURN
;
SWRD ;SW読み取り設定
MOVLW B'00000110' ;SC1=High SC0=High
MOVWF LATA ;
MOVLW B'00001001' ;SC1=OUT SC0=OUT OUTP=IN
MOVWF TRISA ;
RETURN
;
PULS
CLRF PORTA ;OUTP=Low SC1=Low SC0=Low
MOVLW B'00001110' ;OUTPのみ出力に設定
MOVWF TRISA ;
RETURN
;
WAIT ;約1msのWAIT
CLRF rs ;
NOP ;
DECFSZ rs,F ;
GOTO $-2 ;
RETURN
;
SCAN ;SWスキャン、テーブル選択
BCF STATUS,Z ;Z=0

BCF PORTA,SC1 ;SC1=Low SC0=High
BSF PORTA,SC0 ;

BTFSC PORTA,OUTP ;SC0 -> OUTP でないか?
RETLW REM000%0x0100 ;SC0 -> OUTP

BTFSC PORTA,SCIN ;SC0 -> SCIN でないか?
RETLW REM001%0x0100 ;SC0 -> SCIN

BSF PORTA,SC1 ;SC1=High SC0=Low
BCF PORTA,SC0 ;

BTFSC PORTA,OUTP ;SC1 -> OUTP でないか?
RETLW REM002%0x0100 ;SC1 -> OUTP

BTFSC PORTA,SCIN ;SC1 -> SCIN でないか?
RETLW REM003%0x0100 ;SC1 -> SCIN

BSF STATUS,Z ;Z=1
RETURN ;SW入力無効、やりなおし
;
; ********************************************************************
;
; メインルーチン
;
; ********************************************************************
;
INIT ;初期化処理
CLRF ANSELA ;digital I/O
MOVLW B'00001111' ;弱プルアップを有効にする
MOVWF WPUA ;
BCF OPTION_REG,7 ;

BCF OSCCON,5 ;Clock 4MHz
BSF OSCCON,4 ;

MOVLW B'00001001' ;割り込みの初期設定
MOVWF IOCAP ;IOCA(立ち上がり) セット
; MOVWF IOCAN ;
BSF INTCON,GIE ;グローバル割り込みを許可

movlw 0x19 ;PWM周期(Period)=25.32
movwf PR2 ;(4MHz)
clrf T2CON ;TMR2=OFF プリ・ポストスケーラ=0

movlw b'00001101' ;PWM Duty=52.63
movwf PWM1DCH ;0000110101
movlw b'01000000' ;(4MHz)
movwf PWM1DCL ;

RSTART ;
CALL SWRD ;SW読み取り設定
CLRF IOCAF ;IOCAフラグクリア
BSF INTCON,IOCIE ;状態変化割り込みを許可
SLEEP ;SW入力待ち

CALL WAIT ;約1msのWAIT

CALL SCAN ;SWスキャン
skpnz ;
GOTO RSTART ;Z=1ならSWスキャンをやり直す。

COPYPRM ;テーブルをコピー
MOVWF PMADRL ;PMADR=0x00XX
CLRF PMADRH
MOVLW WK0 ;FSR=WK0
MOVWF FSR
LOOP_G
CALL rd
MOVF PMDATL,W
MOVWF INDF
INCF PMADRL,F ;PMADRL=PMADRL+1
INCF FSR,F ;FSR=FSR+1
BTFSS FSR,7 ;FSR=0x80?
GOTO LOOP_G

; ********************************************************************
;
;CSETM 変調データ再生コマンド 38kHz=26us
;
;コマンド[nnmmhhhh]
; nn:発振回数 0~255 (0は無限発振) LC
; mm:再生ビット数 2~256 (256は0を入力) LL
; hhhh:1ビットあたりの再生周期 16~65535(μs) DM・DL
;
; ********************************************************************
;
CSETM
CALL PULS ;パルス出力設定
BSF T2CON,TMR2ON ;TMR2オン

TRNSPRM ;リモコンパラメーターをビットデータに変換
CLRF LL ;LL=ビットデータの数
MOVLW buffer ;FSR=buffer
MOVWF FSR ;
LCON ;リーダーコードオン
CALL HSHIFT ;
DECFSZ WK4,F ;WK4=WK4-1 WK4=0?
GOTO LCON ;
LCOFF ;リーダーコードオフ
CALL LSHIFT ;
DECFSZ WK5,F ;WK5=WK5-1 WK5=0?
GOTO LCOFF ;

MOVLW 0x08 ;DL=8
MOVWF DL ;
CUSTOMH ;カスタムコード(上位)
RRF WK0,F ;SHIFT Carry
CALL SETB ;Set Bit
DECFSZ DL,F ;DL=DL-1 DL=0?
GOTO CUSTOMH ;

MOVLW 0x08 ;DL=8
MOVWF DL ;
CUSTOML ;カスタムコード(下位)
RRF WK1,F ;SHIFT Carry
CALL SETB ;Set Bit
DECFSZ DL,F ;DL=DL-1 DL=0?
GOTO CUSTOML ;

MOVLW 0x08 ;DL=8
MOVWF DL ;
DATAH ;データコード(上位)
RRF WK2,F ;SHIFT Carry
CALL SETB ;Set Bit
DECFSZ DL,F ;DL=DL-1 DL=0?
GOTO DATAH ;

MOVLW 0x08 ;DL=8
MOVWF DL ;
DATAL ;データコード(下位)
RRF WK3,F ;SHIFT Carry
CALL SETB ;Set Bit
DECFSZ DL,F ;DL=DL-1 DL=0?
GOTO DATAL ;

;ストップコード
CALL HSHIFT ;
CALL LSHIFT ;

MOVF LL,W ;DM=LL(PUSH LL)
MOVWF DM ;
SUBLW 0x00 ;DL=256-LL
MOVWF DL ;

ZERO ;残りのbufferを0で埋める
CALL LSHIFT ;
DECFSZ DL,F ;DL=DL-1 DL=0?
GOTO ZERO ;

PLSOUT ;発振の設定
MOVF DM,W ;LL=DM(POP LL)
MOVWF LL ;
MOVF WK11,W ;Set DM
MOVWF DM ;
MOVF WK12,W ;Set DM
MOVWF DL ;
;遅延補正、1の補数処理
MOVLW d'29' ;W=29
SUBWF DL,F ;DL=DL-29
BTFSS STATUS,C ;DL>=29?
DECF DM,F ;DL<29
COMF DM,F ;DM=[0x00_0xFF] -> [0xFF_0x00]
COMF DL,F ;DL=[0x00_0xFF] -> [0xFF_0x00]

SWAPF DL,W ;cn -> [15_0](DL上位)
MOVWF cn ;DL -> [15_0](DL下位)
MOVLW B'00001111' ;
ANDWF DL,F ;
ANDWF cn,F ;

PLPM ;発振出力
MOVF WK10,W ;Set LC(繰り返し回数)
MOVWF LC ;
MOVF LL,W ;rs=LL(再生ビット数)
MOVWF rs ;
MOVLW B'00000001' ;rxd=B'00000001'(ビット位置)
MOVWF rxd ;
CLRF FSR ;FSR=0x00
PLPM1
BSF FSR,6 ;FSR>=0x40
MOVF INDF,W ;W=[FSR]
ANDWF rxd,W ;W=AND([FSR],rxd)
BTFSS STATUS,Z ;PWMモジュール無効 PWMピン無効
MOVLW B'11000000' ;PWMモジュール有効 PWMピン有効
MOVWF PWM1CON ;PWM1CONセット
CALL W001 ;
INCFSZ DM,W ;
CALL W256 ;
DECFSZ rs,F ;rs=rs-1 rs=0? 再生ビット数に到達したか?
GOTO PLPM3 ;rs=/0
DECFSZ LC,F ;LC=LC-1 LC=0? 繰り返し回数に到達したか?
GOTO PLPM ;LC=/0
PLPM2  
BCF T2CON,TMR2ON ;TMR2オフ
CLRF PWM1CON ;PWMモジュール無効 PWMピン無効
GOTO RSTART ;EXIT 繰り返し回数に到達
PLPM3
INCF FSR,F ;FSR=FSR+1
BCF STATUS,C ;Carry=0
BTFSC FSR,5 ;FSR<0x60?
RLF rxd,F ;rxdを左シフト
BCF FSR,5 ;FSR<0x60
GOTO PLPM1 ;
;
END







<HEXファイル>


:020000040000FA
:10000000000000000000B0288B1109000800F70074
:100010000300FC00100008000100010001000300C3
:100020000100020030000800F7000400FB0010008F
:10003000080001000100010003000100020030007F
:100040000800F7001F00E000100008000100010098
:10005000010003000100020030000800F7001E004C
:10006000E100100008000100010001000300010090
:10007000020030008A0163088207000000000000CF
:100080000000000000000000000000000000000070
:100090000000000000000000670882076B206B2052
:1000A0006B206B206B206B206B206B206B206B20F8
:1000B0006B206B206B206B206B200800013E031926
:1000C0006628E5006620E50F6228000000004E204B
:1000D00069286A280800682069280130A400000007
:1000E00000000800031075280314800C840A04170C
:1000F0008412E10A0800031888287908E2007420B5
:10010000E20B7F287A08E2007220E20B84280800C4
:100110007B08E2007420E20B8A287C08E20072204F
:10012000E20B8F280800063087000930860008009F
:1001300085010E3086000800E6010000E60B9D28D0
:1001400008000311051185140518063485191334A8
:10015000051585100518203485192D340315080060
:1001600088010F3089008E139012101609309A0002
:100170008B171930920093010D3095004030940098
:1001800093209C018B1563009C20A1200319C0289B
:10019000A000A101733084006D2022088000A00A15
:1001A000840A841FCC2898201315E1014030840074
:1001B0007420F70BD8287220F80BDB280830E300F6
:1001C000F30C7B20E30BE0280830E300F40C7B20E9
:1001D000E30BE6280830E300F50C7B20E30BEC286A
:1001E0000830E300F60C7B20E30BF2287420722029
:1001F0006108E200003CE3007220E30BFC28620887
:10020000E1007E08E2007F08E3001D30E302031CEA
:10021000E203E209E309630EE7000F30E305E705B7
:100220007D08E0006108E6000130E8008401041761
:1002300000086805031DC03096003A20620F5E205A
:10024000E60B2729E00B102913119601C028840A18
:0A0250000310841AE80D8412172928
:02400E008038F8
:00000001FF






































































































.