You are on page 1of 4

;AGV runs forward a fixed distance, makes turns, and returns-looping continuousl

y.
;clock is 4MHz
list p=16F873A
#include p=16f873A.inc
;set Configuration Word:crystal oscillator HS, WDT off,
;power-up timer on, code protect off, LV Program off,
_CONFIG_HS_OSC&_WDT_OFF&_PWRTE_ON&_LPV_OFF
;Specify RAM
delcntr1 equ 20 ;used in delays5 & delayADC SRs
delcntr2 equ 21
flags equ 29 ;0 if L motor has completed, 1 for rt motor
;Specify some port bits
;For Port A
mot_en_rt equ 2 ;motor enable right
mot_en_left equ 5 ;motor enable left
;For Port B
sounder equ 1 ;piezo electric sounder
us_rt equ 6 ;right microswitch
us_left equ 7 ;left microswitch
;For PortC
mot_left equ 1 ;left motor PWM op
mot_rt equ 2 ;right motor PWM op
mot_rt equ 5 ;diagnostic led
led_rt equ 6 ;diagnostic led
mode equ 7 ;mode switch
org 00
;initialise
;set up SFRs in Bank 1
bcf status,rp1
bsf status,rp0 ;
movlw B'00011011' ;
movwf trisa
movlw B'11001000'
movwf trisb ;
movlw B'010001000'
movwf adcon1 ;
movlw B'11101000' ;
movwf option_reg
movlw D'250' ;
movwf pr2
;set up SFRs in Bank 0
bcf status,rp0 ;
movlw B'00000011' ;
movwf t1con ;
movlw B'00000100' ;
movwf t2con
movlw B'00001100' ;
movwf ccp1con
movwf ccp2con
;
;Switch all outputs off
clrf porta
clrf portb
clrf portc
;diagnostic, flash leds
bsf portc,6
bsf portc,5
call delay500
bcf portc,6
bcf portc,5
bsf portb,2
;*******************************************************************************
****
;run forward fixed distance, then turn and return
;*******************************************************************************
****
opto_mov clrf tmr0
clrf tmr1l
clrf tmr1h
clrf flags
btfss portc,0 ;
incf tmr1l
call leftmot-fwd ;
call rtmot_fwd
opto_loop call opto_to_led ;
movlw D'91' ;
subwf tmr0'0
btfsc status,z
bcf porta,mot_en_left;
movlw D'91'
subwf tmr1l,0
btfsc status,z
bcf porta,mot_en_rt
;if both motors stopped, proceed to turn, otherwise loop
btfsc porta,mot_en_left
goto opto_loop
btfsc porta,mot_en_rt
goto opto_loop
;now turn
call delay500 ;
movlw 00
movwf tmr1l
btfss portc,0 ;
incf tmr1l
call leftmot_fwd ;
call rtmot_rev
;turn
opt_loop1 call optp_to_led ;
;rotate
movlw D'23' ;
subwf tmr0,0
btfsc status,z
bcf porta,mot_en_left;
movlw D'23'
subwf tmr1l,0
btfsc status,z
bcf port,mot_en_rt
;if both motors stopped, proceed to straight line, otherwise loop
btfsc porta,mot_en_left
goto opt_loop1
btfsc porta,mot_en_rt
goto opt_loop1
call dlay500
goto opto_move
;*******************************************************************************
*************
;SUBROUTINES
;*******************************************************************************
*************
;introduces delay of 1ms approx
delay1 movlw D'250' ;
movwf delcntr1,1
del1 nop
decfsz delcntr1,1
goto del1
return
;
;500ms delay(approx) ;
delay500 movlw D'250'
movwf delcntr2
del5 call delay1
call delay1
decfsz delcntr2,1
goto del5
return
;set motors running fixed(modest)speed
leftmot_fwd ;
bsf porta,mot_en_left
movlw D'190'
movwf CCPR2L
return
rtmot_fwd bsf porta,mot_en_rt
movlw D'190'
movwf CCPR1L
return
leftmot_rev bsf port,mot_en_left
movlw D'60'
movwf CCPR2L
return
rtmot_rev bsf porta.mot_en_rt
movlw D'60@
movwf CCPR1L
return
opto_to_led bsf portc,led\-left ;
btfss porta,4
bsf portc,led_left ;
bcf portc.led_rt ;
btfss portc,0
return
end

You might also like