Professional Documents
Culture Documents
asm
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; THE FOLLOWING STEPS SHOULD BE TAKEN WHEN CONFIGURING THE CCP MODULE FOR
PWM OPERATION: ;
; ;
; 2. SET THE PWM DUTY CYCLE BY WRITING TO THE CCPR1L REGISTER AND CCP1CON<5:4>
BITS. ;
; 4. SET THE TMR2 PRESCALE VALUE AND ENABLE TIMER2 BY WRITING TO T2CON. ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
PROCESSOR '16F876A'
INCLUDE <P16F876A.INC>
__CONFIG _XT_OSC & _WDT_OFF & _PWRTE_OFF & _CP_OFF & _LVP_OFF & _BODEN_OFF
CBLOCK 0x20
D1
D2
ORG 0x0000
INIT:
;PWM PERIOD = [(PR2)+1] * 4 * TOSC * (TMR2 PRESCALE VALUE) ;PR2 = TMR2 PERIOD
REGISTER, TOSC = PIC CLOCK PERIOD (FOSC = 1 / TOSC)
MOVLW D'128' ;SET PR2 TO 128 DECIMAL SO THE PWM PERIOD = 2064uS => PWM
FREQUENCY = 484Hz
MOVWF PR2
CLRF CCPR1L
MOVLW B'00001100' ;SET PWM MODE, BITS 5 AND 4 ARE THE TWO LSBs OF THE 10BIT DUTY
CYCLE REGISTER (CCPR1L:CCP1CON<5:4>)
MOVWF CCP1CON
MOVWF T2CON
CLRF TMR2
CLRF FADE_STATE
MAIN:
CALL DELAY
MOVLW 0x00
IORWF FADE_STATE, W
INC_CCPR1L:
GOTO MAIN
DEC_CCPR1L:
GOTO MAIN
;IF WE HAVE AN OVERFLOW GOTO CHANGE_STATE
CHANGE_STATE:
INCFSZ CCPR1L
GOTO MAIN
CHANGE_STATE_0:
DECFSZ CCPR1L
GOTO MAIN
DELAY
;9993 CYCLES
MOVLW 0xCE
MOVWF D1
MOVLW 0x08
MOVWF D2
DELAY_0
DECFSZ D1, F
GOTO $ + 2
DECFSZ D2, F
GOTO DELAY_0
;3 CYCLES
GOTO $ + 1
NOP
RETURN
END