; WinPicProg BASIC Compiler Version1.9
;
; Device 16F876
LIST P=16F876, W=2, X=ON, R=DEC
#INCLUDE P16F876.INC
__CONFIG 0x393A
;Flags register bit definitions
LEADZ EQU 0x00 ;set to show leading zeros
Lo EQU 0x05 ;set for I2C normal addressing
Hi EQU 0x06 ;set for I2C extended addressing
Err EQU 0x07 ;set for I2C error
;Pre-defined variables
TEMP1 EQU 32
TEMP2 EQU 33
RESTORE EQU 34
TEMP1_DU EQU 35
TEMP2_DU EQU 36
RESTORE_DU EQU 37
W_DU EQU 38
STATUS_DU EQU 39
Bit_Cntr EQU 40
Xmit_Byte EQU 41
Rcv_Byte EQU 42
LCD_DAT1 EQU 43
Delay_Count EQU 44
_N EQU 44
LCD_DAT2 EQU 45
LCD_DAT3 EQU 46
TEMP_LCD EQU 47
TEMP_LCD2 EQU 48
DELAY1 EQU 49
state EQU 50
pin EQU 51
hiRnd EQU 52
lowRnd EQU 53
Acc1L EQU 54
Acc1H EQU 55
Acc2L EQU 56
Acc2H EQU 57
Acc3L EQU 58
Acc3H EQU 59
Flags EQU 60
TenK EQU 61
Thou EQU 62
Hund EQU 63
Tens EQU 64
Ones EQU 65
Adr_Lo EQU 66
Adr_Hi EQU 67
Chip_Adr EQU 68
Data_Page EQU 69
ORG 0x00
GOTO _START1
ORG 0x010
#INCLUDE HANDLERS.INC
#INCLUDE MATHS.INC
_START1
CLRF RESTORE
CLRF Flags
BCF Flags, LEADZ
BANKSEL ADCON1
MOVLW 0x06
MOVWF ADCON1
BANKSEL PORTA
; Dim Speed, Steer, C, Dead, Left, Right, Error
VAR2 EQU 70;Speed
VAR4 EQU 72;Steer
VAR6 EQU 74;C
VAR8 EQU 76;Dead
VAR10 EQU 78;Left
VAR12 EQU 80;Right
VAR14 EQU 82;Error
; Freq=20
; Oscillator frequency set to 20MHz
; Define PortC=%00000000
BANKSEL TRISC
MOVLW 0
MOVWF TRISC
BANKSEL PORTC
; Define PortB=%11111111
BANKSEL TRISB
MOVLW 255
MOVWF TRISB
BANKSEL PORTB
; Define PortA=%11111111
BANKSEL TRISA
MOVLW 255
MOVWF TRISA
BANKSEL PORTA
; Dead=30
MOVLW 0
MOVWF VAR8+1
MOVLW 30
MOVWF VAR8
; Set(CCP1=PWM)
MOVF CCP1CON,W
ANDLW 0xF0
IORLW 0x0C
MOVWF CCP1CON
; Set(CCP2=PWM)
MOVF CCP2CON,W
ANDLW 0xF0
IORLW 0x0C
MOVWF CCP2CON
; PERIOD_REG=249
MOVLW 249
BANKSEL PR2
MOVWF PR2
BANKSEL TMR2
; Set(TIMER2_PRESCALER=1)
MOVF T2CON,W
ANDLW 0xF8
IORLW 0x00
MOVWF T2CON
; Set(TIMER2_POSTSCALER=1)
MOVF T2CON,W
ANDLW 0x07
IORLW 0x00
MOVWF T2CON
; START(TIMER2)
BSF T2CON, TMR2ON
; OUTC(0)
MOVLW 0
MOVWF PORTC
; OUTB(0)
MOVLW 0
MOVWF PORTB
; Error=0
MOVLW 0
MOVWF VAR14+1
MOVLW 0
MOVWF VAR14
; ReStart:
LAB1:
; Left=0
MOVLW 0
MOVWF VAR10+1
MOVLW 0
MOVWF VAR10
; Right=0
MOVLW 0
MOVWF VAR12+1
MOVLW 0
MOVWF VAR12
; Loop:
LAB2:
; PWM_Duty1L=Left
MOVF VAR10,W
MOVWF CCPR1L
; PWM_Duty2L=Right
MOVF VAR12,W
MOVWF CCPR2L
; Speed=Pulsein(portB, 7, 1)
MOVLW 7
MOVWF pin
MOVLW 0xFF
MOVWF state
MOVLW 1
CALL _PULSEIN
MOVF Acc1L, w
MOVWF VAR2
MOVF Acc1H, W
MOVWF VAR2+1
; If Speed=0 Then Goto NoPulse
MOVF VAR2+1 ,W
MOVWF Acc1H
MOVF VAR2,W
MOVWF Acc1L
MOVLW 0
MOVWF Acc2H
MOVLW 0
MOVWF Acc2L
CALL _COMP16
BTFSS STATUS, Z
GOTO IFLAB1
; Goto NoPulse
GOTO LAB3
IFLAB1:
; If Speed>750 Then Speed=750
MOVF VAR2+1 ,W
MOVWF Acc1H
MOVF VAR2,W
MOVWF Acc1L
MOVLW 2
MOVWF Acc2H
MOVLW 238
MOVWF Acc2L
CALL _COMP16
BTFSC STATUS, C
GOTO IFLAB2
; Speed=750
MOVLW 2
MOVWF VAR2+1
MOVLW 238
MOVWF VAR2
IFLAB2:
; If Speed<250 Then Speed=250
MOVF VAR2+1 ,W
MOVWF Acc1H
MOVF VAR2,W
MOVWF Acc1L
MOVLW 0
MOVWF Acc2H
MOVLW 250
MOVWF Acc2L
CALL _COMP16I
BTFSC STATUS, C
GOTO IFLAB3
; Speed=250
MOVLW 0
MOVWF VAR2+1
MOVLW 250
MOVWF VAR2
IFLAB3:
; Steer=Pulsein(portB, 6, 1)
MOVLW 6
MOVWF pin
MOVLW 0xFF
MOVWF state
MOVLW 1
CALL _PULSEIN
MOVF Acc1L, w
MOVWF VAR4
MOVF Acc1H, W
MOVWF VAR4+1
; If Steer=0 Then Goto NoPulse
MOVF VAR4+1 ,W
MOVWF Acc1H
MOVF VAR4,W
MOVWF Acc1L
MOVLW 0
MOVWF Acc2H
MOVLW 0
MOVWF Acc2L
CALL _COMP16
BTFSS STATUS, Z
GOTO IFLAB4
; Goto NoPulse
GOTO LAB3
IFLAB4:
; Error=0
MOVLW 0
MOVWF VAR14+1
MOVLW 0
MOVWF VAR14
; If Steer>750 Then Steer=750
MOVF VAR4+1 ,W
MOVWF Acc1H
MOVF VAR4,W
MOVWF Acc1L
MOVLW 2
MOVWF Acc2H
MOVLW 238
MOVWF Acc2L
CALL _COMP16
BTFSC STATUS, C
GOTO IFLAB5
; Steer=750
MOVLW 2
MOVWF VAR4+1
MOVLW 238
MOVWF VAR4
IFLAB5:
; If Steer<250 Then Steer=250
MOVF VAR4+1 ,W
MOVWF Acc1H
MOVF VAR4,W
MOVWF Acc1L
MOVLW 0
MOVWF Acc2H
MOVLW 250
MOVWF Acc2L
CALL _COMP16I
BTFSC STATUS, C
GOTO IFLAB6
; Steer=250
MOVLW 0
MOVWF VAR4+1
MOVLW 250
MOVWF VAR4
IFLAB6:
; Steer=Steer-250
MOVF VAR4,W
MOVWF Acc1L
MOVF VAR4+1,W
MOVWF Acc1H
MOVLW 250
MOVWF Acc2L
MOVLW 0
MOVWF Acc2H
CALL _Sub16
MOVF Acc1L, W
MOVWF VAR4
MOVF Acc1H, W
MOVWF VAR4+1
; If Steer<250 Then Gosub TurnLeft
MOVF VAR4+1 ,W
MOVWF Acc1H
MOVF VAR4,W
MOVWF Acc1L
MOVLW 0
MOVWF Acc2H
MOVLW 250
MOVWF Acc2L
CALL _COMP16I
BTFSC STATUS, C
GOTO IFLAB7
; Gosub TurnLeft
CALL LAB4
IFLAB7:
; If Steer>249 Then Gosub TurnRight
MOVF VAR4+1 ,W
MOVWF Acc1H
MOVF VAR4,W
MOVWF Acc1L
MOVLW 0
MOVWF Acc2H
MOVLW 249
MOVWF Acc2L
CALL _COMP16
BTFSC STATUS, C
GOTO IFLAB8
; Gosub TurnRight
CALL LAB5
IFLAB8:
; Goto Loop
GOTO LAB2
; NoPulse:
LAB3:
; Error=Error+1
MOVF VAR14,W
MOVWF Acc1L
MOVF VAR14+1,W
MOVWF Acc1H
MOVLW 1
MOVWF Acc2L
MOVLW 0
MOVWF Acc2H
CALL _Add16
MOVF Acc1L, W
MOVWF VAR14
MOVF Acc1H, W
MOVWF VAR14+1
; If Error > 5 Then Goto ReStart
MOVF VAR14+1 ,W
MOVWF Acc1H
MOVF VAR14,W
MOVWF Acc1L
MOVLW 0
MOVWF Acc2H
MOVLW 5
MOVWF Acc2L
CALL _COMP16
BTFSC STATUS, C
GOTO IFLAB9
; Goto ReStart
GOTO LAB1
IFLAB9:
; Goto Loop
GOTO LAB2
; TurnLeft:
LAB4:
; C=250-Steer
MOVLW 250
MOVWF Acc1L
MOVLW 0
MOVWF Acc1H
MOVF VAR4,W
MOVWF Acc2L
MOVF VAR4+1,W
MOVWF Acc2H
CALL _Sub16
MOVF Acc1L, W
MOVWF VAR6
MOVF Acc1H, W
MOVWF VAR6+1
; Right=Speed+C
MOVF VAR2,W
MOVWF Acc1L
MOVF VAR2+1,W
MOVWF Acc1H
MOVF VAR6,W
MOVWF Acc2L
MOVF VAR6+1,W
MOVWF Acc2H
CALL _Add16
MOVF Acc1L, W
MOVWF VAR12
MOVF Acc1H, W
MOVWF VAR12+1
; Left=Speed-C
MOVF VAR2,W
MOVWF Acc1L
MOVF VAR2+1,W
MOVWF Acc1H
MOVF VAR6,W
MOVWF Acc2L
MOVF VAR6+1,W
MOVWF Acc2H
CALL _Sub16
MOVF Acc1L, W
MOVWF VAR10
MOVF Acc1H, W
MOVWF VAR10+1
; Gosub Scale
CALL LAB6
; Return
RETURN
; TurnRight:
LAB5:
; C=Steer-250
MOVF VAR4,W
MOVWF Acc1L
MOVF VAR4+1,W
MOVWF Acc1H
MOVLW 250
MOVWF Acc2L
MOVLW 0
MOVWF Acc2H
CALL _Sub16
MOVF Acc1L, W
MOVWF VAR6
MOVF Acc1H, W
MOVWF VAR6+1
; Left=Speed+C
MOVF VAR2,W
MOVWF Acc1L
MOVF VAR2+1,W
MOVWF Acc1H
MOVF VAR6,W
MOVWF Acc2L
MOVF VAR6+1,W
MOVWF Acc2H
CALL _Add16
MOVF Acc1L, W
MOVWF VAR10
MOVF Acc1H, W
MOVWF VAR10+1
; Right=Speed-C
MOVF VAR2,W
MOVWF Acc1L
MOVF VAR2+1,W
MOVWF Acc1H
MOVF VAR6,W
MOVWF Acc2L
MOVF VAR6+1,W
MOVWF Acc2H
CALL _Sub16
MOVF Acc1L, W
MOVWF VAR12
MOVF Acc1H, W
MOVWF VAR12+1
; Gosub Scale
CALL LAB6
; Return
RETURN
; Scale:
LAB6:
; Right=Right-250
MOVF VAR12,W
MOVWF Acc1L
MOVF VAR12+1,W
MOVWF Acc1H
MOVLW 250
MOVWF Acc2L
MOVLW 0
MOVWF Acc2H
CALL _Sub16
MOVF Acc1L, W
MOVWF VAR12
MOVF Acc1H, W
MOVWF VAR12+1
; Left=Left-250
MOVF VAR10,W
MOVWF Acc1L
MOVF VAR10+1,W
MOVWF Acc1H
MOVLW 250
MOVWF Acc2L
MOVLW 0
MOVWF Acc2H
CALL _Sub16
MOVF Acc1L, W
MOVWF VAR10
MOVF Acc1H, W
MOVWF VAR10+1
; If Left>10000 Then Left=0
MOVF VAR10+1 ,W
MOVWF Acc1H
MOVF VAR10,W
MOVWF Acc1L
MOVLW 39
MOVWF Acc2H
MOVLW 16
MOVWF Acc2L
CALL _COMP16
BTFSC STATUS, C
GOTO IFLAB10
; Left=0
MOVLW 0
MOVWF VAR10+1
MOVLW 0
MOVWF VAR10
IFLAB10:
; If Right>10000 Then Right=0
MOVF VAR12+1 ,W
MOVWF Acc1H
MOVF VAR12,W
MOVWF Acc1L
MOVLW 39
MOVWF Acc2H
MOVLW 16
MOVWF Acc2L
CALL _COMP16
BTFSC STATUS, C
GOTO IFLAB11
; Right=0
MOVLW 0
MOVWF VAR12+1
MOVLW 0
MOVWF VAR12
IFLAB11:
; If Right>500 Then Right=500
MOVF VAR12+1 ,W
MOVWF Acc1H
MOVF VAR12,W
MOVWF Acc1L
MOVLW 1
MOVWF Acc2H
MOVLW 244
MOVWF Acc2L
CALL _COMP16
BTFSC STATUS, C
GOTO IFLAB12
; Right=500
MOVLW 1
MOVWF VAR12+1
MOVLW 244
MOVWF VAR12
IFLAB12:
; If Left>500 Then Left=500
MOVF VAR10+1 ,W
MOVWF Acc1H
MOVF VAR10,W
MOVWF Acc1L
MOVLW 1
MOVWF Acc2H
MOVLW 244
MOVWF Acc2L
CALL _COMP16
BTFSC STATUS, C
GOTO IFLAB13
; Left=500
MOVLW 1
MOVWF VAR10+1
MOVLW 244
MOVWF VAR10
IFLAB13:
; If Right<250 Then Goto ReverseA
MOVF VAR12+1 ,W
MOVWF Acc1H
MOVF VAR12,W
MOVWF Acc1L
MOVLW 0
MOVWF Acc2H
MOVLW 250
MOVWF Acc2L
CALL _COMP16I
BTFSC STATUS, C
GOTO IFLAB14
; Goto ReverseA
GOTO LAB7
IFLAB14:
; Goto ForwardA
GOTO LAB8
; Do_Left:
LAB9:
; If Left<250 Then Goto ReverseB
MOVF VAR10+1 ,W
MOVWF Acc1H
MOVF VAR10,W
MOVWF Acc1L
MOVLW 0
MOVWF Acc2H
MOVLW 250
MOVWF Acc2L
CALL _COMP16I
BTFSC STATUS, C
GOTO IFLAB15
; Goto ReverseB
GOTO LAB10
IFLAB15:
; Goto ForwardB
GOTO LAB11
; Done_Left:
LAB12:
; Return
RETURN
; ReverseA:
LAB7:
; Right=250-Right
MOVLW 250
MOVWF Acc1L
MOVLW 0
MOVWF Acc1H
MOVF VAR12,W
MOVWF Acc2L
MOVF VAR12+1,W
MOVWF Acc2H
CALL _Sub16
MOVF Acc1L, W
MOVWF VAR12
MOVF Acc1H, W
MOVWF VAR12+1
; Gosub Check_Dead
CALL LAB13
; High PortC, 3
BSF PORTC, 3
; Goto Do_Left
GOTO LAB9
; ForwardA:
LAB8:
; Right=Right-250
MOVF VAR12,W
MOVWF Acc1L
MOVF VAR12+1,W
MOVWF Acc1H
MOVLW 250
MOVWF Acc2L
MOVLW 0
MOVWF Acc2H
CALL _Sub16
MOVF Acc1L, W
MOVWF VAR12
MOVF Acc1H, W
MOVWF VAR12+1
; Gosub Check_Dead
CALL LAB13
; Low PortC, 3
BCF PORTC, 3
; Goto Do_Left
GOTO LAB9
; ReverseB:
LAB10:
; Left=250-Left
MOVLW 250
MOVWF Acc1L
MOVLW 0
MOVWF Acc1H
MOVF VAR10,W
MOVWF Acc2L
MOVF VAR10+1,W
MOVWF Acc2H
CALL _Sub16
MOVF Acc1L, W
MOVWF VAR10
MOVF Acc1H, W
MOVWF VAR10+1
; Gosub Check_Dead
CALL LAB13
; High PortC, 4
BSF PORTC, 4
; Goto Done_Left
GOTO LAB12
; ForwardB:
LAB11:
; Left=Left-250
MOVF VAR10,W
MOVWF Acc1L
MOVF VAR10+1,W
MOVWF Acc1H
MOVLW 250
MOVWF Acc2L
MOVLW 0
MOVWF Acc2H
CALL _Sub16
MOVF Acc1L, W
MOVWF VAR10
MOVF Acc1H, W
MOVWF VAR10+1
; Gosub Check_Dead
CALL LAB13
; Low PortC, 4
BCF PORTC, 4
; Goto Done_Left
GOTO LAB12
; Check_Dead:
LAB13:
; If Right<Dead Then Right=0
MOVF VAR12+1 ,W
MOVWF Acc1H
MOVF VAR12,W
MOVWF Acc1L
MOVF VAR8+1 ,W
MOVWF Acc2H
MOVF VAR8,W
MOVWF Acc2L
CALL _COMP16I
BTFSC STATUS, C
GOTO IFLAB16
; Right=0
MOVLW 0
MOVWF VAR12+1
MOVLW 0
MOVWF VAR12
IFLAB16:
; If Left<Dead Then Left=0
MOVF VAR10+1 ,W
MOVWF Acc1H
MOVF VAR10,W
MOVWF Acc1L
MOVF VAR8+1 ,W
MOVWF Acc2H
MOVF VAR8,W
MOVWF Acc2L
CALL _COMP16I
BTFSC STATUS, C
GOTO IFLAB17
; Left=0
MOVLW 0
MOVWF VAR10+1
MOVLW 0
MOVWF VAR10
IFLAB17:
; Return
RETURN
; end
CLRWDT
SLEEP
END
;
;Number of variables used:82 out of 127