;****************************************************************************************** ; 風速計サンプル ; Project : ; Program Name : ; Programer : ; Create date : Version 1.0 H18.05.01 ; History : ;****************************************************************************************** ; (1)Descript I/O ; GP1 : Input (RS) ; GP2 : Output(TX) ; GP5 : パルス入力 ;****************************************************************************************** LIST P=PIC12F683,ST=OFF,R=DEC INCLUDE "P12F683.inc" ;標準ヘッダ定義ファイル __CONFIG _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _CPD_OFF & _BOD_OFF & _IESO_OFF & _FCMEN_OFF ; IODAT EQU 20H SENDLP EQU 21H SENDWAT EQU 22H RECLP EQU 23H RECWAT EQU 24H MSGCNT EQU 25H CNT EQU 26H CNT0 EQU 27H CNT1 EQU 28H CNT2 EQU 29H DAT0 EQU 2AH DAT1 EQU 2BH DAT2 EQU 2CH DAT3 EQU 2DH COU0 EQU 2EH COU1 EQU 2FH COU2 EQU 30H COU3 EQU 31H OVER EQU 32H INTWRG EQU 33H INTSTS EQU 34H ITRCOU EQU 35H LPRPM EQU 36H CHCNT EQU 37H CHCNT1 EQU 38H ORG 0 ; プログラムスタート GOTO START ORG 4 ; 割込み処理 MOVWF INTWRG ; W-REGの値を保存 SWAPF STATUS,W ; STATUSレジスタの値を保存 MOVWF INTSTS ; STATUSレジスタの値を保存 ; MOVLW H'9E' ; *TMR1 MOVWF TMR1H ; *TMR1 MOVLW H'58' ; *TMR1 MOVWF TMR1L ; *TMR1 ; ; CALL CNTITR ; ; SWAPF INTSTS,W ; STATUSレジスタの値を復元 MOVWF STATUS ; STATUSレジスタの値を復元 MOVFW INTWRG ; W-REGレジスタの値を復元 BCF PIR1,TMR1IF ; *割込みフラグをリセット RETFIE ; START ; 1.特殊レジスタの設定 ; (1)内部OSCの設定 BSF STATUS,RP0 ; BANK1を選択 BSF OSCCON,6 ; 8MHzを設定 BSF OSCCON,5 ; 8MHzを設定 BSF OSCCON,4 ; 8MHzを設定 ; (2)ポートの設定 BCF STATUS,RP0 ; BANK0を選択 MOVLW 07H ; BANK0でデジタルIO設定 MOVWF CMCON0 ; BANK0でデジタルIO設定 ; CLRF GPIO ; BANK0でポート初期化 BSF STATUS,RP0 ; BANK1を選択 CLRF ANSEL ; BANK1でデジタルIO初期化 MOVLW B'111011' ; BANK1でPORT設定 MOVWF TRISIO ; BANK1でPORT設定 ; BCF STATUS,RP0 ; BANK0を選択 ; 2.変数初期設定 ; (1)送信フラグを初期化 BSF GPIO,2 ; (2)カウンタを初期化 CALL INITCOU CLRF ITRCOU ; ; (3)デモを表示 CALL DEMO1 ; ; 2.割込みタイマーを設定 CALL SETTIM ; 3.処理本体 MAIN ; (1)Hを待つ MAIN1 CALL CHTIM ; チャッターリング防止タイマー BTFSS GPIO,5 ; ビットデータがLの時 GOTO MAIN1 ; (2)Lを待つ MAIN2 CALL CHTIM ; チャッターリング防止タイマー BTFSC GPIO,5 ; ビットデータがHの時 GOTO MAIN2 ; (3)カウントアップ CALL CNTRPM ; RPMで算出(羽の枚数は4枚で計算) ; GOTO MAIN ;****************************************************************************************** ; Function Name : SETTIM ; Title : 割込みタイマーを設定 ; Input : ; Output : ;****************************************************************************************** SETTIM BCF STATUS,RP0 ; BANK0を選択 MOVLW B'00110001' ; ×Bit7(0):Timer1 gate is not inverted ; *Bit6(0):Timer1 is on ; *Bit5,4(11):1:16 Prescale Value ; *Bit3(0)LP osc is enabled for Timer1 colck ; *Bit2(0):This bit is ignored (<==Bit1) ; *Bit1(0):Internal clock(Fosc/4) ; *Bit0(1):Enable Timer1 MOVWF T1CON BCF CMCON1,T1GSS ; *Not use MOVLW H'9E' ; *TMR1 MOVWF TMR1H ; *TMR1 MOVLW H'58' ; *TMR1 MOVWF TMR1L ; *TMR1 CLRF ITRCOU ; BCF PIR1,TMR1IF ; *割込みフラグをリセット BSF INTCON,GIE ; *Grobal Interrupt Ebable (->1) ※Total BSF INTCON,PEIE ; *Peripheral Interrupt Ebable (->1) ※Timer etc. BSF STATUS,RP0 ; BANK1を選択 BSF PIE1,TMR1IE ; *Timer1 Interrupt Ebable (->1) ※Timer1 BCF STATUS,RP0 ; BANK0を選択 RETURN ;****************************************************************************************** ; Function Name : CNTITR ; Title : 割込みタイマー分周用10進カウンタ ; 1秒毎に処理を行なう ; Input : ; Output : ;****************************************************************************************** CNTITR ; (1)タイマー割込み処理 MOVLW H'01' ADDWF ITRCOU,F ; 0桁目10進カウンタ(0aで桁上げ) MOVFW ITRCOU XORLW H'0A' ; 0A BTFSS STATUS,Z RETURN ; 10でないなら何もしない ; (2)1秒毎に次の処理を行なう MOVLW ' ' CALL SEND CALL SETDN CALL DATOUT MOVLW '[' CALL SEND MOVLW 'r' CALL SEND MOVLW 'p' CALL SEND MOVLW 'm' CALL SEND MOVLW ']' CALL SEND CALL INITCOU ; (3)割込み設定 CLRF ITRCOU MOVLW H'9E' ; *TMR1 MOVWF TMR1H ; *TMR1 MOVLW H'58' ; *TMR1 MOVWF TMR1L ; *TMR1 RETURN ;****************************************************************************************** ; Function Name : SETDN ; Title : カウンタ変数の代入 ; Input : ; Output : ;****************************************************************************************** SETDN MOVFW OVER XORLW H'00' BTFSS STATUS,Z GOTO SETDN1 ; MOVFW COU0 IORLW H'30' MOVWF DAT0 MOVFW COU1 IORLW H'30' MOVWF DAT1 MOVFW COU2 IORLW H'30' MOVWF DAT2 MOVFW COU3 IORLW H'30' MOVWF DAT3 RETURN SETDN1 MOVLW H'0E' ; E MOVWF DAT3 MOVLW H'1B' ; r MOVWF DAT2 MOVLW H'1B' ; r MOVWF DAT1 MOVLW H'01' ; 1 MOVWF DAT0 RETURN ;****************************************************************************************** ; Function Name : CNTRPM ; Title : アップカウンタの単位をRPMに変換 ; CNTDEC * ( 60秒 / 4枚 ) => 15 ; Input : ; Output : ;****************************************************************************************** CNTRPM MOVLW H'0F' MOVWF LPRPM CNTRPM1 CALL CNTDEC DECFSZ LPRPM,F GOTO CNTRPM1 RETURN ;****************************************************************************************** ; Function Name : CNTDEC ; Title : 10進(4桁)アップカウンタ ; Input : COU0,COU1,COU2,COU3 ; Output : COU0,COU1,COU2,COU3 ;****************************************************************************************** CNTDEC MOVLW H'01' ADDWF COU0,F ; 0桁目10進カウンタ(0aで桁上げ) MOVFW COU0 XORLW H'0A' BTFSS STATUS,Z RETURN ; CLRF COU0 MOVLW H'01' ADDWF COU1,F ; 1桁目10進カウンタ(0aで桁上げ) MOVFW COU1 XORLW H'0A' BTFSS STATUS,Z RETURN ; CLRF COU1 MOVLW H'01' ADDWF COU2,F ; 2桁目10進カウンタ(0aで桁上げ) MOVFW COU2 XORLW H'0A' BTFSS STATUS,Z RETURN ; CLRF COU2 MOVLW H'01' ADDWF COU3,F ; 3桁目10進カウンタ(0aで桁上げ) MOVFW COU3 XORLW H'0A' BTFSS STATUS,Z RETURN ; CALL INITCOU MOVLW H'01' MOVWF OVER RETURN ;****************************************************************************************** ; Function Name : INITCOU ; Title : カウンタの初期化 ; Input : COU0,COU1,COU2,COU3 ; Output : COU0,COU1,COU2,COU3 ;****************************************************************************************** INITCOU CLRF COU0 CLRF COU1 CLRF COU2 CLRF COU3 CLRF OVER RETURN ;****************************************************************************************** ; Function Name : DEMO1 ; Title : デモ(16F88と正常に通信がされると、F683と表示される) ; Input : ; Output : ;****************************************************************************************** DEMO1 MOVLW ' ' CALL SEND MOVLW 'P' CALL SEND MOVLW 'I' CALL SEND MOVLW 'C' CALL SEND MOVLW '1' CALL SEND MOVLW '2' CALL SEND MOVLW 'F' CALL SEND MOVLW '6' CALL SEND MOVLW '8' CALL SEND MOVLW '3' CALL SEND MOVLW ' ' CALL SEND MOVLW 'C' CALL SEND MOVLW 'o' CALL SEND MOVLW 'n' CALL SEND MOVLW 'n' CALL SEND MOVLW 'e' CALL SEND MOVLW 'c' CALL SEND MOVLW 't' CALL SEND MOVLW 'e' CALL SEND MOVLW 'd' CALL SEND MOVLW ' ' CALL SEND MOVLW 'O' CALL SEND MOVLW 'K' CALL SEND MOVLW '>' CALL SEND RETURN ;****************************************************************************************** ; Function Name : DATOUT ; Title : データを出力 ; Input : ; Output : ;****************************************************************************************** DATOUT ; 1.送信指示を待つ ; CALL REC ; 2.送信開始 ; MOVFW DAT3 CALL SEND ; MOVFW DAT2 CALL SEND ; MOVFW DAT1 CALL SEND ; MOVFW DAT0 CALL SEND ; RETURN ;****************************************************************************************** ; Function Name : REC ; Disctiption : RS232C受信サブルーチン(GPIO,1) ; 9600BPS OSC;8.000MHz仕様 ; Input : ; Output : ;****************************************************************************************** REC ; (0)変数初期化 CLRF IODAT REC0 ; (1)受信データを待つ BTFSC GPIO,1 GOTO REC0 ; (2)1/2ビット分待つ MOVLW H'21' ; 9600BPS,OSC;8MHz MOVWF RECWAT REC1 DECFSZ RECWAT,F GOTO REC1 ; (3)データ受信(8ビット分) MOVLW 8 MOVWF RECLP NOP REC2 MOVLW H'42' ; 9600BPS,OSC;8MHz MOVWF RECWAT REC3 DECFSZ RECWAT,F GOTO REC3 NOP BTFSS GPIO,1 ; ビットデータが0の時, 0を立てる BCF STATUS,C BTFSC GPIO,1 ; ビットデータが1の時, 1を立てる BSF STATUS,C RRF IODAT,F ; 変数内でビットをシフトする DECFSZ RECLP,F GOTO REC2 NOP NOP ; RETURN ;****************************************************************************************** ; Function Name : SEND ; Title : 送信サブルーチン(GPIO,2) ; 9600BPS OSC;8.000MHz仕様 ; Input : ; Output : ;****************************************************************************************** SEND MOVWF IODAT ; (1)送信開始 BCF GPIO,2 ; 送信開始 MOVLW H'42' ; 9600BPS,OSC;8MHz MOVWF SENDWAT SEND1 DECFSZ SENDWAT,F GOTO SEND1 ; ; (2)データ送信(8ビット) MOVLW 8 ; 8ビットデータ分、送信する MOVWF SENDLP NOP SEND2 RRF IODAT,F NOP BTFSS STATUS,C ; ビットデータが0の時, 0を立てる BCF GPIO,2 BTFSC STATUS,C ; ビットデータが1の時, 1を立てる BSF GPIO,2 MOVLW H'42' ; パルス(9600BPS,OSC;8MHz) MOVWF SENDWAT SEND3 DECFSZ SENDWAT,F GOTO SEND3 DECFSZ SENDLP,F GOTO SEND2 ; (3)終了 BSF GPIO,2 ; フラグを戻す ; (4)送信後、少し待つ CALL TIMER CALL TIMER CALL TIMER ; RETURN ; ;****************************************************************************************** ; Function Name : TIMER ; Title : タイマー(1000回ループ) ; Input : ; Output : ;****************************************************************************************** TIMER MOVLW H'1A' MOVWF CNT1 TIMER1 MOVLW H'64' MOVWF CNT TIMER2 DECFSZ CNT,F GOTO TIMER2 DECFSZ CNT1,F GOTO TIMER1 RETURN ;****************************************************************************************** ; Function Name : CHTIM ; Title : チャッターリング防止タイマー ; Input : ; Output : ;****************************************************************************************** CHTIM MOVLW H'01' MOVWF CHCNT1 CHTIM1 MOVLW H'64' MOVWF CHCNT CHTIM2 DECFSZ CHCNT,F GOTO CHTIM2 DECFSZ CHCNT1,F GOTO CHTIM1 RETURN ; END