Pic16f876a infrared receiving and ERROR program

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

Automation Light Curtain

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