;*************************************************************************** ; PWM TEST 16F873 USE ; 目的 PWM モジュールを限界まで設定して、どの位の値まで ;    実現できるのかを実際に確かめます ; 補足 同一プログラムで OSCを除く全ての条件を設定できます ;    入力端子にはプルアップをしたトグルスイッチ等を取り付け ;    各レジスタに希望の値を設定します ;*************************************************************************** ; PWM TEST ; OSC=4MHz 2009.02.01 作製 最終改良 2009.05.30 ;--------------------------------------------------------------------------- LIST P=16F873,F=INHX8M,R=DEC #include "P16F873.INC" ;--------------------------------------------------------------------------- ORG 0 GOTO START ; ORG 4 ; GOTO PUSHU ;--------------------------------------------------------------------------- W EQU 0 F EQU 1 SELF EQU 1 W_TEMP EQU H'20' ;割込用 STATUS_TEMP EQU H'21' ;割込用 COUNT1 EQU H'24' ;タイマー用 COUNT2 EQU H'25' ;タイマー用 COUNT3 EQU H'27' ;タイマー用 TEMP1 EQU H'28' TEMP2 EQU H'29' ;--------------------------------------------------------------------------- ;PORTA,5 DIN ;CCP2CON,5 ;PORTA,4 IN ;CCP2CON,4 プルアップが必要です ;PORTA,3 DIN :CCPR2L,7 ;PORTA,2 DIN ;CCPR2L,6 ;PORTA,1 DIN ;TMR2 PS,1 ;PORTA,0 DIN ;TMR2 PS,0 ;PORTB,7 IN ;PR2,7 ;PORTB,6 IN ; ;PORTB,5 IN ; ;PORTB,4 IN ; ;PORTB,3 IN : ;PORTB,2 IN ; ;PORTB,1 IN ; ;PORTB,0 IN ;PR2,0 ;PORTC,7 IN ;CCPR2L,5 ;PORTC,6 IN ; ;PORTC,5 IN ; ;PORTC,4 IN ; ;PORTC,3 IN : ;PORTC,2 IN ;CCPR2L,0 ;PORTC,1 OUT ;PWM2 OUT ;PORTC,0 OUT ;NC ;--------------------------------------------------------------------------- ; PORT INZ ;--------------------------------------------------------------------------- START BCF STATUS,RP1 ;BANK <1;0> BCF STATUS,RP0 ;BANK 0 CLRF PORTA ; BSF STATUS,RP0 ;BANK 1 MOVLW B'00000111' ;ALL D MOVWF ADCON1 MOVLW B'11111111' MOVWF TRISA ;PORTA SET BCF STATUS,RP0 ;BANK 0 ; CLRF PORTA CLRF PORTB BSF STATUS,RP0 ;BANK 1 MOVLW B'11111111' MOVWF TRISB ;PORTB SET BCF STATUS,RP0 ;BANK 0 ; CLRF PORTB CLRF PORTC BSF STATUS,RP0 ;BANK 1 MOVLW B'11111100' MOVWF TRISC ;PORTC SET BCF STATUS,RP0 ;BANK 0 CLRF PORTC ;--------------------------------------------------------------------------- ; 関連機能の設定 ;--------------------------------------------------------------------------- ;----- TMR2 SET ---------------------------------------------------------- MOVF PORTA,W ANDLW B'00000011' ; MOVLW B'000000BB' ;BB PRI SCALE ;00=1:1 01=1:4 1*=1:16 ;今回 POST SCALE は使いません MOVWF T2CON ;TMR2 を停止しておきます ;*************************************************************************** ;* MAIN ;*************************************************************************** MAIN ;----- PWM SET ----------------------------------------------------------- MA1 MOVF PORTA,W MOVWF TEMP1 CALL MS10 ;10mS MOVF PORTA,W SUBWF TEMP1,F BNZ MA1 ANDLW B'00110000' MOVWF TEMP1 MOVLW B'00001100' ADDWF TEMP1,W ; MOVLW B'00AB1100' ;AB 注5参照 MOVWF CCP2CON ;何れか一方にても可 ;----- CCPR*L SET -------------------------------------------------------- MA2 MOVF PORTC,W MOVWF TEMP1 CALL MS10 ;10mS MOVF PORTC,W SUBWF TEMP1,W BNZ MA2 CLRC ;'C'=0 RRF TEMP1,F CLRC RRF TEMP1,F MOVLW B'00111111' ANDWF TEMP1,F MA3 MOVF PORTA,W MOVWF TEMP2 CALL MS10 ;10mS MOVF PORTA,W SUBWF TEMP2,W BNZ MA3 RLF TEMP2,F RLF TEMP2,F RLF TEMP2,F RLF TEMP2,F MOVLW B'11000000' ANDWF TEMP2,W ADDWF TEMP1,W MOVWF CCPR2L ;----- PR2 SET ----------------------------------------------------------- MA4 MOVF PORTB,W MOVWF TEMP1 CALL MS10 ;10mS MOVF PORTB,W SUBWF TEMP1,F BNZ MA4 MOVWF FSR BCF STATUS,RP1 ;BANK 0:1 を選択 BSF STATUS,RP0 ;BANK 1 を選択 ; MOVLW D'nnn' ;周期設定値 MOVF FSR,W MOVWF PR2 ; BCF STATUS,RP0 ;BANK 0 に戻します ;----- MAIN プログラム内での TMR2 のスタート ----------------------------- ; CLRF TMR2 ;TMR2 をクリアします BSF T2CON,TMR2ON GOTO MAIN ;----- SUB RUTIN --------------------------------------------------------- MS10 MOVLW D'250' ;10mS 4MHz MOVWF COUNT1 MOVLW D'13' MOVWF COUNT2 LOOP1 DECFSZ COUNT1,F GOTO LOOP1 DECFSZ COUNT2,F GOTO LOOP1 RETURN ;*************************************************************************** ; END ;*************************************************************************** END ;***************************************************************************