LIST P= 16F84A INCLUDE "P16F84A.INC" RADIX DEC ORG 0X0000 CLRF STATUS GOTO PROGRAM_START AUX1_H EQU 0XC AUX1_L EQU 0XD AUX2_H EQU 0XE AUX2_L EQU 0XF AUX EQU 0X10 S0 EQU 0X11 S1 EQU 0X12 S2 EQU 0X13 IN1 EQU 0X14 IN2 EQU 0X15 IN3 EQU 0X16 SPOS1 EQU 0X17 SPOS EQU 0X18 TOP EQU 0X19 BOTTOM EQU 0X1A TCNT EQU 0X1B RATE EQU 0X1C I EQU 0X1D RATE2X EQU 0X1E CENTER EQU 0X1F SDIR1 EQU 0X20 SDIR2 EQU 0X21 LT EQU 0X22 GREU8 BCF STATUS, RP0 MOVF AUX1_L, W SUBWF AUX, W BTFSC STATUS, C GOTO GREU8_CLEAR_W BTFSC STATUS, Z GOTO GREU8_CLEAR_W MOVLW 0X01 MOVWF AUX RETLW 0 GREU8_CLEAR_W CLRF AUX RETLW 0 LESU8 BCF STATUS, RP0 MOVF AUX1_L, W SUBWF AUX, W BTFSS STATUS, C GOTO LESU8_CLEAR_W BTFSC STATUS, Z GOTO LESU8_CLEAR_W MOVLW 0X01 MOVWF AUX RETLW 0 LESU8_CLEAR_W CLRF AUX RETLW 0 EQU8 BCF STATUS, RP0 MOVF AUX1_L, W SUBWF AUX, W BTFSS STATUS, Z GOTO EQU8_CLEAR_W MOVLW 0X01 MOVWF AUX RETLW 0 EQU8_CLEAR_W CLRF AUX RETLW 0 PROGRAM_START ; SPOS1: SECOND SERVO POSITION (FIRE) ; SPOS: FIRST SERVO POSITION (ELEVATION) ; RATE: ADJUSTS THE RATE SERVO 1 (ELEVATION) MOVES ; RA0 IS SERVO 1 UP, RA1 IS SERVO 1 DOWN, RA2 IS SERVO 2 (FIRE) ; RB0 IS SERVO 1 OUTPUT, RB1 IS SERVO 2 OUTPUT ; 250 LOOPS = 2MS, 130 LOOPS = 1MS, 190 LOOPS = 1.5MS ; MOVLW 190 MOVWF CENTER MOVLW 250 MOVWF TOP MOVLW 120 MOVWF BOTTOM CLRF TCNT MOVF CENTER, W MOVWF SPOS CLRF LT MOVLW B'00111' BSF STATUS, RP0 MOVWF TRISA MOVLW B'01110000' MOVWF TRISB BCF STATUS, RP0 BCF PORTB, 1 BCF PORTB, 0 ; READ PINS TO DETERMINE SERVO ROTATE DIRECTIONS SDIR1=ELEVATION SDIR2=FIRE MOVLW 0 BTFSS PORTB, 4 GOTO IOLAB1 MOVLW 1 IOLAB1 BCF STATUS, RP0 MOVWF SDIR1 MOVLW 0 BTFSS PORTB, 5 GOTO IOLAB2 MOVLW 1 IOLAB2 BCF STATUS, RP0 MOVWF SDIR2 ; SELECT SLOW OR FAST RATE FOR THE ELEVATION SERVO MOVLW 0 BTFSS PORTB, 6 GOTO IOLAB3 MOVLW 1 IOLAB3 BCF STATUS, RP0 MOVWF RATE2X MOVF RATE2X, W MOVWF S1 MOVLW 0 MOVWF AUX MOVF S1, W MOVWF AUX1_L CALL EQU8 BCF STATUS, RP0 MOVF AUX, W BTFSS AUX, 0 GOTO ENDIFLAB4 MOVLW 1 MOVWF RATE GOTO ELSELAB4 ENDIFLAB4 BCF STATUS, RP0 MOVLW 3 MOVWF RATE ELSELAB4 BCF STATUS, RP0 MOVF SDIR2, W MOVWF S1 MOVLW 0 MOVWF AUX MOVF S1, W MOVWF AUX1_L CALL EQU8 BCF STATUS, RP0 MOVF AUX, W BTFSS AUX, 0 GOTO ENDIFLAB5 MOVF TOP, W MOVWF SPOS1 GOTO ELSELAB5 ENDIFLAB5 BCF STATUS, RP0 MOVF BOTTOM, W MOVWF SPOS1 ELSELAB5 BCF STATUS, RP0 MAIN BCF STATUS, RP0 ; READ THE ELEVATION INPUT MOVF SDIR1, W MOVWF S1 MOVLW 0 MOVWF AUX MOVF S1, W MOVWF AUX1_L CALL EQU8 BCF STATUS, RP0 MOVF AUX, W BTFSS AUX, 0 GOTO ENDIFLAB6 MOVLW 0 BTFSS PORTA, 0 GOTO IOLAB7 MOVLW 1 IOLAB7 BCF STATUS, RP0 MOVWF IN1 MOVLW 0 BTFSS PORTA, 1 GOTO IOLAB8 MOVLW 1 IOLAB8 BCF STATUS, RP0 MOVWF IN2 GOTO ELSELAB6 ENDIFLAB6 BCF STATUS, RP0 MOVLW 0 BTFSS PORTA, 0 GOTO IOLAB9 MOVLW 1 IOLAB9 BCF STATUS, RP0 MOVWF IN2 MOVLW 0 BTFSS PORTA, 1 GOTO IOLAB10 MOVLW 1 IOLAB10 BCF STATUS, RP0 MOVWF IN1 ELSELAB6 BCF STATUS, RP0 ; READ THE FIRE INPUT MOVLW 0 BTFSS PORTA, 2 GOTO IOLAB11 MOVLW 1 IOLAB11 BCF STATUS, RP0 MOVWF IN3 MOVLW 13;* MOVWF AUX1_H DELAYLAB212;* MOVLW 74;* MOVWF AUX1_L;* DELAYLAB112;* DECFSZ AUX1_L, F;* GOTO DELAYLAB112;* DECFSZ AUX1_H, F;* GOTO DELAYLAB212;* NOP;* NOP;* NOP;* NOP;* NOP;* NOP;* NOP;* NOP;* NOP;* MOVF SDIR1, W MOVWF S1 MOVLW 0 MOVWF AUX MOVF S1, W MOVWF AUX1_L CALL EQU8 BCF STATUS, RP0 MOVF AUX, W MOVWF S1 MOVF IN1, W MOVWF S2 MOVLW 1 MOVWF AUX MOVF S2, W MOVWF AUX1_L CALL EQU8 BCF STATUS, RP0 MOVF AUX, W MOVF S1, W ANDWF AUX, F BTFSS AUX, 0 GOTO ENDIFLAB13 MOVLW 0 BTFSS PORTA, 0 GOTO IOLAB14 MOVLW 1 IOLAB14 BCF STATUS, RP0 MOVWF IN1 ENDIFLAB13 BCF STATUS, RP0 MOVF SDIR1, W MOVWF S1 MOVLW 0 MOVWF AUX MOVF S1, W MOVWF AUX1_L CALL EQU8 BCF STATUS, RP0 MOVF AUX, W MOVWF S1 MOVF IN2, W MOVWF S2 MOVLW 1 MOVWF AUX MOVF S2, W MOVWF AUX1_L CALL EQU8 BCF STATUS, RP0 MOVF AUX, W MOVF S1, W ANDWF AUX, F BTFSS AUX, 0 GOTO ENDIFLAB15 MOVLW 0 BTFSS PORTA, 1 GOTO IOLAB16 MOVLW 1 IOLAB16 BCF STATUS, RP0 MOVWF IN2 ENDIFLAB15 BCF STATUS, RP0 MOVF SDIR1, W MOVWF S1 MOVLW 1 MOVWF AUX MOVF S1, W MOVWF AUX1_L CALL EQU8 BCF STATUS, RP0 MOVF AUX, W MOVWF S1 MOVF IN2, W MOVWF S2 MOVLW 1 MOVWF AUX MOVF S2, W MOVWF AUX1_L CALL EQU8 BCF STATUS, RP0 MOVF AUX, W MOVF S1, W ANDWF AUX, F BTFSS AUX, 0 GOTO ENDIFLAB17 MOVLW 0 BTFSS PORTA, 0 GOTO IOLAB18 MOVLW 1 IOLAB18 BCF STATUS, RP0 MOVWF IN2 ENDIFLAB17 BCF STATUS, RP0 MOVF SDIR1, W MOVWF S1 MOVLW 1 MOVWF AUX MOVF S1, W MOVWF AUX1_L CALL EQU8 BCF STATUS, RP0 MOVF AUX, W MOVWF S1 MOVF IN1, W MOVWF S2 MOVLW 1 MOVWF AUX MOVF S2, W MOVWF AUX1_L CALL EQU8 BCF STATUS, RP0 MOVF AUX, W MOVF S1, W ANDWF AUX, F BTFSS AUX, 0 GOTO ENDIFLAB19 MOVLW 0 BTFSS PORTA, 1 GOTO IOLAB20 MOVLW 1 IOLAB20 BCF STATUS, RP0 MOVWF IN1 ENDIFLAB19 BCF STATUS, RP0 MOVF IN1, W MOVWF S1 MOVF TOP, W MOVWF S2 MOVF SPOS, W MOVWF AUX MOVF S2, W MOVWF AUX1_L CALL LESU8 BCF STATUS, RP0 MOVLW 1 XORWF AUX, F MOVF AUX, W MOVF S1, W ANDWF AUX, F BTFSS AUX, 0 GOTO ENDIFLAB21 ; INCREMENT SERVO 1 UPWARD MOVF SPOS, W MOVWF S1 MOVF RATE, W ADDWF S1, W MOVWF SPOS ENDIFLAB21 BCF STATUS, RP0 MOVF IN2, W MOVWF S1 MOVF BOTTOM, W MOVWF S2 MOVF SPOS, W MOVWF AUX MOVF S2, W MOVWF AUX1_L CALL GREU8 BCF STATUS, RP0 MOVLW 1 XORWF AUX, F MOVF AUX, W MOVF S1, W ANDWF AUX, F BTFSS AUX, 0 GOTO ENDIFLAB22 ; DECREMENT SERVO 1 DOWNWARD MOVF SPOS, W MOVWF S1 MOVF RATE, W SUBWF S1, W MOVWF SPOS ENDIFLAB22 BCF STATUS, RP0 MOVF IN3, W MOVWF S1 MOVF TCNT, W MOVWF S2 MOVLW 0 MOVWF AUX MOVF S2, W MOVWF AUX1_L CALL EQU8 BCF STATUS, RP0 MOVF AUX, W MOVF S1, W ANDWF AUX, F BTFSS AUX, 0 GOTO ENDIFLAB23 ; MOVE SERVO 2 TO FIRE MOVLW 20 MOVWF TCNT MOVF SDIR2, W MOVWF S1 MOVLW 0 MOVWF AUX MOVF S1, W MOVWF AUX1_L CALL EQU8 BCF STATUS, RP0 MOVF AUX, W BTFSS AUX, 0 GOTO ENDIFLAB24 MOVF BOTTOM, W MOVWF SPOS1 GOTO ELSELAB24 ENDIFLAB24 BCF STATUS, RP0 MOVF TOP, W MOVWF SPOS1 ELSELAB24 BCF STATUS, RP0 ENDIFLAB23 BCF STATUS, RP0 MOVF TCNT, W MOVWF S1 MOVLW 0 MOVWF AUX MOVF S1, W MOVWF AUX1_L CALL GREU8 BCF STATUS, RP0 MOVF AUX, W BTFSS AUX, 0 GOTO ENDIFLAB25 ; COUNT THE LOOPS FOR THE FIRE SERVO TO WAIT BEFORE CYCLING BACK... DECF TCNT, F GOTO ELSELAB25 ENDIFLAB25 BCF STATUS, RP0 ; RETURN THE FIRE SERVO TO REST POSITION MOVF SDIR2, W MOVWF S1 MOVLW 0 MOVWF AUX MOVF S1, W MOVWF AUX1_L CALL EQU8 BCF STATUS, RP0 MOVF AUX, W BTFSS AUX, 0 GOTO ENDIFLAB26 MOVF TOP, W MOVWF SPOS1 GOTO ELSELAB26 ENDIFLAB26 BCF STATUS, RP0 MOVF BOTTOM, W MOVWF SPOS1 ELSELAB26 BCF STATUS, RP0 ELSELAB25 BCF STATUS, RP0 ; SET RB0 HIGH BSF PORTB, 0 ; KEEP THE PULSE HIGH FOR THE TIME SPECIFIED BY SPOS MOVLW 1 MOVWF I AUXLAB27 BCF STATUS, RP0 MOVF SPOS, W SUBWF I, W BTFSC STATUS, Z GOTO NEXTLAB27 INCF I, F GOTO AUXLAB27 NEXTLAB27 BCF STATUS, RP0 ; SET RB0, SERVO1, BACK LOW BCF PORTB, 0 ; SET RB1 HIGH AND KEEP IT HIGH FOR THE TIME SPECIFIED BY SPOS1 BSF PORTB, 1 MOVLW 1 MOVWF I AUXLAB28 BCF STATUS, RP0 MOVF SPOS1, W SUBWF I, W BTFSC STATUS, Z GOTO NEXTLAB28 INCF I, F GOTO AUXLAB28 NEXTLAB28 BCF STATUS, RP0 ; SET RB1, SERVO 2, LOW BCF PORTB, 1 ; DELAY FOR THE APPROPRIATE TIME PERIOD (NO LONGER THAN 20MS) BEFORE STARTING OVER MOVLW 28;* MOVWF AUX1_H DELAYLAB229;* MOVLW 175;* MOVWF AUX1_L;* DELAYLAB129;* DECFSZ AUX1_L, F;* GOTO DELAYLAB129;* DECFSZ AUX1_H, F;* GOTO DELAYLAB229;* ; FLASH THE STATUS LED MOVF LT, W MOVWF S1 MOVLW 90 MOVWF AUX MOVF S1, W MOVWF AUX1_L CALL EQU8 BCF STATUS, RP0 MOVF AUX, W BTFSS AUX, 0 GOTO ENDIFLAB30 CLRF LT GOTO ELSELAB30 ENDIFLAB30 BCF STATUS, RP0 INCF LT, F ELSELAB30 BCF STATUS, RP0 MOVF LT, W MOVWF S1 MOVLW 85 MOVWF AUX MOVF S1, W MOVWF AUX1_L CALL GREU8 BCF STATUS, RP0 MOVF AUX, W MOVWF S1 MOVF LT, W MOVWF S2 MOVLW 90 MOVWF AUX MOVF S2, W MOVWF AUX1_L CALL LESU8 BCF STATUS, RP0 MOVF AUX, W MOVF S1, W ANDWF AUX, F BTFSS AUX, 0 GOTO ENDIFLAB31 BCF PORTB, 3 GOTO ELSELAB31 ENDIFLAB31 BCF STATUS, RP0 BSF PORTB, 3 ELSELAB31 BCF STATUS, RP0 GOTO MAIN END