pIC16f876a Infrared Error Program
Include <p16f876a.inc>
Status equ 03h
RP0 equ 05h
Z equ 02h
C equ 00h
PCL equ 02h
PORTA equ 05h
TRISA equ 85h
PORTC equ 07h
TRISC equ 87h
PORTB equ 06h
TRISB equ 86h
;--------tmr0--------------
TMR0 equ 01h; 4Mhz = 256 (256 - tmr0b) = 50ms
OPTION_REG equ 81h
INTCON equ 0bh
T0IF equ 02h
WTEMP equ 19h
;-----------------------
ADDR equ 20H; write address register
NUM equ 21H; write value
REC equ 22H; read count
WRC equ 24H; write count
rec1 equ 25H
count equ 26H
;-------------------------
count1 equ 27H
count2 equ 28H
Flag equ 30h
Flag1 equ 31h
Flag2 equ 32h
Flag3 equ 33h
;
Flag4 equ 34h
;================================
Org 00h
Nop
Goto start
Org 04h
;
;=========Interrupt Service Subservice =======
Serv
MOVwf WTEMP
Bcf INTCON, T0IF
Btfsc Flag4, 0
Goto delay3ms7
;
Btfss Flag4, 3
Goto www
Decfsz count1
Goto www; 250uS has not continued to count the number of pulses goto www
MOVlw 0x03
MOVwf count1
Bsf Flag4, 2
Goto www
;
Delay3ms7
Btfss Flag4, 4
Goto www
Decfsz count2
Goto www; 3.7mS has not continued to count the number of pulses goto www
Bsf Flag4, 1
MOVlw 0x0f
MOVwf count2
;
;250us
MOVwf TMR0
MOVwf WTEMP, 0
Retfie
;===========================================
Start
Nop
Bsf STATUS, RP0
Clrf TRISC
MOVlw 00000000b
MOVwf TRISA
MOVlw 00000101b
MOVwf TRISB
MOVlw 00000000b; 1:1
MOVwf OPTION_REG
Bcf STATUS, RP0
Clrf Flag4
;-----------
MOVlw 00h; write EEPROM initial address starts from 0
MOVwf ADDR
MOVwf rec1
MOVlw 0; / / initial write value
MOVwf NUM
MOVlw 30h; indirect addressing, read value initial storage address
MOVwf FSR
MOVlw 0100h; / / write times
MOVwf WRC
;
;============ Clear EEPROM at reset ==============
Clrf count
CC bsf STATUS, RP1
bsf STATUS, RP0
btfsc EECON1, WR
Goto $-1
bcf STATUS, RP0
bcf STATUS, RP1
MOVf count, 0
bsf STATUS, RP1
MOVwf EEADR
bcf STATUS, RP1
MOVlw 0x00
bsf STATUS, RP1
MOVwf EEDATA
bsf STATUS, RP0
bcf EECON1, EEPGD
bsf EECON1, WREN
bcf INTCON, GIE
MOVlw 55h
MOVwf EECON2
MOVlw 0aah
MOVwf EECON2
bsf EECON1, WR
btfsc EECON1, WR
Goto $-1
bsf INTCON, GIE
bcf EECON1, WREN
bcf STATUS, RP0
bcf STATUS, RP1
Incf count, 1
decfsz WRC
Goto cc
;
MOVlw 8Fh; / / rewrite times value
MOVwf WRC
MOVwf REC
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\
;
MOVlw 0x03
MOVwf count1;3*250us=750us
MOVlw 0x0f
MOVwf count2; 15*250us=3.7ms
;
MOVlw 0xa0
MOVwf INTCON
Bcf INTCON, T0IF; TMR0 settings
MOVlw 0x0e
MOVwf TMR0
;
MOVlw 0x0f
MOVwf PORTC; initial bright PORTC, to determine whether the program is running normally
Clrf Flag
Clrf Flag1
Clrf Flag2
Clrf Flag3
;
Clrf Flag4; flag register
;=========================================
Main
MOVlw 0x0f
MOVwf PORTC
MOVlw 0x0f
MOVwf count2
Clrf Flag4
Btfsc PORTB, 2
Goto main
Bsf Flag4, 0
Bcf Flag4, 4
;
Btfss PORTB, 2; Is there a high level in 3.7ms?
Goto $-1; there
;
out MOVlw 0x0f
MOVwf count2
;------------------------------
;d7
Bcf Flag4, 0;d0=1 at 3. 7 timing
Bcf Flag4, 2; d2=1 pulse low level within 750US, representing 0
Bcf Flag4, 3;750US does not count
Btfss PORTB, 2
Goto $-1
Dd7 Bsf Flag4, 3; start timing
Btfss PORTB, 2; pulse high level width
Goto ss7; pulse high level "750US
Btfss Flag4, 2
Goto dd7
Bsf Flag, 7;"750US;FLAG,D7=1
Goto out7
Ss7 Bcf Flag, 7
out7 MOVlw 0x03
MOVwf count1
;d6
Bcf Flag4, 0
Bcf Flag4, 2
Bcf Flag4, 3
Btfss PORTB, 2
Goto $-1
Dd6 Bsf Flag4, 3
Btfss PORTB, 2
Goto ss6
Btfss Flag4, 2
Goto dd6
Bsf Flag, 6
Goto out6
Ss6 Bcf Flag, 6
out6 MOVlw 0x03
MOVwf count1
;d5
Bcf Flag4, 0
Bcf Flag4, 2; d2=1 pulse low level within 750US, representing 0
Bcf Flag4, 3;750US does not count
Btfss PORTB, 2
Goto $-1
Dd5 Bsf Flag4, 3; start timing
Btfss PORTB, 2; pulse high level width
Goto ss5; pulse high level "750US
Btfss Flag4, 2
Goto dd5
Bsf Flag, 5;"750US;FLAG,D7=1
Goto out5
Ss5 Bcf Flag, 5
out5 MOVlw 0x03
MOVwf count1
;d4
Bcf Flag4, 0
Bcf Flag4, 2
Bcf Flag4, 3
Btfss PORTB, 2
Goto $-1
Dd4 Bsf Flag4, 3
Btfss PORTB, 2
Goto ss4
Btfss Flag4, 2
Goto dd4
Bsf Flag, 4
Goto out4
Ss4 Bcf Flag, 4
out4 MOVlw 0x03
MOVwf count1
;d3
Bcf Flag4, 0
Bcf Flag4, 2
Bcf Flag4, 3
Btfss PORTB, 2
Goto $-1
Dd3 Bsf Flag4, 3
Btfss PORTB, 2
Goto ss3
Btfss Flag4, 2
Goto dd3
Bsf Flag, 3
Goto out3
Ss3 Bcf Flag, 3
out3 MOVlw 0x03
MOVwf count1
;d2
Bcf Flag4, 0
Bcf Flag4, 2
Bcf Flag4, 3
Btfss PORTB, 2
Goto $-1
Dd2 Bsf Flag4, 3
Btfss PORTB, 2
Goto ss2
Btfss Flag4, 2
Goto dd2
Bsf Flag, 2
Goto out2
Ss2 Bcf Flag, 2
out2 MOVlw 0x03
MOVwf count1
;d1
Bcf Flag4, 0
Bcf Flag4, 2
Bcf Flag4, 3
Btfss PORTB, 2
Goto $-1
Dd1 Bsf Flag4, 3
Btfss PORTB, 2
Goto ss1
Btfss Flag4, 2
Goto dd1
Bsf Flag, 1
Goto out1
Ss1 Bcf Flag, 1
out1 MOVlw 0x03
MOVwf count1
;d0
Bcf Flag4, 0
Bcf Flag4, 2
Bcf Flag4, 3
Btfss PORTB, 2
Goto $-1
Dd0 Bsf Flag4, 3
Btfss PORTB, 2
Goto ss0
Btfss Flag4, 2
Goto dd0
Bsf Flag, 0
Goto out6
Ss0 Bcf Flag, 0
out0 MOVlw 0x03
MOVwf count1
;------------------------
Btfss PORTB, 2
Goto $-1
Btfsc PORTB, 2
Goto $-1
Btfss PORTB, 2
Goto $-1
Btfsc PORTB, 2
Goto $-1
Btfss PORTB, 2
Goto $-1
Btfsc PORTB, 2
Goto $-1
Btfss PORTB, 2
Goto $-1
Btfsc PORTB, 2
Goto $-1
Btfss PORTB, 2
Goto $-1
Btfsc PORTB, 2
Goto $-1
Btfss PORTB, 2
Goto $-1
Btfsc PORTB, 2
Goto $-1
Btfss PORTB, 2
Goto $-1
Btfsc PORTB, 2
Goto $-1
Btfss PORTB, 2
Goto $-1
Btfsc PORTB, 2
Goto $-1
;===========================
;d7a
Bcf Flag4, 0;d0=1 at 3. 7 timing
Bcf Flag4, 2; d2=1 pulse low level within 750US, representing 0
Bcf Flag4, 3;750US does not count
Btfss PORTB, 2
Goto $-1
Dd7a Bsf Flag4, 3; start timing
Btfss PORTB, 2; pulse high level width
Goto ss7a; pulse high level "750US
Btfss Flag4, 2
Goto dd7a
Bsf Flag1, 7;"750US;FLAG,D7=1
Goto out7a
Ss7a Bcf Flag1, 7
out7a MOVlw 0x03
MOVwf count1
;d6a
Bcf Flag4, 0
Bcf Flag4, 2
Bcf Flag4, 3
Btfss PORTB, 2
Goto $-1
Dd6a Bsf Flag4, 3
Btfss PORTB, 2
Goto ss6a
Btfss Flag4, 2
Goto dd6a
Bsf Flag1, 6
Goto out6a
Ss6a Bcf Flag1, 6
out6a MOVlw 0x03
MOVwf count1
;d5a
Bcf Flag4, 0
Bcf Flag4, 2; d2=1 pulse low level within 750US, representing 0
Bcf Flag4, 3;750US does not count
Btfss PORTB, 2
Goto $-1
Dd5a Bsf Flag4, 3; start timing
Btfss PORTB, 2; pulse high level width
Goto ss5a; pulse high level "750US
Btfss Flag4, 2
Goto dd5a
Bsf Flag1, 5;"750US;FLAG,D7=1
Goto out5a
Ss5a Bcf Flag1, 5
out5a MOVlw 0x03
MOVwf count1
;d4a
Bcf Flag4, 0
Bcf Flag4, 2
Bcf Flag4, 3
Btfss PORTB, 2
Goto $-1
Dd4a Bsf Flag4, 3
Btfss PORTB, 2
Goto ss4a
Btfss Flag4, 2
Goto dd4a
Bsf Flag1, 4
Goto out4a
Ss4a Bcf Flag1, 4
out4a MOVlw 0x03
MOVwf count1
;d3a
Bcf Flag4, 0
Bcf Flag4, 2
Bcf Flag4, 3
Btfss PORTB, 2
Goto $-1
Dd3a Bsf Flag4, 3
Btfss PORTB, 2
Goto ss3a
Btfss Flag4, 2
Goto dd3a
Bsf Flag1, 3
Goto out3a
Ss3a Bcf Flag1, 3
out3a MOVlw 0x03
MOVwf count1
;d2a
Bcf Flag4, 0
Bcf Flag4, 2
Bcf Flag4, 3
Btfss PORTB, 2
Goto $-1
Dd2a Bsf Flag4, 3
Btfss PORTB, 2
Goto ss2a
Btfss Flag4, 2
Goto dd2a
Bsf Flag1, 2
Goto out2a
Ss2a Bcf Flag1, 2
out2a MOVlw 0x03
MOVwf count1
;d1a
Bcf Flag4, 0
Bcf Flag4, 2
Bcf Flag4, 3
Btfss PORTB, 2
Goto $-1
Dd1a Bsf Flag4, 3
Btfss PORTB, 2
Goto ss1a
Btfss Flag4, 2
Goto dd1a
Bsf Flag1, 1
Goto out1a
Ss1a Bcf Flag1, 1
out1a MOVlw 0x03
MOVwf count1
;d0a
Bcf Flag4, 0
Bcf Flag4, 2
Bcf Flag4, 3
Btfss PORTB, 2
Goto $-1
Dd0a Bsf Flag4, 3
Btfss PORTB, 2
Goto ss0a
Btfss Flag4, 2
Goto dd0a
Bsf Flag1, 0
Goto out6a
Ss0a Bcf Flag1, 0
out0a MOVlw 0x03
MOVwf count1
;---------------------------
MOVf Flag, 0
MOVwf NUM
Call write
MOVf Flag1, 0
MOVwf NUM
Call write
jjj btfss PORTB, 0
Goto back1
Clrf Flag4
MOVlw 01010101b
MOVwf PORTC
Goto jjj
;
Back1 goto main
;=========== Writing Subroutines ============
Write
clrf PORTC;////// indicates entering the write state
;
bsf STATUS, RP1
bsf STATUS, RP0; /bank4
btfsc EECON1, WR; WR=0 last write completed
Goto $-1
bcf STATUS, RP0
bcf STATUS, RP1; /bank0
MOVf ADDR, W
bsf STATUS, RP1; /bank2
MOVwf EEADR; ADDR-->EEADR
bcf STATUS, RP1; /bank0
MOVf NUM, W
bsf STATUS, RP1; /bank2
MOVwf EEDATA; VALU-->EEDATA
bsf STATUS, RP0; /bank3
bcf EECON1, EEPGD; selected EEPROM as the access object
bsf EECON1, WREN; open write enable control bit
bcf INTCON, GIE;
;
MOVlw 55h; "5 instruction sequence"
MOVwf EECON2
MOVlw 0aah
MOVwf EECON2
bsf EECON1, WR; start write operation
;
btfsc EECON1, WR
Goto $-1; waiting for a write operation
bsf INTCON, GIE
bcf EECON1, WREN
bcf STATUS, RP0
bcf STATUS, RP1; bank0
incf ADDR, 1
;
MOVlw 0x0f;////
MOVwf PORTC
Return
;=================================
End
This Automation curtain is specially designed for automation industry. SDKELI LSC2 light curtain is designed for automation field, with small size, compact structure and strong anti-interference ability, and the product meets IEC 61496-2 standards. The automatic light curtain is with reliable quality and very competitive price. It has been used in many factories and has replaced curtains from Omron, Banner, Keyence, etc.
Automatic Light Curtain,Laser Light Curtain,Automation Light Beam Sensor,Automatic Infrared Beam Sensor,Infrared Beam Curttain Sensor,Infrared Beam Sensor
Jining Keli Photoelectronic Industrial Co.,Ltd , https://www.sdkelien.com