; DS1821_4.ASM ; ; Illustrates how to return DS1821 to 1-wire mode. ; ; V_DD is brought low and DQ is pulsed low 16 times. ; ; Configuration status register is read and displayed. Bits 5 and 4 ; are THF and TLF flags and may be used to determine if temperature ; ever went above TH threshold or below TL threshold. ; ; The write to the configuration status register is required to clear ; the THF and TLF bits. ; ; Note that Bit 2 (T/R) of configuration status register remains at ; a logic one. Thus, in the future, the device will boot up in the ; the thermostat mode. ; ; 16C84 DS1821 (TO-220) ; PORTB, Bit 1 (term 7) ------------------------ VDD (term 1) ; PORTB, Bit 0 (term 6) ------------------------ DQ (term 3) ; ; GRD (term 2) ; ; PORTA, Bit 1 (terminal 18) ------ TX ----------> to RX on Serial LCD ; ; Note that a 10K pullup resistor to +5V is required on the DQ lead. ; ; Note that LCD_CTRL.ASM is included at the end of this program. ; ; copyright, Peter H. Anderson, MSU, July 25, '97 ; LIST p=16c84 #include <c:\mplab\p16c84.inc> __CONFIG 11h CONSTANT DATA_PIN=0 ; define pins on PORTB CONSTANT V_DD=1 CONSTANT BASE_VAR=0CH N EQU BASE_VAR+0 STAT EQU BASE_VAR+1 _N EQU BASE_VAR+2 ; these vars used by the O_BYTE EQU BASE_VAR+3 ; common 1-wire routines I_BYTE EQU BASE_VAR+4 LOOP3 EQU BASE_VAR+5 LOOP2 EQU BASE_VAR+6 LOOP1 EQU BASE_VAR+7 TEMP EQU BASE_VAR+8 ; Program ORG 000H MAIN: BSF STATUS, RP0 BCF TRISB, V_DD BCF STATUS, RP0 BSF PORTB, V_DD ; apply +5 VDC to the device CALL PIN_HI CALL DELAY_LONG ; 250 msec delay BCF PORTB, V_DD ; bring V_DD low MOVLW .16 MOVWF N MAIN_1: CALL PIN_LO MOVLW .6 CALL DELAY_10USEC CALL PIN_HI MOVLW .6 CALL DELAY_10USEC DECFSZ N, F GOTO MAIN_1 BSF PORTB, V_DD ; bring V_DD back high CALL DELAY_LONG ; 250 msec delay CALL READ_CONFIG ; ACH CALL DISPLAY CALL CONFIG_DEVICE ; 0C 06, clear the THF and TLF flags DONE: GOTO DONE CONFIG_DEVICE: CALL INIT MOVLW 0CH MOVWF O_BYTE CALL OUT_BYTE MOVLW 06H ; thermostat mode, active polarity = 1 MOVWF O_BYTE CALL OUT_BYTE MOVLW .20 MOVWF LOOP1 CALL DELAY_N_MS RETURN READ_CONFIG: CALL INIT MOVLW 0ACH MOVWF O_BYTE CALL OUT_BYTE CALL IN_BYTE MOVF I_BYTE, W MOVWF STAT RETURN DISPLAY: CALL LCD_CLR MOVF STAT, W ; display STAT in natural binary CALL LCD_VAL RETURN ; The following are standard 1-Wire routines. INIT: CALL PIN_HI CALL PIN_LO MOVLW .50 ; 500 us delay CALL DELAY_10USEC CALL PIN_HI MOVLW .50 ; 500 usec delay CALL DELAY_10USEC RETURN WAIT: CALL IN_BYTE MOVLW 0FFH SUBWF I_BYTE, W BTFSS STATUS, Z GOTO WAIT RETURN IN_BYTE: ; returns byte in W MOVLW .8 MOVWF _N CLRF I_BYTE IN_BYTE_1: CALL PIN_LO ; momentary low on DATA_PIN NOP CALL PIN_HI NOP NOP NOP NOP NOP NOP MOVF PORTB, W ; 7 usecs later, fetch from DATA_PIN MOVWF TEMP BTFSS TEMP, DATA_PIN BCF STATUS, C ; its a zero BTFSC TEMP, DATA_PIN BSF STATUS, C ; its a one RRF I_BYTE, F MOVLW .6 ; now delay 60 usecs CALL DELAY_10USEC DECFSZ _N, F GOTO IN_BYTE_1 MOVFW I_BYTE ; return the result in W RETURN OUT_BYTE: MOVLW .8 MOVWF _N OUT_BYTE_1: RRF O_BYTE, F BTFSS STATUS, C GOTO OUT_0 GOTO OUT_1 OUT_BYTE_2: DECFSZ _N, F GOTO OUT_BYTE_1 RETURN OUT_0: CALL PIN_LO ; bring DATA_PIN low MOVLW .6 ; for 60 usecs CALL DELAY_10USEC CALL PIN_HI GOTO OUT_BYTE_2 OUT_1: CALL PIN_LO ; momentary low CALL PIN_HI MOVLW .6 CALL DELAY_10USEC GOTO OUT_BYTE_2 ;;;;;; PIN_HI: BSF STATUS, RP0 BSF TRISB, DATA_PIN ; high impedance BCF STATUS, RP0 RETURN PIN_LO: BCF PORTB, DATA_PIN BSF STATUS, RP0 BCF TRISB, DATA_PIN ; low impedance zero BCF STATUS, RP0 RETURN DELAY_LONG MOVLW .250 ; 250 msec delay MOVWF LOOP1 DELAY_N_MS: OUTTER: MOVLW .110 ; close to 1.0 msec delay when set to .110 MOVWF LOOP2 INNER: NOP NOP NOP NOP NOP NOP DECFSZ LOOP2, F ; decrement and leave result in LOOP2 ; skip next statement if zero GOTO INNER DECFSZ LOOP1, F GOTO OUTTER RETURN DELAY_10USEC: ; provides a delay equal to W * 10 usecs MOVWF LOOP1 DELAY_10USEC_1: NOP NOP NOP NOP NOP NOP NOP DECFSZ LOOP1, F GOTO DELAY_10USEC_1 RETURN #include <a:\lcd\lcd_ctrl.asm> END