;16F877でPWM(A/D)
;*********************************************
LIST P=PIC16F877 ;
INCLUDE "P16f877.inc" ;標準ヘッダ定義ファイル
__CONFIG _HS_OSC & _PWRTE_ON & _WDT_OFF & _LVP_OFF
;*********************************************
SWDT EQU 020H ;スイッチ読み込み
TIMCNT EQU 021H ;タイマ用カウンタ
TIM2CNT EQU 022H
TIM5CNT EQU 023H
T200CNT EQU 024H
TEMP1 EQU 025h ;テンポラリレジスタ
;***********************
; メインルーチン
;***********************
ORG 0 ;Reset Start
GOTO INIT
;*********************************************************
;初期処理
INIT
BSF STATUS,RP0 ;バンク1へ切替
BCF INTCON,GIE ;割り込み禁止
MOVLW 0EH
MOVWF ADCON1 ;RA0のみアナログ、ADFM=0(結果左詰)
MOVLW 01H
MOVWF TRISA ;ポートAをRA0入力、他は出力モード設定
MOVLW 0FFH
MOVWF TRISB ;ポートBを入力モードに設定
CLRF TRISC ;ポートCを出力モードに設定
;CCP1(RC2),CCP2(RC1)ピンをPWMに使用するためには
;出力に設定しておく必要がある
CLRF TRISD ;とりあえずポートDを出力モードに設定
CLRF TRISE ;とりあえずポートEを出力モードに設定
MOVLW 0FFH
MOVWF PR2 ;タイマ2周期レジスタに0FFH
;(プリスケーラ1で19.53kHz)
BCF STATUS,RP0 ;バンク0に戻す
MOVLW 0CH
MOVWF CCP1CON
MOVWF CCP2CON ;CCPモードセレクトをPWMモードに
;(デューティ下位2ビットは0とする)
CLRF CCPR1L ;初期デューティ0とする
CLRF CCPR2L
MAIN
;A/D変換
ADSTART
MOVLW 081H ;Fosc/32,ch0,A/D on
MOVWF ADCON0 ;
CALL TIM20 ;20μsec待ち
BSF ADCON0,GO ;A/Dスタート
ADWAITE
BTFSC ADCON0,GO
GOTO ADWAITE
MOVF ADRESH,W ;A/Dデータ上位(ADFM=0でデータは左詰め)
MOVWF TEMP1 ;(ADRESLの下位は捨てて8ビット扱い)
MOVF PORTB,W ;スイッチ読み込み
ANDLW 01H
MOVWF SWDT ;スイッチデータ保存
RRF SWDT,F ;スイッチデータのBit1を方向データとする
BC REVERSE ;1で逆転
FORWARD ;正転
CLRF CCPR2L
MOVF TEMP1,W
MOVWF CCPR1L ;デューティセット
MOVLW 04H
MOVWF T2CON ;プリスケール1でタイマ2ON
GOTO WAIT
REVERSE
CLRF CCPR1L
MOVF TEMP1,W
MOVWF CCPR2L ;デューティセット
MOVLW 04H
MOVWF T2CON ;プリスケール1でタイマ2ON
GOTO WAIT
WAIT
CALL TIM200
GOTO MAIN
;************************************************************
;タイマ
TIM20 ;約20μSECタイマ
MOVLW 012H
MOVWF TIMCNT
TIMLP
DECFSZ TIMCNT,F
GOTO TIMLP
RETURN
TIM02 ;約0.2mSECタイマ
MOVLW 0FFH
MOVWF TIM2CNT
TIM2LP NOP
DECFSZ TIM2CNT,F
GOTO TIM2LP
RETURN
TIM5 ;約5msecタイマ
MOVLW 019H
MOVWF TIM5CNT
TIM5LP CALL TIM02
DECFSZ TIM5CNT,F
GOTO TIM5LP
RETURN
TIM200 ;0.2SECタイマ
MOVLW 019H
MOVWF T200CNT
T200LP
CALL TIM5
DECFSZ T200CNT,F
GOTO T200LP
RETURN
;*********************************************************
END