;****************************************************************************************** ; Project : ; Program Name : ; Programer : ; Create date : Version 1.0 H21.07.01 ; History : ;****************************************************************************************** ; Description ; ;****************************************************************************************** LIST P=PIC12F683,ST=OFF,R=DEC INCLUDE "P12F683.inc" ;標準ヘッダ定義ファイル __CONFIG _MCLRE_OFF & _INTRC_OSC_NOCLKOUT & _WDT_OFF ; IODAT EQU 20H SENDLP EQU 21H SENDLP1 EQU 22H SENDWAT EQU 23H RECLP EQU 24H RECWAT EQU 25H TMP_1 EQU 26H TMP_BKC EQU 27H LP_1 EQU 28H HEX_DAT EQU 29H CCP_DAT EQU 2AH ; ORG 0 GOTO START ORG 4 GOTO START START ; (1)Initialized PORT,OSC BCF STATUS,RP0 MOVLW 07H MOVWF CMCON0 ; BANK0でCOMPARATOR_I/OをデジタルIO設定 CLRF GPIO ; BANK0でポート初期化 BSF STATUS,RP0 CLRF ANSEL ; BANK1でデジタルIO初期化 MOVLW B'101011' MOVWF TRISIO ; BANK1でPORT設定 BCF OSCCON,6 ; BANK1で内臓OSC500KHzを設定 BSF OSCCON,5 ; BANK1で内臓OSC500KHzを設定 BSF OSCCON,4 ; BANK1で内臓OSC500KHzを設定 BCF STATUS,RP0 BSF GPIO,4 ; (2)Initialized CCP Module CALL Init_CCP ; ********************************** ; 2.Main Program ; ********************************** ; (0)Set 0° MOVLW D'12' MOVWF CCPR1L MAIN ; (1)Get UART-data ; 1)Get data CALL SETDAT ; 2)Check error status XORLW H'FF' BTFSC STATUS,Z GOTO MAIN ; (2)Convert CCP_data ; ; MOVFW HEX_DAT ; CALL DUMPER CALL CNVCCPDAT ; ; (3)SET CCP_data ; CALL SETCCPDAT GOTO MAIN ;****************************************************************************************** ; Function Name : SETDAT ; Title : Get UART-data ; Input : ; Output : ;****************************************************************************************** SETDAT ; ; 1.Error Check ; CALL REC MOVWF TMP_BKC ; MOVWF TMP_1 MOVLW D'121' SUBWF TMP_1,F BTFSC STATUS,C GOTO SETDAT_ERR MOVFW TMP_BKC MOVWF HEX_DAT CALL SEND RETLW H'00' SETDAT_ERR MOVLW H'FF' CALL SEND RETLW H'FF' ;****************************************************************************************** ; Function Name : CNVCCPDAT ; Title : ; Input : HEX_DAT ; Output : ;****************************************************************************************** CNVCCPDAT ; MOVLW D'67' MOVLW D'54' MOVWF CCP_DAT RRF HEX_DAT,F RRF HEX_DAT,F MOVFW HEX_DAT MOVWF LP_1 MOVFW LP_1 XORLW H'00' BTFSC STATUS,Z GOTO CNVCCPDAT2 CNVCCPDAT1 ; MOVLW D'3' MOVLW D'2' MOVWF TMP_1 MOVFW CCP_DAT ADDWF TMP_1,W MOVWF CCP_DAT DECFSZ LP_1,F GOTO CNVCCPDAT1 RETURN CNVCCPDAT2 ; MOVLW D'3' MOVLW D'2' MOVWF TMP_1 MOVFW CCP_DAT ADDWF TMP_1,W MOVWF CCP_DAT RETURN ;****************************************************************************************** ; Function Name : SETCCPDAT ; Title : ; Input : ; Output : ;****************************************************************************************** SETCCPDAT ; ; 1.Set CCPR1L ; MOVFW CCP_DAT MOVWF TMP_1 RRF TMP_1,F RRF TMP_1,F RRF TMP_1,F MOVFW TMP_1 ANDLW H'1F' MOVWF CCPR1L ; ; 2.Set CCP1CON ; BTFSS CCP_DAT,2 BCF CCP1CON,5 BTFSC CCP_DAT,2 BSF CCP1CON,5 ; BTFSS CCP_DAT,1 BCF CCP1CON,4 BTFSC CCP_DAT,1 BSF CCP1CON,4 RETURN ;**************************************************************************** ; Function Name : Init_CCP ; Title : ; Input : ; Output : ; Decription : ; (1)PWM Frequency 20mS(50Hz) ; (2)PWM Duty ; 0.9mS/20mS=>0.045(-60°) < 1.5mS/20mS=>0.075(Center) < 2.1mS/20mS=>0.105(60°) ; 156(PR2)*0.045=>7.02 156(PR2)*0.075=>11.7 156(PR2)*0.105=>16.38 ;**************************************************************************** Init_CCP: ; ; 1.Set CCP1CON Register ; Bit7-6:00, Bit5-4:PMW mode, Bit3-0:CCP1 mode select bit ; ※Bit5-4(00):Init value OSC,Bit3-0(11xx):PWM mode ; BCF STATUS,RP0 ; SET BANK0 MOVLW B'00001100' ; MOVWF CCP1CON ; ; ; 2.Set PR2 Register ; PWM Frequency ; BSF STATUS,RP0 ; SET BANK1 MOVLW D'156' ; 50Hz; 500000Hz(Int_OSC)/4/16(Prescaler)/50(Hz)==>156(DEC) MOVWF PR2 ; BCF STATUS,RP0 ; SET BANK0 ; ; 3.Set CCPR1L Register ; PWM Duty 0% ; ; (1)Set 10-3 Bit MOVLW B'00000000' ; MOVWF CCPR1L ; ; (2)Set 2-1 Bit BCF CCP1CON,5 BCF CCP1CON,4 ; ; 4.Set T2CON Register ; Bit6-3:00, Bit2:TIMER 2 ON, Bit1-0:Prescale(00;Prescaler=1,01;Prescaler=4,1X;Prescaler=16) ; MOVLW B'00000110' ; MOVWF T2CON ; ; RETURN ;****************************************************************************************** ; Function Name : REC ; Title : RS232C受信サブルーチン(GPIO,5) ; 1200BPS OSC;500KHz仕様 ; Input : ; Output : W-Reg ;****************************************************************************************** REC ; (0)変数初期化 CLRF IODAT ; (1)受信データを待つ REC0 BTFSC GPIO,5 GOTO REC0 ; (2)1/2ビット分待つ ; MOVLW H'21' ; 9600BPS,OSC;8MHz MOVLW H'10' ; 1200BPS,OSC;500KHz MOVWF RECWAT REC1 DECFSZ RECWAT,F GOTO REC1 ; (3)データ受信(8ビット分) MOVLW 8 MOVWF RECLP NOP ;REC2 MOVLW H'42' ; 9600BPS,OSC;8MHz REC2 MOVLW H'1F' ; 1200BPS,OSC;500KHz MOVWF RECWAT REC3 DECFSZ RECWAT,F GOTO REC3 NOP BTFSS GPIO,5 ; ビットデータが0の時, 0を立てる BCF STATUS,C BTFSC GPIO,5 ; ビットデータが1の時, 1を立てる BSF STATUS,C RRF IODAT,F ; 変数内でビットをシフトする DECFSZ RECLP,F GOTO REC2 NOP NOP ; MOVFW IODAT ; RETURN ;****************************************************************************************** ; Function Name : SEND ; Title : RS232C送信サブルーチン(GPIO,4) ; 1200BPS OSC;500KHz仕様 ; Input : W-Reg ; Output : ;****************************************************************************************** SEND MOVWF IODAT ; (1)送信開始 SEND0 BCF GPIO,4 ; 送信開始 ; MOVLW H'42' ; 9600BPS,OSC;8MHz MOVLW H'1F' ; 1200BPS,OSC;500KHz 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,4 BTFSC STATUS,C ; ビットデータが1の時, 1を立てる BSF GPIO,4 ; MOVLW H'42' ; パルス(9600BPS,OSC;8MHz) MOVLW H'1F' ; 1200BPS,OSC;500KHz MOVWF SENDWAT SEND3 DECFSZ SENDWAT,F GOTO SEND3 DECFSZ SENDLP,F GOTO SEND2 ; (3)終了 BSF GPIO,4 ; フラグを戻す ; (4)送信後、少し待つ ; MOVLW H'32' MOVLW H'0A' MOVWF SENDLP1 SENDTM1 MOVLW H'64' MOVWF SENDLP SENDTM2 DECFSZ SENDLP,F GOTO SENDTM2 DECFSZ SENDLP1,F GOTO SENDTM1 RETURN END