;*****************************************************************************************
;*****************************************************************************************
;** **
;** Header Information **
;** **
;*****************************************************************************************
;*****************************************************************************************
list p=16F628A, r=dec, w=-302
include <P16F628A.INC>
__config _LVP_OFF & _BOREN_OFF & _WDT_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT
;*****************************************************************************************
;*****************************************************************************************
;** **
;** Variable Declarations **
;** **
;*****************************************************************************************
;*****************************************************************************************
cblock 0x20
Count
Count1 ;variables for Delay routines
Count2
Count3
endc
cblock 0x70 ;interrupt handler software stack
W_TEMP
STATUS_TEMP
PCLATH_TEMP
endc
;*****************************************************************************************
;*****************************************************************************************
;** **
;** I/O Pin Declarations **
;** **
;*****************************************************************************************
;*****************************************************************************************
#define BUTTON PORTB,0
#define SERVO PORTB,2
;*****************************************************************************************
;*****************************************************************************************
;** **
;** Reset Vector **
;** **
;*****************************************************************************************
;*****************************************************************************************
org 0x000
goto Start
;*****************************************************************************************
;*****************************************************************************************
;** **
;** Interrupt Handler **
;** **
;*****************************************************************************************
;*****************************************************************************************
org 0x004
movwf W_TEMP ;push W
swapf STATUS,W ;push STATUS
banksel 0 ;bank 0
movwf STATUS_TEMP
movfw PCLATH ;push PCLATH
movwf PCLATH_TEMP
btfsc 0x30,0 ;is backward flag set?
goto Backward ;yes, run servo backward
Forward
movlw 25 ;no, initialize variable 'Count' to decimal 25
movwf Count
bsf SERVO ;RB2 high
movlw 2 ;delay 2mS
call Delay
bcf SERVO
movlw 18
call Delay ;delay for 18ms
decfsz Count,F
goto $-7
bsf 0x30,0 ;set backward flag
goto Release
Backward
movlw d'55'
movwf Count
bsf SERVO ;Delay for 1ms (Counter Clockwise)
call Delay1mS
bcf SERVO
decfsz Count,F
goto $-4
bcf 0x30,0 ;clear backward flag
Release movlw 50
btfss BUTTON ;has button been released?
goto $-1 ;no, check again
call Delay ;yes, debounce
btfss BUTTON ;is button still released?
goto $-5 ;no, loop back and wait again
bcf INTCON,INTF ;clear RB0 interrupt flag
ISRExit movfw PCLATH_TEMP ;pop PCLATH
movwf PCLATH
swapf STATUS_TEMP,W ;pop STATUS
movwf STATUS
swapf W_TEMP,F ;pop W
swapf W_TEMP,W
retfie ;return
;*****************************************************************************************
;*****************************************************************************************
;** **
;** Initialization Routine **
;** **
;*****************************************************************************************
;*****************************************************************************************
Start
movlw 0x07 ;disable on chip comparator
movwf CMCON
clrf PORTA ;PORTA default low (RA5 set high externally via pull up resistor)
clrf PORTB ;PORTB default low
banksel TRISA ;select bank 1
clrf TRISA ;RA0-RA7 outputs, RA5 external master clear (governed by config word setting)
movlw b'00000001'
movwf TRISB ;Make TRISB all outputs except RB0
movlw b'00010001' ;RB weak internal pull ups on, interrupt on falling edge of RB0/INT
movwf OPTION_REG ;Timer 0 Clock source = Tcy, 1:4 prescale
banksel PORTA ;Select Bank 0
bcf INTCON,INTF ;clear RB0 external interrupt flag
bsf INTCON,INTE ;enable RB0 interrupt
bsf INTCON,GIE ;enable unmasked interrupts
;*****************************************************************************************
;*****************************************************************************************
;** **
;** Main Program **
;** **
;*****************************************************************************************
;*****************************************************************************************
sleep ;sleep while INT0 = 1
nop
goto $-2 ;place PIC in sleep mode upon return from interrupt
;*****************************************************************************************
;*****************************************************************************************
;** **
;** Delay Routines **
;** **
;*****************************************************************************************
;*****************************************************************************************
Delay1mS clrf TMR0
bcf INTCON,T0IF
btfss INTCON,T0IF
goto $-1
return
Delay movwf Count1
call Delay1mS
decfsz Count1,F
goto $-2
return
end