Hi all,I tried running this program below and program succesfully but I could not get the LED to light up on my hardware. Apparently there are no output voltage from the Pic to LED when I check with a multimeter,but there is input though and everything seems to work fine except the LED.Is there something wrong with my software??
List p=p16f873a ; Set target Processor to P16F873
Include p16f873a.inc ; Include additional source file
ERRORLEVEL -302
;__CONFIG _HS_OSC & _CP_OFF & _WDT_OFF & _PWRTE_ON
; ***** Main Program *****
speed equ d'8' ;Reference speed ;(5x8/256=0.156V)
change equ d'1' ;Change value (10mV/ms)
led equ 0x20 ;LED control data address
status equ 0x83
trisa equ 0x85 ;Set TrisA register
trisb equ 0x86 ;Set TrisB register
trisc equ 0x87 ;Set TrisC register
adcon0 equ 0x1f
tmr2 equ 0x11
ccpr1l equ 0x15
pr2 equ 0x92
t2con equ 0x12
ccp1con equ 0x17
tmr1h equ 0x0f
tmr1l equ 0x0e
ccpr2h equ 0x1c
ccpr2l equ 0x1b
t1con equ 0x10
ccp2con equ 0x1d
intcon equ 0x8b
pir2 equ 0x0d
t2con equ 0x12
adresh equ 0x1e
portb equ 0x06
adcon1 equ 0x9f
pie2 equ 0x8d
z equ 0
rp0 equ 0x03
c equ 0
go equ 0
; ***** Program Start *****
org 0 ;Reset Vector
goto init
org 4 ;Interrupt Vector
goto int
; ***** Initial Process *****
init
; ***** Port initialization*****
bsf status,rp0 ;Select to Bank1
movlw b'00000001' ;Select Port A to input mode
movwf trisa ;Set TRISA register
clrf trisb ;Set Port B to output mode
clrf trisc ;Set TRISC to output mode
bcf status,rp0 ;Change to Bank0
; ***** A/D converter initialization*****
movlw b'10000001' ;Setup ADC
movwf adcon0 ;Set ADCON0 register
bsf status,rp0 ; Select to Bank1
movlw b'00001110' ;ADFM=0 PCFG=1110
movwf adcon1 ;Set ADCON1 register
bcf status,rp0 ;Change to Bank0
; ***** PWM initialization*****
clrf tmr2 ;Clear TMR2 register
movlw b'11111111' ;Max duty (low speed)
movwf ccpr1l ;Set CCPR1L register
bsf status,rp0 ;Change to Bank1
movlw d'255' ;Period=1638.4usec(610Hz)
movwf pr2 ;Set PR2 register
bcf status,rp0 ;Change to Bank0
movlw b'00000110' ; I/O pin selection
movwf t2con ;Set T2CON register
movlw b'00001100' ; Ser PWM mode
movwf ccp1con ;Set CCP1CON register
; ***** Interruption control*****
bsf status,rp0 ;Change to Bank1
movlw b'00000001' ;CCP2IE=Enable
movwf pie2 ;Set PIE2 register
bcf status,rp0 ;Change to Bank0
movlw b'11000000' ;GIE=ON PEIE=ON
movwf intcon ;Set INTCON register
wait
goto $ ;Interruption wait
; ***** Interruption Process *****
int
clrf pir2 ;Clear interruption flag
ad_check
btfsc adcon0,go ;Check if completed A/D conversion?
goto ad_check ;If no repeat ad_check else proceed.
movfw adresh ;Read ADRESH register
sublw speed ;Ref speed - Detect speed
btfsc status,c ;Is speed lesser?
goto check1 ;If no go to check1,if yes proceed.
; ***** control to low speed *****
movfw ccpr1l ;Read CCPR1L register
addlw change ;Change value + CCPR1L
btfss status,c ;Overflow ?
movwf ccpr1l ;Write CCPR1L
goto led_cont ;Jump to LED control
check1
btfsc status,z ;Reference speed = Detect speed ?
goto led_cont ;Yes. Jump to LED control
; ***** control to fast speed *****
movlw change ;Set change value
subwf ccpr1l,f ;CCPR1L - Change value
btfsc status,c ;Underflow ?
goto led_cont ;If no check again,else go to LED control
clrf ccpr1l ;Clear CCPR1L
; ****** LED control Process *******
led_cont
comf ccpr1l,w ;Complement CCPR1L bit
movwf led ;Save LED data
movlw b'0001000' ;Set compare data
subwf led,w ;LED - data
btfsc status,c ;Check status of LED
goto led1 ;proceed to LED1
movlw b'0000000' ;Set LED control data
goto int_end ;Go to interrupt end
led1 movlw b'0011000' ;Set compare data
subwf led,w ;LED - data
btfsc status,c ;Check status of LED?
goto led2 ;Proceed to LED2
movlw b'0011000' ;Set LED control data
goto int_end ; Go to interrupt end
led2 movlw b'1101110' ;Set compare data
subwf led,w ;LED - data
btfsc status,c ;Check status of LED?
goto led3 ;Proceed to LED3
movlw b'1101110' ;Set LED control data
goto int_end ; Go to interrupt end
led3 movlw b'0111110' ;Set compare data
subwf led,w ;LED - data
btfsc status,c ; Check status of LED?
goto led4 ; Proceed to LED4.
movlw b'0111110' ;Set LED control data
goto int_end ; Go to interrupt end
led4 movlw b'0011011' ;Set compare data
subwf led,w ;LED - data
btfsc status,c ;Check status of LED ?
goto led5 ;Proceed to LED5.
movlw b'0011011' ;Set LED control data
goto int_end ;Go to interrupt end
led5 movlw b'0110111' ;Set compare data
subwf led,w ;LED - data
btfsc status,c ; Check status of LED ?
goto led6 ; Proceed to LED6
movlw b'0110111' ;Set LED control data
goto int_end ; Go to interrupt end
led6 movlw b'1110111' ;Set compare data
subwf led,w ;LED - data
btfsc status,c ; Check status of LED ?
goto led7 ; Proceed to LED7
movlw b'1110111' ;Set LED control data
goto int_end ; Go to interrupt end
led7 movlw b'0011100' ;Set compare data
subwf led,w ;LED - data
btfsc status,c ; Check status of LED ?
goto led8 ; Proceed to LED8
movlw b'0011100' ;Set LED control data
goto int_end ; Go to interrupt end
led8 movlw b'1111111' ;Set LED control data
;************ END of Interruption Process **************
int_end
movwf portb ;Set PORTB
retfie ;Comes out of the interrupt routine
end
List p=p16f873a ; Set target Processor to P16F873
Include p16f873a.inc ; Include additional source file
ERRORLEVEL -302
;__CONFIG _HS_OSC & _CP_OFF & _WDT_OFF & _PWRTE_ON
; ***** Main Program *****
speed equ d'8' ;Reference speed ;(5x8/256=0.156V)
change equ d'1' ;Change value (10mV/ms)
led equ 0x20 ;LED control data address
status equ 0x83
trisa equ 0x85 ;Set TrisA register
trisb equ 0x86 ;Set TrisB register
trisc equ 0x87 ;Set TrisC register
adcon0 equ 0x1f
tmr2 equ 0x11
ccpr1l equ 0x15
pr2 equ 0x92
t2con equ 0x12
ccp1con equ 0x17
tmr1h equ 0x0f
tmr1l equ 0x0e
ccpr2h equ 0x1c
ccpr2l equ 0x1b
t1con equ 0x10
ccp2con equ 0x1d
intcon equ 0x8b
pir2 equ 0x0d
t2con equ 0x12
adresh equ 0x1e
portb equ 0x06
adcon1 equ 0x9f
pie2 equ 0x8d
z equ 0
rp0 equ 0x03
c equ 0
go equ 0
; ***** Program Start *****
org 0 ;Reset Vector
goto init
org 4 ;Interrupt Vector
goto int
; ***** Initial Process *****
init
; ***** Port initialization*****
bsf status,rp0 ;Select to Bank1
movlw b'00000001' ;Select Port A to input mode
movwf trisa ;Set TRISA register
clrf trisb ;Set Port B to output mode
clrf trisc ;Set TRISC to output mode
bcf status,rp0 ;Change to Bank0
; ***** A/D converter initialization*****
movlw b'10000001' ;Setup ADC
movwf adcon0 ;Set ADCON0 register
bsf status,rp0 ; Select to Bank1
movlw b'00001110' ;ADFM=0 PCFG=1110
movwf adcon1 ;Set ADCON1 register
bcf status,rp0 ;Change to Bank0
; ***** PWM initialization*****
clrf tmr2 ;Clear TMR2 register
movlw b'11111111' ;Max duty (low speed)
movwf ccpr1l ;Set CCPR1L register
bsf status,rp0 ;Change to Bank1
movlw d'255' ;Period=1638.4usec(610Hz)
movwf pr2 ;Set PR2 register
bcf status,rp0 ;Change to Bank0
movlw b'00000110' ; I/O pin selection
movwf t2con ;Set T2CON register
movlw b'00001100' ; Ser PWM mode
movwf ccp1con ;Set CCP1CON register
; ***** Interruption control*****
bsf status,rp0 ;Change to Bank1
movlw b'00000001' ;CCP2IE=Enable
movwf pie2 ;Set PIE2 register
bcf status,rp0 ;Change to Bank0
movlw b'11000000' ;GIE=ON PEIE=ON
movwf intcon ;Set INTCON register
wait
goto $ ;Interruption wait
; ***** Interruption Process *****
int
clrf pir2 ;Clear interruption flag
ad_check
btfsc adcon0,go ;Check if completed A/D conversion?
goto ad_check ;If no repeat ad_check else proceed.
movfw adresh ;Read ADRESH register
sublw speed ;Ref speed - Detect speed
btfsc status,c ;Is speed lesser?
goto check1 ;If no go to check1,if yes proceed.
; ***** control to low speed *****
movfw ccpr1l ;Read CCPR1L register
addlw change ;Change value + CCPR1L
btfss status,c ;Overflow ?
movwf ccpr1l ;Write CCPR1L
goto led_cont ;Jump to LED control
check1
btfsc status,z ;Reference speed = Detect speed ?
goto led_cont ;Yes. Jump to LED control
; ***** control to fast speed *****
movlw change ;Set change value
subwf ccpr1l,f ;CCPR1L - Change value
btfsc status,c ;Underflow ?
goto led_cont ;If no check again,else go to LED control
clrf ccpr1l ;Clear CCPR1L
; ****** LED control Process *******
led_cont
comf ccpr1l,w ;Complement CCPR1L bit
movwf led ;Save LED data
movlw b'0001000' ;Set compare data
subwf led,w ;LED - data
btfsc status,c ;Check status of LED
goto led1 ;proceed to LED1
movlw b'0000000' ;Set LED control data
goto int_end ;Go to interrupt end
led1 movlw b'0011000' ;Set compare data
subwf led,w ;LED - data
btfsc status,c ;Check status of LED?
goto led2 ;Proceed to LED2
movlw b'0011000' ;Set LED control data
goto int_end ; Go to interrupt end
led2 movlw b'1101110' ;Set compare data
subwf led,w ;LED - data
btfsc status,c ;Check status of LED?
goto led3 ;Proceed to LED3
movlw b'1101110' ;Set LED control data
goto int_end ; Go to interrupt end
led3 movlw b'0111110' ;Set compare data
subwf led,w ;LED - data
btfsc status,c ; Check status of LED?
goto led4 ; Proceed to LED4.
movlw b'0111110' ;Set LED control data
goto int_end ; Go to interrupt end
led4 movlw b'0011011' ;Set compare data
subwf led,w ;LED - data
btfsc status,c ;Check status of LED ?
goto led5 ;Proceed to LED5.
movlw b'0011011' ;Set LED control data
goto int_end ;Go to interrupt end
led5 movlw b'0110111' ;Set compare data
subwf led,w ;LED - data
btfsc status,c ; Check status of LED ?
goto led6 ; Proceed to LED6
movlw b'0110111' ;Set LED control data
goto int_end ; Go to interrupt end
led6 movlw b'1110111' ;Set compare data
subwf led,w ;LED - data
btfsc status,c ; Check status of LED ?
goto led7 ; Proceed to LED7
movlw b'1110111' ;Set LED control data
goto int_end ; Go to interrupt end
led7 movlw b'0011100' ;Set compare data
subwf led,w ;LED - data
btfsc status,c ; Check status of LED ?
goto led8 ; Proceed to LED8
movlw b'0011100' ;Set LED control data
goto int_end ; Go to interrupt end
led8 movlw b'1111111' ;Set LED control data
;************ END of Interruption Process **************
int_end
movwf portb ;Set PORTB
retfie ;Comes out of the interrupt routine
end