第24週
;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