;*************************************** ;鬼襲試合用受信側プログラム ; RA0 右タイヤ前進 ; RA1 ローラー逆転 ; RA2 ローラー正転 ; RA3 ニクロム線 ; RA4 N/A ; RA5 車輪左正転 ; RB0 F.T ; RB1 N/A ; RB2 N/A ; RB3 N/A ; RB4 N/A ; RB5 N/A ; RB6 N/A ; RB7 N/A ; RC0 N/A ; RC1 PWM ; RC2 PWM ; RC3 N/A ; RC4 持ち上げ右正転 ; RC5 Option1逆転 ; RC6 Option1正転 ; RC7 Option2逆転 ; RD0 N/A ; RD1 N/A ; RD2 N/A ; RD3 持ち上げ右逆転 ; RD4 Option2正転 ; RD5 持ち上げ左正転 ; RD6 持ち上げ左逆転 ; RD7 N/A ; RE0 車輪左逆転 ; RE1 車輪右正転 ; RE2 車輪右逆転 ;*************************************** LIST P=PIC16F877 __CONFIG _HS_OSC & _PWRTE_ON & _WDT_OFF & _LVP_OFF INCLUDE "P16F877.inc" ;*************************************** ; Define variables ;*************************************** CNT1 EQU 33H CNT2 EQU 34H CNT3 EQU 35H CNT4 EQU 36H CNT5 EQU 37H BITBOX EQU 21H DATABOX EQU 22H ADATA1 EQU 23H ADATA2 EQU 24H GETBACK EQU 25H BDATA1 EQU 26H BDATA2 EQU 27H BDATA3 EQU 28H BDATA1R EQU 29H BDATA2R EQU 2AH BDATA3R EQU 2BH CRIMER EQU 2CH BUTTONCT EQU 2DH CRIMER2 EQU 2EH STAND EQU 2FH STAND2 EQU 30H ;*************************************** ; ;*************************************** ORG 0 CALL PORT_INI ;*************************************** ;MAIN ROUTINE ;*************************************** MAIN MOVLW H'FF' MOVWF GETBACK ;リセット変数をセットする CLRF STAND ;パンタ用変数1をセット CLRF STAND2 ;パンタ用変数2をセット MAINLOOP BSF PORTB,3 ;受信状況LEDを点ける CALL LETSDANCE ;出力 CALL FETCIRKIT ;アナログの出力(スピコン) CALL INTORO ;データ入力 CALL T80us ;安定性を持たせるため80us待つ CALL T40us ;安定性を持たせるため40us待つ GOTO MAINLOOP ;*************************************** ;データ受信部 ;*************************************** INTORO DECFSZ GETBACK,F ;リセット変数を1減らしてもまだあるか?(マシンは受信範囲内にあるか?) GOTO INTOROSTART ;まだある。受信に移る。(受信範囲内にある) MOVLW H'FF' ;もう無い。マシンの動きをリセットする。(受信範囲内に無い。暴走防止のためリセット) MOVWF GETBACK CLRF PORTA ;ポートAに繋がっている機器をリセット CLRF PORTB ;ポートBに繋がっている機器をリセット CLRF PORTC ;ポートCに繋がっている機器をリセット CLRF PORTD ;ポートDに繋がっている機器をリセット CLRF PORTE ;ポートEに繋がっている機器をリセット INTOROSTART NOP ;特に意味は無いが安定しそうなので BTFSC PORTB,0 ;1か? GOTO INTORO SONGSTART ;スタートビット"10001"確認 CALL T300us ;読み取りをビットのセンターに持ってくるため300us待つ BTFSC PORTB,0 ;1か? GOTO INTORO ;違う。戻る CALL T600us ;次のビットまで(600us)待つ BTFSS PORTB,0 ;0か? GOTO INTORO ;違う。戻る CALL T600us ;次のビットまで(600us)待つ BTFSS PORTB,0 ;0か? GOTO INTORO ;違う。戻る CALL T600us ;次のビットまで(600us)待つ BTFSS PORTB,0 ;0か? GOTO INTORO ;違う。戻る CALL T600us ;次のビットまで(600us)待つ BTFSC PORTB,0 ;1か? GOTO INTORO ;違う。戻る KINDAICODE ;近大コード"11010101"確認 CALL T600us BTFSC PORTB,0 ;1か? GOTO INTORO ;違う。戻る CALL T600us ;次のビットまで(600us)待つ BTFSC PORTB,0 ;1か? GOTO INTORO ;違う。戻る CALL T600us ;次のビットまで(600us)待つ BTFSS PORTB,0 ;0か? GOTO INTORO ;違う。戻る CALL T600us ;次のビットまで(600us)待つ BTFSC PORTB,0 ;1か? GOTO INTORO ;違う。戻る CALL T600us ;次のビットまで(600us)待つ BTFSS PORTB,0 ;0か? GOTO INTORO ;違う。戻る CALL T600us ;次のビットまで(600us)待つ BTFSC PORTB,0 ;1か? GOTO INTORO ;違う。戻る CALL T600us ;次のビットまで(600us)待つ BTFSS PORTB,0 ;0か? GOTO INTORO ;違う。戻る CALL T600us ;次のビットまで(600us)待つ BTFSC PORTB,0 ;1か? GOTO INTORO ;違う。戻る MOVLW H'FF' MOVWF GETBACK DATALOA ;ボタンデータ受信 CALL BITLEADER ;8ビットデータ受信 MOVWF BDATA1 ;BDATA1に代入する CALL BITLEADER ;8ビットデータ受信 MOVWF BDATA2 ;BDATA2に代入する CALL BITLEADER ;8ビットデータ受信 MOVWF BDATA3 ;BDATA3に代入する CALL BITLEADER ;8ビットデータ受信(再送) MOVWF BDATA1R ;BDATA1Rに代入する CALL BITLEADER ;8ビットデータ受信(再送) MOVWF BDATA2R ;BDATA2Rに代入する CALL BITLEADER ;8ビットデータ受信(再送) MOVWF BDATA3R ;BDATA3Rに代入する INTORO2 ;エンドビット確認 CALL T600us ;次のビットまで(600us)待つ BTFSC PORTB,0 ;1か? GOTO INTORO ;違う。戻る CALL T600us ;次のビットまで(600us)待つ BTFSS PORTB,0 ;0か? GOTO INTORO ;違う。戻る CALL T600us ;次のビットまで(600us)待つ BTFSS PORTB,0 ;0か? GOTO INTORO ;違う。戻る CALL T600us ;次のビットまで(600us)待つ BTFSS PORTB,0 ;0か? GOTO INTORO ;違う。戻る CALL T600us ;次のビットまで(600us)待つ BTFSS PORTB,0 ;0か? GOTO INTORO ;違う。戻る LIMITTEST MOVF BDATA1,W ;ワードレジスタにBDATA1の内容を入れる XORWF BDATA1R,F ;ワードレジスタ(BDATA1)の内容とBDATA1Rの排他的論理和をとる BTFSS STATUS,Z ;それはゼロレジスタは1か?(二つは同じだったか?) GOTO INTORO ;違う。戻る。 MOVF BDATA2,W ;ワードレジスタにBDATA2の内容を入れる XORWF BDATA2R,F ;ワードレジスタ(BDATA2)の内容とBDATA2Rの排他的論理和をとる BTFSS STATUS,Z ;それはゼロレジスタは1か?(二つは同じだったか?) GOTO INTORO ;違う。戻る。 MOVF BDATA3,W ;ワードレジスタにBDATA3の内容を入れる XORWF BDATA3R,F ;ワードレジスタ(BDATA3)の内容とBDATA3Rの排他的論理和をとる BTFSS STATUS,Z ;それはゼロレジスタは1か?(二つは同じだったか?) GOTO INTORO ;違う。戻る。 RETURN BITLEADER MOVLW 8 ;8ビット分受信する。 MOVWF BITBOX RETURNER CALL T600us ;次のビットまで(600us)待つ RLF DATABOX,F ;DATABOXを左に1ビットシフトする BTFSC PORTB,0 ;それは1だったか?(入ってくるデータは反転しているので) GOTO TEATIME ;違う。0である。 BSF DATABOX,0 ;その通り。DATABOXの0ビット目を1にする。 GOTO MISSION TEATIME BCF DATABOX,0 ;DATABOXの0ビット目を0にする。 MISSION DECFSZ BITBOX,F ;8ビット分受け取ったか? GOTO RETURNER ;まだ。もう一度受け取りにいく。 BCF STATUS,C ;キャリービットを0にする。 MOVF DATABOX,W ;DATABOXをワードレジスタに移す RETURN ;*************************************** ;実行部 ;*************************************** LETSDANCE DATA1_5 ;持ち上げ機構の下降(SPECIAL) BTFSS BDATA1,5 ;ボタンは押されていたか? GOTO DATA1_5_N ;いいえ、押されていなかった。 BTFSC CRIMER,0 ;その前は押されていなかったか?(押しっぱなしか?) GOTO D152 ;いいえ、押されていた。(押しっぱなしである) MOVLW H'02' ;はい、押されていなかった。 MOVWF BUTTONCT ;押しっぱなし確認用変数初期化 D152 BSF PORTD,3 ;持ち上げ右を逆転させる BSF PORTD,6 ;持ち上げ左を逆転させる BSF CRIMER2,0 ;下降中フラグをONにする MOVF BUTTONCT,F ;ゼロかどうか確認するため一度出し入れする BTFSS STATUS,Z ;ゼロフラグは立っているか?(BUTTONCTはゼロか?) DECF BUTTONCT,F ;立っていない(ゼロではない)。BUTTONCT-1をする GOTO LONGERSHOT ;次にいく DATA1_5_N MOVF BUTTONCT,F ;ゼロかどうか確認するため一度出し入れする BTFSS STATUS,Z ;ゼロフラグは立っているか?(BUTTONCTはゼロか?) GOTO LONGERSHOT ;立っていない。次にいく BCF PORTD,3 ;持ち上げ右の逆転を止める BCF PORTD,6 ;持ち上げ左の逆転を止める BCF CRIMER2,0 ;下降中フラグをOFFにする LONGERSHOT BTFSS CRIMER2,0 ;下降中フラグは立っているか? GOTO ENDINGING ;立っていない。次にいく MOVF STAND2,F ;ゼロかどうか確認するため一度出し入れする BTFSS STATUS,Z ;ゼロフラグは立っているか?(STAND2はゼロか?) DECF STAND2,F ;立っていない(ゼロではない)。STAND2-1をする BTFSS STATUS,Z ;ゼロフラグは立っているか?(STAND2は1だったか?) GOTO ENDINGING ;立っていない(1では無かった)。次にいく MOVF STAND,F ;ゼロかどうか確認するため一度出し入れする BTFSS STATUS,Z ;ゼロフラグは立っているか?(STANDはゼロか?) DECF STAND,F ;ゼロではないSTAND-1をする ENDINGING MOVF STAND,F ;ゼロかどうか確認するため一度出し入れする BTFSS STATUS,Z ;ゼロフラグは立っているか?(STANDはゼロか?) GOTO SONOMAE ;立っていない(ゼロではない)。次に進む BTFSC CRIMER,0 ;その前は押されていなかったか?(押しっぱなしか?) GOTO SONOMAE ;いいえ、押しっぱなしである。 BCF PORTD,3 ;持ち上げ右の逆転を止める BCF PORTD,6 ;持ち上げ左の逆転を止める BCF CRIMER2,0 ;下降中フラグをOFFにする SONOMAE BCF CRIMER,0 ;CRIMERを初期化する BTFSC BDATA1,5 ;もうボタン(持ち上げ機構下降ボタン)は押されていないか? BSF CRIMER,0 ;いいえ、まだ押されています。 DATA1_4 ;持ち上げ機構の上昇 BTFSS BDATA1,4 ;ボタン(持ち上げ機構上昇ボタン)は押されているか? GOTO DATA1_4_N ;いいえ、次の判断に移る。 MOVF STAND,W ;STANDの中身をワードレジスタに移す XORLW H'FF' ;"11111111"とSTANDの排他的論理和をとる(否定?) BTFSS STATUS,Z ;それは0か?(STANDは255か?) INCF STAND,F ;いいえ、STANDに1を足す BTFSC STATUS,Z ;STANDは0になったか? INCF STAND2,F ;いいえ、STAND2に1を足す BSF PORTC,4 ;持ち上げ右を正転させる BSF PORTD,5 ;持ち上げ左を正転させる BCF PORTD,3 ;持ち上げ右の逆転を止める BCF PORTD,6 ;持ち上げ左の逆転を止める BCF CRIMER2,0 ;下降中フラグをOFFにする BSF CRIMER2,1 ;上昇中フラグをONにする GOTO DATA1_1_K ;次の判断に進む DATA1_4_N BCF PORTC,4 ;持ち上げ右の正転を止める BCF PORTD,5 ;持ち上げ左の正転を止める BCF CRIMER2,1 ;上昇中フラグをOFFにする DATA1_1_K BTFSC CRIMER2,0 ;下降中フラグは立っていないか? GOTO DATA2_5 ;立っている。車輪の判断まで飛ぶ BTFSC CRIMER2,1 ;上昇中フラグは立っていないか? GOTO DATA2_5 ;立っている。車輪の判断まで飛ぶ DATA1_1 ;持ち上げ右を下降 BCF PORTD,3 ;持ち上げ右の逆転を止める BTFSC BDATA1,1 ;持ち上げ右の下降のボタンは押されていないか? BSF PORTD,3 ;いいえ、押されている。持ち上げ右を逆転させる。 DATA1_0 ;持ち上げ右を上昇 BCF PORTC,4 ;持ち上げ右の正転を止める BTFSC BDATA1,0 ;持ち上げ右の上昇のボタンは押されていないか? BSF PORTC,4 ;いいえ、押されている。持ち上げ右を正転させる。 DATA2_1 ;持ち上げ左を上昇 BCF PORTD,5 ;持ち上げ左の正転を止める BTFSC BDATA2,1 ;持ち上げ左の上昇のボタンは押されていないか? BSF PORTD,5 ;いいえ、押されている。持ち上げ左を正転させる。 DATA2_0 ;持ち上げ左を下降 BCF PORTD,6 ;持ち上げ左の逆転を止める BTFSC BDATA2,0 ;持ち上げ左の下降のボタンは押されていないか? BSF PORTD,6 ;いいえ、押されている。持ち上げ左を逆転させる。 DATA2_5 ;マシンの前進 BTFSS BDATA2,5 ;ボタンは押されているか? GOTO DATA2_5_N ;いいえ、押されていない。次の判断へ BSF PORTA,5 ;車輪左を正転 BSF PORTE,1 ;車輪右を正転 BSF CRIMER,2 ;前進中フラグをONにする GOTO DATA2_4 ;次の判断へ DATA2_5_N BCF PORTA,5 ;車輪左の正転を止める BCF PORTE,1 ;車輪右の正転を止める BCF CRIMER,2 ;前進中フラグをOFFにする DATA2_4 ;マシンの後進 BTFSS BDATA2,4 ;ボタンは押されているか? GOTO DATA2_4_N ;いいえ、押されていない。次の判断へ BSF PORTE,0 ;車輪左を逆転 BSF PORTE,2 ;車輪右を逆転 BSF CRIMER,3 ;後進中フラグをONにする GOTO DATA1_7_K ;次の判断へ DATA2_4_N BCF PORTE,0 ;車輪左の逆転を止める BCF PORTE,2 ;車輪右の逆転を止める BCF CRIMER,3 ;後進中フラグをOFFにする DATA1_7_K BTFSC CRIMER,2 ;前進中フラグは立っていないか? GOTO DATA1_3 ;いいえ、立っている。ローラーの判断へ BTFSC CRIMER,3 ;後進中フラグは立っていないか? GOTO DATA1_3 ;いいえ、立っている。ローラーの判断へ DATA1_7 ;車輪右逆転 BCF PORTE,2 ;車輪右の逆転を止める BTFSC BDATA1,7 ;ボタン(車輪右逆転)は押されているか? BSF PORTE,2 ;車輪右を逆転させる DATA1_6 ;車輪右正転 BCF PORTE,1 ;車輪右の正転を止める BTFSC BDATA1,6 ;ボタン(車輪右正転)は押されているか? BSF PORTE,1 ;車輪右を正転させる DATA2_7 ;車輪左逆転 BCF PORTE,0 ;車輪左の逆転を止める BTFSC BDATA2,7 ;ボタン(車輪左逆転)は押されているか? BSF PORTE,0 ;車輪左を逆転させる DATA2_6 ;車輪左正転 BCF PORTA,5 ;車輪左の正転を止める BTFSC BDATA2,6 ;ボタン(車輪左正転)は押されているか? BSF PORTA,5 ;車輪左を正転させる DATA1_3 ;ローラー逆転 BCF PORTA,1 ;ローラーの逆転を止める BTFSC BDATA1,3 ;ボタン(ローラー戻る)は押されているか? BSF PORTA,1 ;ローラーを逆転させる DATA1_2 ;ローラー正転 BCF PORTA,2 ;ローラーの正転を止める BTFSC BDATA1,2 ;ボタン(ローラー送る)は押されているか? BSF PORTA,2 ;ローラーを正転させる DATA2_2 ;OPTION1SEITEN BTFSS BDATA2,2 ;ボタン(オプション上がる)は押されているか? GOTO N_NIKUROMU ;押されていない。 BSF PORTC,6 ;オプションを正転させる GOTO DATA2_3 ;次の判断へ N_NIKUROMU BCF PORTC,6 ;オプションの正転を止める DATA2_3 ;OPTION1GYAKUTEN BTFSS BDATA2,3 ;ボタン(オプション下がる)は押されているか? GOTO N_NIKUROMU2 ;押されていない BSF PORTC,5 ;オプションを逆転させる RETURN ;次へ N_NIKUROMU2 BCF PORTC,5 ;オプションの逆転を止める RETURN ;**************FETCIRKIT*********************** FETCIRKIT MOVF BDATA3,W ;アナログデータを取り出す MOVWF CCPR1L ;アナログデータを挿入 MOVWF CCPR2L ;アナログデータを挿入 BSF PORTC,2 ;発信用ポート開放 BSF PORTC,1 ;発信用ポート開放 MOVLW H'05' ;モーターのパワーを最大限に使うため周波数を合わせている MOVWF T2CON CALL T80us ;安定のため80us待つ RETURN ;********** UNDER THE LINE IS TIMER *********** T80us MOVLW 65 MOVWF CNT1 LP664 DECFSZ CNT1,F GOTO LP664 RETURN T40us MOVLW 32 MOVWF CNT1 LP665 DECFSZ CNT1,F GOTO LP665 RETURN T300us ; GOTO ANOTHER_T300us MOVLW 00CH MOVWF CNT3 ;............................... BTLOOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP DECFSZ CNT3,F GOTO BTLOOP RETURN ANOTHER_300us MOVLW 00BH MOVWF CNT3 ;............................... BTLOOP2 NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP DECFSZ CNT3,F GOTO BTLOOP2 RETURN T600us ; GOTO ANOTHER_T600us MOVLW 019H MOVWF CNT3 ;............................... BTLOOP3 NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP DECFSZ CNT3,F GOTO BTLOOP3 RETURN ANOTHER_T600us MOVLW 017H MOVWF CNT3 ;............................... BTLOOP4 NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP DECFSZ CNT3,F GOTO BTLOOP4 RETURN ;*************************************** ; ;*************************************** PORT_INI BSF STATUS,RP0 ;バンク1へ切替 PORT_INI2 BCF INTCON,GIE ;割込み禁止 BTFSC INTCON,GIE GOTO PORT_INI2 MOVLW 07H MOVWF ADCON1 CLRF TRISA MOVLW B'00000001' MOVWF TRISB CLRF TRISC CLRF TRISD CLRF TRISE MOVLW H'FE' MOVWF PR2 BCF OPTION_REG,NOT_RBPU BCF STATUS,RP0 MOVLW 0CH MOVWF CCP1CON MOVWF CCP2CON CLRF CCPR1L CLRF CCPR2L CLRF T2CON CLRF PORTA CLRF PORTB CLRF PORTC CLRF PORTD CLRF PORTE RETURN END