;****************************************************************************************** ; Program Name : 16F88 Sample Program ; Programer : ; Create date : 2009/06/01 ; History : ; Discription : ;****************************************************************************************** ; (1)Description ;****************************************************************************************** ; LIST P=PIC16F88,ST=OFF,R=DEC INCLUDE "P16F88.inc" __CONFIG _CONFIG1 , _CP_OFF & _CCP1_RB3 & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_OFF & _PWRTE_OFF & _WDT_OFF & _INTRC_IO ; __CONFIG _CONFIG1 , _CP_OFF & _CCP1_RB0 & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_OFF & _PWRTE_OFF & _WDT_OFF & _INTRC_IO ; __CONFIG _CONFIG1 , _CP_OFF & _CCP1_RB0 & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_OFF & _PWRTE_OFF & _WDT_OFF & _HS_OSC __CONFIG _CONFIG2 , _IESO_OFF & _FCMEN_OFF ; CCP_H EQU 20H CCP_L EQU 21H ; ORG 0 GOTO START ORG 4 GOTO START ; ; ********************************** ; 1.Initialize ; ********************************** START ;(1)初期化1 ; Bank0での設定 BCF STATUS,RP0 ; SET BANK1 CLRF PORTA ; PortAの初期化(Bank0) CLRF PORTB ; PortBの初期化 ; Bank1での設定 BSF STATUS,RP0 ; SET BANK1 ; MOVLW B'01111110' ; 内部OSC選択,内部OSCに8MHzを選択 MOVLW B'00111110' ; 内部OSC選択,内部OSCに500KHzを選択 MOVWF OSCCON MOVLW B'00000000' ; 全てをDegitalに設定 MOVWF ANSEL ; Degital Inputに設定(Bank1) MOVLW B'11111111' MOVWF TRISA ; PortAのI/O設定(Bank1) MOVLW B'00000000' MOVWF TRISB ; PortBのI/O設定(Bank1) ; Bank0に戻す BCF STATUS,RP0 ; SET BANK1 ; CLRF PORTB ; ;(2)CCPモジュールの初期化 CALL Init_CCP ; ********************************** ; 2.Main Program ; ********************************** MAIN ; (1)Move -60° MOVLW D'7' MOVWF CCPR1L CALL TIM1S ; (2)Move 0° MOVLW D'12' MOVWF CCPR1L CALL TIM1S ; (3)Move 60° MOVLW D'16' MOVWF CCPR1L CALL TIM1S ; (4)Move 0° MOVLW D'12' MOVWF CCPR1L CALL TIM1S GOTO MAIN ;**************************************************************************** ; Function Name : Init_CCP ; Title : ; Input : ; Output : ; Description : ;**************************************************************************** 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 B'11111111' ; MOVLW D'156' ; 50Hz; 500000Hz(Int_OSC)/4/16(Prescaler)/50(Hz)==>156(DEC) MOVWF PR2 ; ; ; 3.Set CCPR1L Register ; PWM Duty ; BCF STATUS,RP0 ; SET BANK0 MOVLW B'00000000' ; MOVWF CCPR1L ; ; ; 4.Set T2CON Register ; Bit6-3:00, Bit2:TIMER 2 ON, Bit1-0:Prescale(00;Prescaler=1,01;Prescaler=4,1X;Prescaler=16) ; BCF STATUS,RP0 ; SET BANK0 MOVLW B'00000110' ; MOVWF T2CON ; ; BCF STATUS,RP0 ; SET BANK0 RETURN ;****************************************************************************************** ; Function Name : MOV01 ; Title : Move ; Input : ; Output : ; Decription : 20mS(50Hz) ; Note : 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 ;****************************************************************************************** MOV01 MOVLW H'00' MOVWF CCP_L ; CALL Set_CCP RETURN ;**************************************************************************** ; Function Name : Set_CCP ; Title : ; Input : ; Output : ; Description : ;**************************************************************************** Set_CCP: ; ; 1.Set duty cycle ; ; (1)Set 10-3 Bit MOVFW CCP_H ; MOVWF CCPR1L ; ; (2)Set 2-1 Bit BTFSS CCP_L,7 ; BCF CCP1CON,5 BTFSC CCP_L,7 ; BSF CCP1CON,5 ; BTFSS CCP_L,6 ; BCF CCP1CON,4 BTFSC CCP_L,6 ; BSF CCP1CON,4 RETURN ;****************************************************************************************** ; Function Name : TIM1S ; Title : タイマー ; Input : ; Output : ; Description : ;****************************************************************************************** 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 END