;;;;;
;;;;AM111
;2014--12--17--VEE CHEN
;;;SENTEK ---SOUNDER-OUTPUT---
INCLUDE "P16F685.INC"
LIST P=16F685
; __CONFIG(0X0FC) ;0000 1111 1100
__config 0x0BC
; *********************************
; Variable Define
; *********************************
CBLOCK 20H
FLAG
;SET_FLAG
CC
DLY1
DLY2
COUNT
ADDRESSTEMP
SYS_ADDR
COMMAND
SMOKE_ADV
SMOKE_DAT
TMR0_TEMP
ADDRESS
EXPA ;校验码
PACOM ;地址和数据中1个数的总和放置在这里
PACOM1
AFCOUNT ;32个一个来回
ALARM ;AD值跟32H比较,大于则ALARM,0置1
;AD_TEMP
;AD_TEMP1
;AD_TEMP2
;DATA_X1
;DATA_X2
;DATA_X3
;DATA_X4
;DATA_X
COUNTAD
COUNT8
;SET_AD_ZERO
;SET_AD_ALARM
;M
COUNTH ;led FLASH TIME
;M4
;ADDRESSTEMP1
ADDR32
;FNTCOMD
;FNTCOMD2
OUTPCOM
;BDFLAG
;T
;TT
ENDC
;=======================================
; =======序列in 电源 红灯 烟感AD 远程 红外发射 温感AD
#DEFINE SIGNAL_IN PORTA,2 ;INPUT ;脉冲信号读取 正向
;#DEFINE SIGNAL_SHORT PORTB,6 ;INPUT 探头有,探头 无,探头报警
;#DEFINE SIGNAL_OPEN PORTB,5 ;INPUT
#DEFINE SIGNAL_OUT PORTA,1 ;OUTPUT ;拉电流
;#######################################
;#######################################
;**************************************
ORG 00H
GOTO MAIN
ORG 04H
GOTO INT_SERVICE
; Interrupt Sub
;**************************************
8 ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;PPP PPPPPPPPP
READ_SIGNAL_DATA ;读取信号脉冲 3+7
CLRWDT
BTFSS SIGNAL_IN
GOTO $-2
MOVF TMR0,0 ;????TMR0的值时多少。 ;要大于0X0F
MOVWF TMR0_TEMP
CLRF TMR0
BCF STATUS,C
MOVLW 037H ;-440US ;1111 0000这个值根据不同的频率需要进行修改
SUBWF TMR0_TEMP,0
RLF ADDRESS,1 ;带进位移动,取决于status ,c 0X28
RLF COMMAND,1 ;
CLRF STATUS
MOVLW 0BEH ;1.52ms 因为1最大为1500us
SUBWF TMR0_TEMP,1
BTFSC STATUS,C
GOTO LAS
CLRWDT
BTFSC SIGNAL_IN
GOTO $-2
;800US 空闲,做处理
CLRF TMR0
DECFSZ COUNT,1
GOTO READ_SIGNAL_DATA ;十个脉冲读完 3+++7addr
;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;为什么差一位,int位在吗,怎么没算上?;;;;;;;;;;;
BCF STATUS,C
RLF ADDRESS,1
RLF COMMAND,1
;地址还是选择低7位
BCF STATUS,C
RRF ADDRESS,1
;=====================
;;;;;;;;;;;;;=============;;;;;;;;;;;;;;;;
ALARM#8 ;查看是不是自己,output不需要读取ad,
;;只在本身地址的时候查看是否开启报警输出
;那么,其回复的AD值是多少?
;;;;;;;;;;;;================;;;;;;;
CLRWDT
MOVF SYS_ADDR,0
SUBWF ADDRESS,0 ;读取的地址等于 本身的地址 那么结果为0
BTFSS STATUS,Z
GOTO LAS
; MOVLW B'00000001'
; BTFSC SMOKE_DAT,6
; MOVWF COMMAND
BSF FLAG,0
BCF STATUS,C
RLF COMMAND,1
RLF COMMAND,1
RLF COMMAND,1
BCF STATUS,C
RLF ADDRESS,1
CLRWDT
MOVLW 038H ;输入信号
ANDWF COMMAND,1 ;0011 1000
;设备类型
MOVLW 01H ;SOUNDER
BTFSC ADDRESSTEMP,7
MOVLW 02H ;OUTPUT
IORWF COMMAND,1 ;0000 0101
; MOVFW COMMAND
; MOVWF OUTPCOM
;===========================
BTFSC COMMAND,3 ;是否报警,报警则该位为1,则,开启报警设备
BSF PORTB,6
;==========================
BTFSS COMMAND,3 ;是否报警,报警则该位为1,则,开启报警设备
BCF PORTB,6
MOVLW 04H
BTFSC PORTB,5 ;查看是否有接报警设备
MOVLW 14H
BTFSC COMMAND,3
MOVLW 50H
MOVWF SMOKE_DAT
MOVF SMOKE_DAT,0
MOVWF SMOKE_ADV
BCF STATUS,C
RLF ADDRESS,1
RLF COMMAND,1
RLF ADDRESS,1 ;60--480US
RLF COMMAND,1 ; 到此为止,COMMAND前六位,ADDR空后三位
AFPLACE ;快速报警时,直接跳转到此处
CLRWDT
BTFSS SIGNAL_IN
GOTO $-2
BCF STATUS,C
RLF ADDRESS,1
RLF COMMAND,1 ; COMMAND ADDRESS
RLF SMOKE_ADV,1
; BTFSS ADDRESSTEMP,7
; BSF ADDRESS,0
; BTFSS ADDRESSTEMP,7
; BSF ADDRESS,1
; BTFSS ADDRESSTEMP,7
; BSF ADDRESS,3 ;XP95位
MOVLW 018H ;20码 分别为7+3+3+7+2
MOVWF COUNT
;;LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL
LINE_TO_PANEL ;;;;;;;;;回复信号
CLRWDT
BTFSC SIGNAL_IN
GOTO $-2
CLRF TMR0
CALL DE360 ;
BCF STATUS,C
RLF ADDRESS,1
RLF COMMAND,1
RLF SMOKE_ADV,1
BTFSS STATUS,C
GOTO $+3
BSF SIGNAL_OUT
CALL DE250
BCF SIGNAL_OUT
CALL DE200
CLRF TMR0
CLRWDT
MOVF TMR0,0 ;????TMR0的值时多少。 ;要大于0X0F
MOVWF TMR0_TEMP
MOVLW 0X80
SUBWF TMR0_TEMP,0
BTFSC STATUS,C
GOTO EXIT_READ
; RETFIE
BTFSS SIGNAL_IN
GOTO $-8
CLRF TMR0
DECFSZ COUNT,1
GOTO LINE_TO_PANEL
; BSF FLAG,0 ;待用,用于AD值的获取
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;扩展位子程序;;;;;
; BTFSC ADDRESSTEMP,7 ;INPUT -90
GOTO LAS
;======================= 直接退出
;============================
;=====================================
;90不需要以下验证码和扩展地址位
BTFSC PACOM,0
INCF PACOM1,F
MOVLW 06H ; 前3位为空,然后4为AD扩展也为空,最后校验位
MOVWF COUNT
CLRF EXPA ;偶校验
BTFSC PACOM1,0 ;地址位中1的个数; BSF EXPA,0
BSF EXPA,2
BTFSC ADDRESSTEMP,7 ;INPUT -90
CLRF EXPA
; BTFSC FLAG,7 ;INT,不需要这个位
; CLRF EXPA
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
PA ;;;;;;;;;;校验子程序
CLRWDT
BTFSC SIGNAL_IN
GOTO $-2
CLRF TMR0
CALL DE360 ;
BCF STATUS,C
RLF EXPA,1
BTFSS STATUS,C
GOTO $+3
BSF SIGNAL_OUT
CALL DE250
BCF SIGNAL_OUT
CALL DE200
CLRF TMR0
CLRWDT
MOVF TMR0,0 ;????TMR0的值时多少。 ;要大于0X0F
MOVWF TMR0_TEMP
MOVLW 0X80
SUBWF TMR0_TEMP,0
BTFSC STATUS,C
GOTO EXIT_READ
; RETFIE ;90 的机子在此退出程序
BTFSS SIGNAL_IN
GOTO $-8
CLRF TMR0
DECFSZ COUNT,1
GOTO PA
;;;;;;;;;;;;;========;;;;;;;;;;;
;;;;;;;;;;;;;===============;;;;;;;;
;
; BTFSC ADDRESSTEMP,7 ;INPUT -90
GOTO LAS ;输出设备不需要快速报警功能
; BTFSS FLAG,7 ;报警时,那起初的八个循环会用到,之后,就空着了
; GOTO LAS
; BTFSC FLAG,6 ;所以要 flag7为1 flag6为0时
; GOTO LAS
MOVLW 07H
MOVWF COUNT
MOVF SYS_ADDR,0
MOVWF ADDRESS
BCF STATUS,C
RLF ADDRESS,1
PAEXT ;最后7位地址 的输出
CLRWDT
BTFSC SIGNAL_IN
GOTO $-2
CLRF TMR0
CALL DE360 ;
BCF STATUS,C
RLF ADDRESS,1
BTFSS STATUS,C
GOTO $+3
BSF SIGNAL_OUT
CALL DE250
BCF SIGNAL_OUT
CALL DE200
CLRF TMR0
CLRWDT
MOVF TMR0,0
MOVWF TMR0_TEMP
MOVLW 0X80
SUBWF TMR0_TEMP,0
BTFSC STATUS,C
GOTO EXIT_READ
; RETFIE
BTFSS SIGNAL_IN
GOTO $-8
CLRF TMR0
DECFSZ COUNT,1
GOTO PAEXT
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
LAS ;;;;;;;;退出子程序
CLRWDT
BTFSC SIGNAL_IN ;七个地址之后,的最后一个空码
GOTO $-2
CLRF TMR0
CLRWDT
MOVF TMR0,0 ;????TMR0的值时多少。 ;要大于0X0F
MOVWF TMR0_TEMP
MOVLW 0x7D ;1048
SUBWF TMR0_TEMP,0
BTFSC STATUS,C
GOTO EXIT_READ
BTFSS SIGNAL_IN
GOTO $-8
CLRF TMR0
CLRWDT
MOVF TMR0,0 ;????TMR0的值时多少。 ;要大于0X0F
MOVWF TMR0_TEMP
MOVLW 0X57 ; 700
SUBWF TMR0_TEMP,0
BTFSC STATUS,C
GOTO EXIT_READ
BTFSC SIGNAL_IN
GOTO $-8
GOTO LAS
;===============================
EXIT_READ
BTFSC FLAG,0
CALL ADDR_READ
MOVLW 090H ;1001 0000
MOVWF INTCON
RETFIE
;************************************
; Main
;************************************
MAIN
CALL SYS_INIT
BCF PORTA,1
CLRF PACOM ;校验码计算1的个数
CLRF PACOM1
CLRF AFCOUNT ;32一个回合计数
CLRF COUNTAD
CLRF ALARM
CLRF SMOKE_DAT
;--------------------------
; MOVLW 0X08
; MOVWF COUNT8
;----------------------------
;地址计算
;--------------------
ADDR#
CALL ADDR_READ
;================================
MOVLW 04H
BTFSC PORTB,5
MOVLW 14H
MOVWF SMOKE_DAT
MOVLW 090H ;1001 0000
MOVWF INTCON
CLRWDT
; GOTO INT_SERVICE
MAIN9 ;等待通讯
CLRWDT
NOP
SLEEP
NOP
NOP
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
GOTO MAIN9
;******************************************************
; System Initialization
;******************************************************
SYS_INIT
BANKSEL T1CON
CLRF PORTA
CLRF PORTB
CLRF PORTC
CLRF ADRESH
; MOVLW B'00100100' ;ZUO对齐 Vdd AN9
MOVLW B'00000000'
MOVWF ADCON0
CLRF INTCON
MOVLW 00H
MOVWF T1CON
BANKSEL TRISA
MOVLW B'11111100'
MOVWF TRISA
MOVLW B'10110000' ;5、6 电平控制烟值标定,7 本身地址读取上电
MOVWF TRISB
MOVLW B'11001111' ;7 AD读取,0-6七位地址
MOVWF TRISC
MOVLW B'01110000'
; MOVLW B'00010000' ;AD转换时钟选择,001专用RC时钟
MOVWF ADCON1
; CLRF ADCON1
CLRF ADRESL
MOVLW B'11001000'
MOVWF OPTION_REG
MOVLW B'00110111'
MOVWF OSCCON
MOVLW B'00000000'
MOVWF WPUA
; CLRF WPUA
CLRF IOCA
CLRF PIE1
CLRF PIE2
BANKSEL ANSEL
MOVLW B'00000000' ;RA4为模拟通道--AN3 ANS3
MOVWF ANSEL
MOVLW B'00000000'
MOVWF ANSELH
; CLRF ANSELH
CLRF WPUB
CLRF IOCB
CLRF EEADR
BCF STATUS, RP1 ;Bank0
BCF STATUS, RP0 ;
RETURN
;========================
;地址读取
;============================
ADDR_READ
BSF PORTC,4
NOP
CLRF ADDRESSTEMP
BTFSS PORTC,3
BSF ADDRESSTEMP,7
BTFSS PORTC,6
BSF ADDRESSTEMP,6
BTFSS PORTC,7
BSF ADDRESSTEMP,5
BTFSS PORTB,7
BSF ADDRESSTEMP,4
BTFSS PORTC,0
BSF ADDRESSTEMP,3
BTFSS PORTB,4
BSF ADDRESSTEMP,2
BTFSS PORTC,1
BSF ADDRESSTEMP,1
BTFSS PORTC,2
BSF ADDRESSTEMP,0
BCF PORTC,4
MOVF ADDRESSTEMP,W
MOVWF SYS_ADDR
BCF SYS_ADDR,7
CLRWDT
RETURN
;**************************************
; delay sub 时钟为477khz; 4MHZ
;**************************************
DELAY CLRWDT
DECFSZ CC,1
GOTO DELAY
RETURN
DE360 MOVLW 06H ;370uS
MOVWF CC
NOP
NOP
CALL DELAY
RETURN
DE250 MOVLW 05H ;280uS
MOVWF CC
NOP
NOP
NOP
CALL DELAY
RETURN
DE200 MOVLW 03H ;220uS
MOVWF CC
CALL DELAY
RETURN
DE100
MOVLW 02H
MOVWF CC
CLRWDT
DECFSZ CC,1
GOTO $-2
RETURN
DE1MS MOVLW 14H
MOVWF CC
CALL DELAY
RETURN
DE5MS MOVLW 60H ;250uS
MOVWF CC
CALL DELAY
RETURN
DY1S ; ;B00
movlw .62 ;
movwf DLY2 ;
D16MSLP
movlw .251 ; 1
movwf DLY1 ; 1
clrwdt ; 1
clrwdt ; 1
clrwdt ; 1
clrwdt ; 1
clrwdt ; 1
decfsz DLY1,f ; 1 / 2
goto $-6 ; 2
clrwdt ; 1
clrwdt ; 1
clrwdt ; 1
clrwdt ; 1
decfsz DLY2,f ;
goto D16MSLP ;
RETURN
DY4S ; ;B00
movlw .246 ;
movwf DLY2 ;
D496MSLP
movlw .251 ; 1
movwf DLY1 ; 1
clrwdt ; 1
clrwdt ; 1
clrwdt ; 1
clrwdt ; 1
clrwdt ; 1
decfsz DLY1,f ; 1 / 2
goto $-6 ; 2
clrwdt ; 1
clrwdt ; 1
clrwdt ; 1
clrwdt ; 1
decfsz DLY2,f ;
goto D496MSLP ;
RETURN
;********************************************
END