;****************************************************************************************** ; 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_2 EQU 27H TMP_BKC EQU 28H IN_S EQU 29H IN_N0 EQU 2AH IN_N1 EQU 2BH MSGCNT EQU 2CH LP_0 EQU 2DH LP_1 EQU 2EH HEX_DAT EQU 2FH CCP_D1 EQU 30H CCP_D0 EQU 31H CCP_DAT EQU 32H ; 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-1)Put Power-ON Message CALL DEMO1 ; (0-2)Move 0° MOVLW D'12' MOVWF CCPR1L MAIN ; (1)Get UART-data CALL SETDAT ; (2)Put Message CALL PUTOUTMESS ; (3)Convert data CALL CNVDAT GOTO MAIN ;**************************************************************************** ; Function Name : DEMO01 ; Title : ; Input : ; Output : ; Description : ;**************************************************************************** DEMO1: MOVLW D'40' MOVWF MSGCNT DEMO1A MOVFW MSGCNT CALL DEMO1TBL CALL SEND DECFSZ MSGCNT,F GOTO DEMO1A RETURN DEMO1TBL ADDWF PCL,F RETLW ' ' RETLW ' ' RETLW '>' RETLW 'n' RETLW 'n' RETLW ')' RETLW '-' RETLW '/' RETLW '+' RETLW '(' RETLW 't' RETLW 'u' RETLW 'p' RETLW 'n' RETLW 'I' RETLW ' ' RETLW ' ' RETLW '>' RETLW 'K' RETLW 'O' RETLW ' ' RETLW 'd' RETLW 'e' RETLW 't' RETLW 'c' RETLW 'e' RETLW 'n' RETLW 'n' RETLW 'o' RETLW 'C' RETLW ' ' RETLW '3' RETLW '8' RETLW '6' RETLW 'F' RETLW '2' RETLW '1' RETLW 'C' RETLW 'I' RETLW 'P' RETLW ' ' RETLW ' ' ; ;**************************************************************************** ; Function Name : PUTOUTMESS ; Title : ; Input : ; Output : ; Description : ;**************************************************************************** PUTOUTMESS: MOVLW '[' CALL SEND MOVFW IN_S CALL SEND MOVFW IN_N1 CALL SEND MOVFW IN_N0 CALL SEND MOVLW ']' CALL SEND RETURN ;****************************************************************************************** ; Function Name : SETDAT ; Title : Get UART-data ; Input : ; Output : ;****************************************************************************************** SETDAT ; ; (1)Get sign ; SETDAT1A CALL REC MOVWF TMP_BKC XORLW '+' BTFSC STATUS,Z GOTO SETDAT1B ; MOVFW TMP_BKC XORLW '-' BTFSS STATUS,Z GOTO SETDAT1A SETDAT1B MOVFW TMP_BKC MOVWF IN_S CALL SEND ; ; (2)Get N(1) ; SETDAT2A CALL REC MOVWF TMP_BKC MOVWF TMP_1 MOVLW '0' SUBWF TMP_1,F BTFSS STATUS,C GOTO SETDAT2A ; MOVFW TMP_BKC MOVWF TMP_1 MOVLW '7' SUBWF TMP_1,F BTFSC STATUS,C GOTO SETDAT2A MOVFW TMP_BKC MOVWF IN_N1 CALL SEND ; ; (2)Get N(0) ; SETDAT3A CALL REC MOVWF TMP_BKC MOVWF TMP_1 MOVLW '0' SUBWF TMP_1,F BTFSS STATUS,C GOTO SETDAT3A ; MOVFW TMP_BKC MOVWF TMP_1 MOVLW H'3A' SUBWF TMP_1,F BTFSC STATUS,C GOTO SETDAT3A ; MOVFW TMP_BKC MOVWF IN_N0 CALL SEND RETURN ;****************************************************************************************** ; Function Name : CNVDAT ; Title : ; Input : ; Output : ;****************************************************************************************** CNVDAT ; ; 1.Convert UART_DATA(Decimal_characters) to HEX_DATA ; CALL CNVHEX ; ; 2.ADD sign ; CALL CNVSIG ; ; 3.Convert CCP_data ; CALL CNVCCPDAT ; ; 4.SET CCP_data ; CALL SETCCPDAT RETURN ;****************************************************************************************** ; Function Name : CNVHEX ; Title : ; Input : ; Output : ;****************************************************************************************** CNVHEX CLRF HEX_DAT ; MOVFW IN_N1 ANDLW H'0F' MOVWF LP_1 ; XORLW H'00' BTFSC STATUS,Z GOTO CNVHEX2 ; CNVHEX1 MOVLW H'0A' ADDWF HEX_DAT,F DECFSZ LP_1,F GOTO CNVHEX1 ; ; ; CNVHEX2 MOVFW IN_N0 ANDLW H'0F' ADDWF HEX_DAT,F ; RETURN ;****************************************************************************************** ; Function Name : CNVSIG ; Title : ; Input : ; Output : ;****************************************************************************************** CNVSIG MOVFW IN_S XORLW '-' BTFSC STATUS,Z GOTO CNVSIG2 ; CNVSIG1 MOVLW D'60' MOVWF TMP_1 MOVFW HEX_DAT ADDWF TMP_1,W MOVWF HEX_DAT RETURN ; CNVSIG2 MOVLW D'60' MOVWF TMP_1 MOVFW HEX_DAT SUBWF TMP_1,W MOVWF HEX_DAT ; MOVWF TMP_1 MOVLW D'120' SUBWF TMP_1,F BTFSC STATUS,C CLRF HEX_DAT RETURN ;****************************************************************************************** ; Function Name : CNVCCPDAT ; Title : ; Input : ; 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 : TIM1S ; Title : ; Input : ; Output : ;****************************************************************************************** TIM1S ; ; 1.Set Register ; (1)T1CON Register ; MOVLW B'00010101' ; *Bit7(0):None ; *Bit6(0)/T1RUN:0 = System clock is derived from another source ; *Bit5,4(01)/T1CKPS:1:2 Prescale Value ; *Bit3(0)/T1OSCEN:OSC is shut off ; *Bit2(1)/T1SYNC:ASyncronize ; *Bit1(0)/TMR1CS:Internal clock(Fosc/4) ; *Bit0(1)/TMR1ON:Enable Timer1 MOVWF T1CON ; * ; (2)Set TMR1 Value ; 500000Hz(Int_OSC)/4/2(Prescale) => 0d62500(0xF424) ; 0xFFFF(-)0xF424 => 0d3035(0x0BDB) ; MOVLW H'0B' ; *TMR1 MOVWF TMR1H ; *TMR1 MOVLW H'DB' ; *TMR1 MOVWF TMR1L ; *TMR1 ; 2.Timer BCF PIR1,TMR1IF BTFSS PIR1,TMR1IF GOTO $-1 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