;************************************************************************* ; ; エレキ・ジャック創刊号 ; Mission2「衣装もエモーショナルに」 ;  PICマイコン・プログラム ; ; ; 記述言語 MPASM (Microchip) ; デバイス PIC12F629 ; ; 2007/01/14 V1.00 ; ; FITDESIGN A.Hata ;************************************************************************* ; LIST P=PIC12F629, R=DEC ;Target Processor INCLUDE P12F629.INC ; __CONFIG _WDT_OFF & _INTRC_OSC_NOCLKOUT & _CP_OFF & _MCLRE_OFF & _CPD_OFF & _BODEN_ON & _PWRTE_ON ; ;------------------------------------------------------------------------- ; DEFINE I/O Port ;------------------------------------------------------------------------- ; Port ; GP0 LED1 output ; GP1 LED2 output ; GP2 SENSOR2 input ; GP3 SENSOR1 input ; GP4 LED3 output ; GP5 LED4 output ; LED1 EQU 0 LED2 EQU 1 LED3 EQU 4 LED4 EQU 5 SENSOR1 EQU 3 ; 上下 SENSOR2 EQU 2 ; 傾斜 ; ;------------------------------------------------------------------------- ; literal ;------------------------------------------------------------------------- ;------------------------------------------------ ; この数値を変えることで点灯パターンのスピード ; を変更できます。 ;------------------------------------------------ PATTERN_SPEED EQU 1 ; 設定値 スピード ;  1 : 1sec/step(初期値) ; 2 : 0.5sec/step ; 4 : 0.25sec/step ; ;------------------------------------------------------------------------- ; Registers ;------------------------------------------------------------------------- INT_CNT EQU H'20' MODE_FLAG EQU H'21' ; bit0 ビート・モードで立てる ; bit1 ゴー・バックモードで立てる CNT0 EQU H'22' CNT1 EQU H'23' CNT2 EQU H'24' PERI_CNT EQU H'25' DUTY EQU H'26' TEMP0 EQU H'27' ; W_TEMP EQU H'30' ST_TEMP EQU H'31' ; ;------------------------------------------------------------------------- ; Program code ;------------------------------------------------------------------------- ; ORG H'00' ; Power ON GOTO START ; ORG H'04' ; INTERUPT GOTO INTERUPT ; ; ;----------------------- ; PWM Duty Convert(DUTYカウント値をPWMのデューティに変換するテーブル。) ;----------------------- DOWN_SLOPE ; デューティ下降 ADDWF PCL,F RETLW 0 RETLW 0 RETLW 0 RETLW 0 RETLW 0 RETLW 0 RETLW 0 RETLW 0 RETLW 1 RETLW 1 RETLW 1 RETLW 1 RETLW 1 RETLW 2 RETLW 2 RETLW 2 RETLW 3 RETLW 3 RETLW 3 RETLW 4 RETLW 4 RETLW 4 RETLW 5 RETLW 5 RETLW 6 RETLW 6 RETLW 7 RETLW 7 RETLW 8 RETLW 8 RETLW 9 RETLW 10 RETLW 10 RETLW 11 RETLW 12 RETLW 12 RETLW 13 RETLW 14 RETLW 14 RETLW 15 RETLW 16 RETLW 17 RETLW 18 RETLW 18 RETLW 19 RETLW 20 RETLW 21 RETLW 22 RETLW 23 RETLW 24 RETLW 25 RETLW 26 RETLW 27 RETLW 28 RETLW 29 RETLW 30 RETLW 31 RETLW 32 RETLW 34 RETLW 35 RETLW 36 RETLW 37 RETLW 38 RETLW 40 RETLW 41 RETLW 42 RETLW 44 RETLW 45 RETLW 46 RETLW 48 RETLW 49 RETLW 50 RETLW 52 RETLW 53 RETLW 55 RETLW 56 RETLW 58 RETLW 59 RETLW 61 RETLW 62 RETLW 64 RETLW 66 RETLW 67 RETLW 69 RETLW 71 RETLW 72 RETLW 74 RETLW 76 RETLW 77 RETLW 79 RETLW 81 RETLW 83 RETLW 85 RETLW 86 RETLW 88 RETLW 90 RETLW 92 RETLW 94 RETLW 96 RETLW 98 RETLW 100 UP_SLOPE ; デューティ上昇 ADDWF PCL,F RETLW 100 RETLW 98 RETLW 96 RETLW 94 RETLW 92 RETLW 90 RETLW 88 RETLW 86 RETLW 85 RETLW 83 RETLW 81 RETLW 79 RETLW 77 RETLW 76 RETLW 74 RETLW 72 RETLW 71 RETLW 69 RETLW 67 RETLW 66 RETLW 64 RETLW 62 RETLW 61 RETLW 59 RETLW 58 RETLW 56 RETLW 55 RETLW 53 RETLW 52 RETLW 50 RETLW 49 RETLW 48 RETLW 46 RETLW 45 RETLW 44 RETLW 42 RETLW 41 RETLW 40 RETLW 38 RETLW 37 RETLW 36 RETLW 35 RETLW 34 RETLW 32 RETLW 31 RETLW 30 RETLW 29 RETLW 28 RETLW 27 RETLW 26 RETLW 25 RETLW 24 RETLW 23 RETLW 22 RETLW 21 RETLW 20 RETLW 19 RETLW 18 RETLW 18 RETLW 17 RETLW 16 RETLW 15 RETLW 14 RETLW 14 RETLW 13 RETLW 12 RETLW 12 RETLW 11 RETLW 10 RETLW 10 RETLW 9 RETLW 8 RETLW 8 RETLW 7 RETLW 7 RETLW 6 RETLW 6 RETLW 5 RETLW 5 RETLW 4 RETLW 4 RETLW 4 RETLW 3 RETLW 3 RETLW 3 RETLW 2 RETLW 2 RETLW 2 RETLW 1 RETLW 1 RETLW 1 RETLW 1 RETLW 1 RETLW 0 RETLW 0 RETLW 0 RETLW 0 RETLW 0 RETLW 0 RETLW 0 RETLW 0 ; ;------------------------------------------------------------------------- ; Initialize ;------------------------------------------------------------------------- START CLRF INTCON CLRF GPIO BSF STATUS,RP0 CALL H'3FF' MOVWF OSCCAL BCF STATUS,RP0 ; BSF STATUS,RP0 MOVLW B'10001000' ; プルアップを無効に設定 MOVWF OPTION_REG MOVLW B'11001100' ; ポートの入出力を設定 MOVWF TRISIO MOVLW B'00001100' MOVWF IOC ; GP2,3 ピン変化割り込みを有効に設定 BCF STATUS,RP0 MOVLW B'00000111' MOVWF CMCON ; コンパレータをオフに設定 MOVLW B'00000000' MOVWF GPIO ; 出力を0にセット CLRF INTCON BSF INTCON,GPIE ; ピン変化割り込みを有効に設定 ; ;---------------------- ; レジスタの初期設定と割り込みの許可 ;---------------------- MOVLW 256-100 MOVWF TMR0 ; タイマ0レジスタの初期値設定 MOVLW 10 MOVWF PERI_CNT ; PERI_CNTレジスタの初期値設定 CLRF INT_CNT CLRF MODE_FLAG CLRF DUTY MOVF GPIO,W BSF INTCON,GIE ;******************************************************* ; MAIN PROGRAM ;******************************************************* MAIN BTFSS MODE_FLAG,0 ; ビート・モードかチェック GOTO MAIN2 BSF INTCON,T0IE ; 割り込みを許可 BTFSC MODE_FLAG,0 GOTO $-1 ; ビート・モード終了まで待機 BCF INTCON,T0IE ; 割り込みを禁止 MAIN2 BTFSS MODE_FLAG,1 ; ゴーバック・モードかチェック GOTO MAIN BSF INTCON,T0IE ; 割り込みを許可 BTFSC MODE_FLAG,0 GOTO $-1 ; ゴーバック・モード終了まで待機 BCF INTCON,T0IE ; 割り込みを禁止 GOTO MAIN ; ;******************************************************* ; INTERUPT(割り込み処理) ;  この割り込みはGP2,3ピンが変化したときおよび ; タイマ0のオーバーフローで発生する。 ;******************************************************* INTERUPT ;**** save W register & status register MOVWF W_TEMP ;Wレジスタの待避 SWAPF STATUS,W ; MOVWF ST_TEMP ;STATUSレジスタの待避 ; MOVF MODE_FLAG,W BTFSS STATUS,Z GOTO TMR0_RESET BTFSS INTCON,GPIF GOTO INT_END BTFSS GPIO,SENSOR2 ; 転倒検知センサのチェック GOTO $+3 BSF MODE_FLAG,1 GOTO $+4 BTFSC GPIO,SENSOR1 ; 万歩計センサのチェック GOTO INT_END BSF MODE_FLAG,0 MOVLW 5 MOVWF PERI_CNT ; パターンステップ数の再設定 MOVLW 100 MOVWF DUTY ; DUTYカウント値の再設定 GOTO INT_END ; ; タイマ0の再セットと割り込み回数のカウント ; TMR0_RESET BTFSS INTCON,T0IF ; タイマー0割り込みフラッグのチェック GOTO INT_END MOVLW 256-100 ; タイマー0の値を再セット MOVWF TMR0 ; INCF INT_CNT,F MOVLW 100 SUBWF INT_CNT,W BTFSS STATUS,Z GOTO BRANCH CLRF INT_CNT ; 10msec毎の処理 MOVF DUTY,W BTFSC STATUS,Z GOTO MODE_CHECK MOVLW PATTERN_SPEED SUBWF DUTY,F GOTO BRANCH ; ; 点灯モードのチェックとステップ・カウント処理 ; MODE_CHECK BTFSS MODE_FLAG,0 GOTO $+3 BCF MODE_FLAG,0 GOTO INT_END MOVF PERI_CNT,W BTFSS STATUS,Z GOTO $+3 BCF MODE_FLAG,1 GOTO INT_END DECF PERI_CNT,F ; パターンステップ値の減算 MOVLW 100 MOVWF DUTY ; DUTYカウント値の再設定 GOTO BRANCH ; ; 各点灯モードへの分岐 ; BRANCH BTFSC MODE_FLAG,0 GOTO BEAT BTFSC MODE_FLAG,1 GOTO GO_BACK GOTO INT_END ; ; ビート・モード(万歩計センサ信号に対する点灯パターン) ; BEAT MOVLW 75 SUBWF DUTY,W BTFSC STATUS,C GOTO BEAT2 BTFSS INTCON,GPIF GOTO BEAT2 BTFSC GPIO,SENSOR1 GOTO BEAT2 MOVLW 100 MOVWF DUTY GOTO INT_END BEAT2 MOVF DUTY,W CALL DOWN_SLOPE ; INT_CNTの値をデューティ値へ変換 SUBWF INT_CNT,W BTFSS STATUS,C ; INT_CNTの値がデューティ値以上だったら GOTO $+3 CALL ALL_OFF ; GOTO $+2 CALL ALL_ON ; 以下だったら GOTO INT_END1 ; 割り込み処理終了へ ; ; ゴーバック・モード(点灯検知センサ信号に対する点灯パターン) ; GO_BACK ; 各ステップへの分岐 MOVF PERI_CNT,W MOVWF TEMP0 DECF TEMP0,F BTFSC STATUS,Z GOTO STEP6 DECF TEMP0,F BTFSC STATUS,Z GOTO STEP5 DECF TEMP0,F BTFSC STATUS,Z GOTO STEP4 DECF TEMP0,F BTFSC STATUS,Z GOTO STEP3 DECF TEMP0,F BTFSC STATUS,Z GOTO STEP2 DECF TEMP0,F BTFSC STATUS,Z GOTO STEP1 GOTO INT_END STEP1 MOVF DUTY,W CALL UP_SLOPE ; DUTYをデューティ値へ変換 SUBWF INT_CNT,W BTFSS STATUS,C ; INT_CNTの値がデューティ値以上だったら GOTO $+3 CALL LED13OFF GOTO $+2 CALL LED13ON ; 以下だったら CALL LED24OFF GOTO INT_END ; 割り込み処理終了へ STEP2 MOVF DUTY,W CALL UP_SLOPE ; DUTYをデューティ値へ変換 SUBWF INT_CNT,W BTFSS STATUS,C ; INT_CNTの値がデューティ値以上だったら GOTO $+3 CALL LED24OFF GOTO $+2 CALL LED24ON ; 以下だったら CALL LED13ON GOTO INT_END ; 割り込み処理終了へ STEP3 MOVF DUTY,W CALL DOWN_SLOPE ; DUTYをデューティ値へ変換 SUBWF INT_CNT,W BTFSS STATUS,C ; INT_CNTの値がデューティ値以上だったら GOTO $+3 CALL LED13OFF GOTO $+2 CALL LED13ON ; 以下だったら CALL LED24ON GOTO INT_END STEP4 MOVF DUTY,W CALL UP_SLOPE ; DUTYをデューティ値へ変換 SUBWF INT_CNT,W BTFSS STATUS,C ; INT_CNTの値がデューティ値以上だったら GOTO $+3 CALL LED13OFF GOTO $+2 CALL LED13ON ; 以下だったら CALL LED24ON GOTO INT_END ; 割り込み処理終了へ STEP5 MOVF DUTY,W CALL DOWN_SLOPE ; DUTYをデューティ値へ変換 SUBWF INT_CNT,W BTFSS STATUS,C ; INT_CNTの値がデューティ値以上だったら GOTO $+3 CALL LED24OFF GOTO $+2 CALL LED24ON ; 以下だったら CALL LED13ON GOTO INT_END ; 割り込み処理終了へ STEP6 MOVF DUTY,W CALL DOWN_SLOPE ; DUTYをデューティ値へ変換 SUBWF INT_CNT,W BTFSS STATUS,C ; INT_CNTの値がデューティ値以上だったら GOTO $+3 CALL LED13OFF GOTO $+2 CALL LED13ON ; 以下だったら CALL LED24OFF GOTO INT_END ; 割り込み処理終了へ ; INT_END MOVF GPIO,W BCF INTCON,GPIF INT_END1 BCF INTCON,T0IF ;**** register restore and return SWAPF ST_TEMP,W ; MOVWF STATUS ; STATUSレジスタの復帰 SWAPF W_TEMP,F ; SWAPF W_TEMP,W ; Wレジスタの復帰 RETFIE ; ;----------------------------------------------------------- ; SUBROUTINES(サブルーチン) ;----------------------------------------------------------- ;----------------------- ; 全てのLEDをON ;----------------------- ALL_ON MOVLW B'00111011' MOVWF GPIO RETURN ;----------------------- ; LED1,3をON ;----------------------- LED13ON MOVF GPIO,W IORLW B'00010001' MOVWF GPIO RETURN ; ;----------------------- ; LED1,3をOFF ;----------------------- LED13OFF MOVF GPIO,W ANDLW B'11101110' MOVWF GPIO RETURN ; ;----------------------- ; LED2,4をON ;----------------------- LED24ON MOVF GPIO,W IORLW B'00100010' MOVWF GPIO RETURN ; ;----------------------- ; LED2,4をOFF ;----------------------- LED24OFF MOVF GPIO,W ANDLW B'11011101' MOVWF GPIO RETURN ; ;----------------------- ; 全てのLEDをOFF ;----------------------- ALL_OFF MOVLW B'00001000' MOVWF GPIO RETURN ;----------------------------------------------------------- ; ウェイト時間 WAIT100U ; 100usec ウェイト MOVLW 32 MOVWF CNT0 DECFSZ CNT0,F GOTO $-1 RETURN WAIT500U ; 500usec ウェイト MOVLW 100 MOVWF CNT0 GOTO $+1 DECFSZ CNT0,F GOTO $-2 RETURN WAIT1M ; 1msec ウェイト MOVLW 99 MOVWF CNT0 NOP GOTO $+1 GOTO $+1 GOTO $+1 DECFSZ CNT0,F GOTO $-5 RETURN WAIT5M ; 5msec ウェイト MOVLW 5 MOVWF CNT1 CALL WAIT1M DECFSZ CNT1,F GOTO $-2 RETURN WAIT10M ; 10msec ウェイト MOVLW 10 MOVWF CNT1 CALL WAIT1M DECFSZ CNT1,F GOTO $-2 RETURN WAIT50M ; 50msec ウェイト MOVLW 50 MOVWF CNT1 CALL WAIT1M DECFSZ CNT1,F GOTO $-2 RETURN WAIT100M ; 100msec ウェイト MOVLW 100 MOVWF CNT1 CALL WAIT1M DECFSZ CNT1,F GOTO $-2 RETURN WAIT250M ; 250msec ウェイト MOVLW 250 MOVWF CNT1 CALL WAIT1M DECFSZ CNT1,F GOTO $-2 RETURN WAIT1S ; 1sec ウェイト MOVLW 10 MOVWF CNT2 CALL WAIT100M DECFSZ CNT2,F GOTO $-2 RETURN ; END