You are on page 1of 5

pwm led fade/PWM_LED_FADE.

asm

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;Copyright (c) 2013 Manolis Agkopian ;

;See the file LICENCE for copying permission. ;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

; THE FOLLOWING STEPS SHOULD BE TAKEN WHEN CONFIGURING THE CCP MODULE FOR
PWM OPERATION: ;

; ;

; 1. SET THE PWM PERIOD BY WRITING TO THE PR2 REGISTER. ;

; 2. SET THE PWM DUTY CYCLE BY WRITING TO THE CCPR1L REGISTER AND CCP1CON<5:4>
BITS. ;

; 3. MAKE THE CCP1 PIN AN OUTPUT BY CLEARING THE TRISC<2> BIT. ;

; 4. SET THE TMR2 PRESCALE VALUE AND ENABLE TIMER2 BY WRITING TO T2CON. ;

; 5. CONFIGURE THE CCP1 MODULE FOR PWM OPERATION. ;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

PROCESSOR '16F876A'

INCLUDE <P16F876A.INC>

__CONFIG _XT_OSC & _WDT_OFF & _PWRTE_OFF & _CP_OFF & _LVP_OFF & _BODEN_OFF

CBLOCK 0x20

D1

D2

FADE_STATE ;IF = 0x00 INCREMENT CCPR1L ELSE DECREMENT CCPR1L


ENDC

ORG 0x0000

INIT:

;PWM PERIOD = [(PR2)+1] * 4 * TOSC * (TMR2 PRESCALE VALUE) ;PR2 = TMR2 PERIOD
REGISTER, TOSC = PIC CLOCK PERIOD (FOSC = 1 / TOSC)

;PWM DUTY CYCLE = (CCPR1L:CCP1CON<5:4>) * TOSC * (TMR2 PRESCALE VALUE)

;;;SET PWM FREQUENCY;;;

BSF STATUS, RP0 ;SELECT BANK 01

MOVLW D'128' ;SET PR2 TO 128 DECIMAL SO THE PWM PERIOD = 2064uS => PWM
FREQUENCY = 484Hz

MOVWF PR2

BCF STATUS, RP0 ;SELECT BANK 00

;;;SET PWM STARTING DUTY CYCLE;;;

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

;;;SET PWM PIN TO OUTPUT MODE;;;

BSF STATUS, RP0 ;SELECT BANK 01

BCF TRISC, 2 ;SET RC2 AS OUTPUT, TO USE FOR PWM

BCF STATUS, RP0 ;SELECT BANK 00

;;;SET TIMER 2 PRESCALE VALUE;;;

;PRESCALE = 16 SO THE PWM PERIOD = 2064uS => PWM FREQUENCY = 484Hz


MOVLW B'00000010'

MOVWF T2CON

;;;CLEAR TIMER 2 MODULE;;;

CLRF TMR2

;;;ENABLE TIMER 2 MODULE;;;

BSF T2CON, TMR2ON

CLRF FADE_STATE

MAIN:

CALL DELAY

MOVLW 0x00

IORWF FADE_STATE, W

BTFSS STATUS, Z ;IF FADE_STATE == 0 GOTO INC_CCPR1L

GOTO DEC_CCPR1L ;ELSE GOTO DEC_CCPR1L

INC_CCPR1L:

INCFSZ CCPR1L ;INCREMENT CCPR1L

GOTO MAIN

GOTO CHANGE_STATE_0 ;IF WE HAVE AN OVERFLOW GOTO CHANGE_STATE

DEC_CCPR1L:

DECFSZ CCPR1L ;DECREMENT CCPR1L

GOTO MAIN
;IF WE HAVE AN OVERFLOW GOTO CHANGE_STATE

CHANGE_STATE:

COMF FADE_STATE, F ;TOGLE FADE_STATE BITS

INCFSZ CCPR1L

GOTO MAIN

CHANGE_STATE_0:

COMF FADE_STATE, F ;TOGLE FADE_STATE BITS

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

;4 CYCLES (INCLUDING CALL)

RETURN

END

You might also like