INIT_DS1821 MACRO
LOCAL INIT_START,INIT_END,INIT_LOOP
CALL ONE_WIRE_ENABLE
INIT_START:
CALL ONE_WIRE_RESET
BTFSS MODESEL,PR_DET
GOTO INIT_END
;
MOVLW H'01'
MOVWF SHFT_BYT
CALL ONE_WIRE_TX_BYTE
MOVLW TEMP_HIGH
MOVWF SHFT_BYT
CALL ONE_WIRE_TX_BYTE
;
CALL ONE_WIRE_RESET
BTFSS MODESEL,PR_DET
GOTO INIT_END
;
MOVLW H'02'
MOVWF SHFT_BYT
CALL ONE_WIRE_TX_BYTE
MOVLW TEMP_LOW
MOVWF SHFT_BYT
CALL ONE_WIRE_TX_BYTE
;
CALL ONE_WIRE_RESET
BTFSS MODESEL,PR_DET
GOTO INIT_END
;
MOVLW H'0C'
MOVWF SHFT_BYT
CALL ONE_WIRE_TX_BYTE
MOVLW B'00000100'
MOVWF SHFT_BYT
CALL ONE_WIRE_TX_BYTE
;
CLRF TEMP1
CLRF TEMP2
INIT_LOOP:
CLRWDT
NOOP
DECFSZ TEMP1,F
GOTO INIT_LOOP
DECFSZ TEMP2,F
GOTO INIT_LOOP
;
CALL ONE_WIRE_ENABLE
;
GOTO INIT_END
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ONE_WIRE_ENABLE:
BANKSEL TRISA
BCF DQ_TRIS ; 1 = i/p, 0 = o/p
BCF VDD_TRIS ; 1 = i/p, 0 = o/p
BANKSEL PORTA
;
NOOP
BSF DQ_PORT
NOOP
NOOP
BCF VDD_PORT
;
CLRF TEMP1
ENABLE_LOOP1:
CLRWDT
DECFSZ TEMP1,F
GOTO ENABLE_LOOP1
;
MOVLW D'16'
MOVWF TEMP1
;
ENABLE_LOOP2:
NOOP
NOOP
BCF DQ_PORT
;
CLRWDT
NOOP
NOOP
BSF DQ_PORT
;
DECFSZ TEMP1,F
GOTO ENABLE_LOOP2
;
NOOP
NOOP
NOOP
NOOP
BSF VDD_PORT
;
ENABLE_LOOP3:
CLRWDT
DECFSZ TEMP1,F
GOTO ENABLE_LOOP3
;
RETURN
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ONE_WIRE_RESET:
BSF VDD_PORT
;
MOVLW 3
MOVWF TEMP2
CLRF TEMP1
;
BANKSEL TRISA
BCF DQ_TRIS ; 1 = i/p, 0 = o/p
BANKSEL PORTA
BCF DQ_PORT
RESET_LOOP1:
CLRWDT
DECFSZ TEMP1,F
GOTO RESET_LOOP1
DECFSZ TEMP2,F
GOTO RESET_LOOP1
;
BANKSEL TRISA
BSF DQ_TRIS ; 1 = i/p, 0 = o/p
BANKSEL PORTA
;
BCF MODESEL,PR_DET
RESET_LOOP2:
BTFSC PR_PORT
GOTO CHK_PRESENCE
;
CLRWDT
DECFSZ TEMP1,F
GOTO RESET_LOOP2
;
RETURN
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
CHK_PRESENCE:
MOVLW 8
MOVWF TEMP2
CLRF TEMP1
RESET_LOOP3:
BTFSS PR_PORT
BSF MODESEL,PR_DET
;
CLRWDT
DECFSZ TEMP1,F
GOTO RESET_LOOP3
DECFSZ TEMP2,F
GOTO RESET_LOOP3
;
RETURN
;-----------------------------------------------------------
SLOT_1:
MOVLW D'8'
MOVWF TEMP1
MOVLW D'90'
MOVWF TEMP2
GOTO SLOT_TIME
;-----------------------------------------------------------
SLOT_0:
MOVLW D'90'
MOVWF TEMP1
MOVLW D'8'
MOVWF TEMP2
GOTO SLOT_TIME
;-----------------------------------------------------------
SLOT_TIME:
BCF DQ_PORT
SLOT_LOW:
NOOP
DECFSZ TEMP1,F
GOTO SLOT_LOW
;
BSF DQ_PORT
SLOT_HIGH:
NOOP
DECFSZ TEMP2,F
GOTO SLOT_HIGH
;
RETURN
;-----------------------------------------------------------
ONE_WIRE_TX_BYTE:
BANKSEL TRISA
BCF DQ_TRIS ; 1 = i/p, 0 = o/p
BANKSEL PORTA
;
MOVLW 8
MOVWF SHFT_CNT
ONE_WIRE_TX_BYTE2:
BTFSS SHFT_BYT,0
CALL SLOT_0
BTFSC SHFT_BYT,0
CALL SLOT_1
;
RRF SHFT_BYT,F
DECFSZ SHFT_CNT,F
GOTO ONE_WIRE_TX_BYTE2
;
RETURN
;
INIT_END:
BSF DQ_PORT
BSF VDD_PORT
;
BANKSEL TRISA
BSF DQ_TRIS ; 1 = i/p, 0 = o/p
BANKSEL PORTA
;
ENDM