; SOURCE CODE FOR DC MOTOR CONTROL WITH PIC16F877A
; -------------------------------------------------
; PREPARED BY-- SYED TAHMID MAHBUB
; DATED-- 21-04-09
;---------------------------------------------------------------
TITLE: "DC MOTOR CONTROL WITH PIC 16F877A"
LIST P=16F877A
INCLUDE "P16F877A.INC"
__CONFIG H'3F72'
; __CONFIG _HS_OSC & _WDG_OFF & _PWRTE_ON & _CP_OFF
; 10 MHZ EXTERNAL CRYSTAL OSCILLATOR.
;----------------- PROGRAM START -------------------------------------
ORG 0X00 ; RESET VECTOR
GOTO INIT
ORG 0X04 ; INTERRUPT VECTOR
GOTO INTR_SVC
;------------------ INITIAL PROCESS ------------------------------
;-- PORT INITIALIZATION
INIT
BSF STATUS,RP0 ; CHANGE TO BANK 1
MOVLW B'00000001' ; AN0 TO INPUT MODE
MOVWF TRISA ; SET TRISA REGISTER
CLRF TRISC ; MAKING PORTC ALL OUTPUT
BCF STATUS,RP0 ; CHANGE TO BANK0
;--- A/D CONVERTER INITIALIZATION
MOVLW B'10000001' ; FOSC/32,RA0/AN0,ADON=ON
MOVWF ADCON0 ; SET ADCON0 REGISTER
BSF STATUS,RP0 ; CHANGE TO BANK 1
MOVLW B'00001110' ; ADFM=0,PCFG=1110
MOVWF ADCON1 ; SET ADCON1 REGISTER,IN BANK 1
BCF STATUS,RP0 ; FALLING BACK TO BANK 0
;--- PWM INITIALIZATION
CLRF TMR2 ; CLEAR TMR2 REGISTER
CLRF CCPR1L ; CLEAR CCPR1L REGISTER
BSF STATUS,RP0 ; CHANGE TO BANK 1
MOVLW D'255' ; PERIOD = 1638.4USEC(610 HZ)
MOVWF PR2 ; SET PR2 REGISTER,IN BANK 1
BCF STATUS,RP0 ; CHANGE TO BANK 0
MOVLW B'00000110' ; PST=1:1,TMR1=ON,PRE=1:16
MOVWF T2CON ; SET T2CON REGISTER
MOVLW B'00001100' ; CCP1XY=0,CCP1M=1100(PWM)
MOVWF CCP1CON ; SET CCP1CON REGISTER
;--- COMPARE MODE INITIALIZATION
CLRF TMR1H ; CLEAR TMR1H REGISTER
CLRF TMR1L ; CLEAR TMR1L REGISTER
MOVLW 0X09 ; H '9C4'=2500
MOVWF CCPR2H ; SET CCPR2H REGISTER
MOVLW 0XC4 ; 2500 X 0.4 uSEC = 1MSEC
MOVWF CCPR2L ; SET CCPR2L REGISTER
MOVLW B'00000001' ; TMR1= ON
MOVWF T1CON ; SET T1 REGISTER
MOVLW B'00001011' ; SET SPECIAL TRIGGER FOR A/D CONVERSION
MOVWF CCP2CON ; SET CCP2CON REGISTER
;---INTERRUPTION CONTROL
BSF STATUS,RP0
MOVLW B'00000001' ; CCP2IE = ENABLE
MOVWF PIE2 ; SET PIE2 REGISTER
BCF STATUS,RP0
MOVLW B'11000000' ; GIE = ON, PEIE = ON
MOVWF INTCON ; SET INTCON REGISTER
WAIT
GOTO $ ; WAIT FOR INTERRUPTION
;------------------- INTERRUPTION PROCESS --------------------------
INTR_SVC
CLRF PIR2 ; CLEAR INTERRUPTION FLAG
AD_CHECK
BTFSC ADCON0,GO ; A/D CONVERT END?
GOTO AD_CHECK ; NO.CHECK AGAIN
MOVF ADRESH,W ; READ ADRESH REGISTER
MOVWF CCPR1L ; RESET DUTY CYCLE OF PWM
RETFIE
;------------------- END OF INTERRUPTION PROCESS ---------------------
END
;--------------------------------------------------------------------
; END OF THE MOTOR CONTROL PROCESS
;--------------------------------------------------------------------
by Aaron Carman
by Jake Hertz
by Duane Benson
by Jake Hertz