; DS1821_1.ASM ; ; Continually performs temperature measurment and displays low eight ; bits in natural binary on serial LCD. Loops with a 30 second delay. ; ; 16C84 DS1821 (TO-220) ; PORTB, Bit 0 (term 6) ------------------------ DQ (term 3) ; ; GRD (term 2) ; +5V (term 1) ; ; 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 pin on PORTB CONSTANT BASE_VAR=0CH T_C EQU BASE_VAR+0 _N EQU BASE_VAR+1 ; these vars used by the O_BYTE EQU BASE_VAR+2 ; common 1-wire routines I_BYTE EQU BASE_VAR+3 LOOP3 EQU BASE_VAR+4 LOOP2 EQU BASE_VAR+5 LOOP1 EQU BASE_VAR+6 TEMP EQU BASE_VAR+7 ; Program ORG 000H MAIN: CALL CONFIG_DEVICE ; 0CH 01H, Includes 20 msec delay delay MAIN_1: CALL START_CONVERT ; EEH, Includes a 100 ms delay CALL READ_TEMP ; AAH followed by 8-bit read MOVWF T_C ; CALL STOP_CONVERT ; 22H CALL DISPLAY ; display T_C in natural binary MOVLW .120 ; delay for 30 seconds MOVWF LOOP3 MAIN_2: CALL DELAY_LONG DECFSZ LOOP3, F GOTO MAIN_2 GOTO MAIN_1 CONFIG_DEVICE: CALL INIT MOVLW 0CH MOVWF O_BYTE CALL OUT_BYTE MOVLW 03H ; single shot mode, active polarity = 1 MOVWF O_BYTE CALL OUT_BYTE MOVLW .20 ; delay for 20 msec to allow programming MOVWF LOOP1 CALL DELAY_N_MS RETURN START_CONVERT: CALL INIT MOVLW 0EEH MOVWF O_BYTE CALL OUT_BYTE MOVLW .100 ; delay for 100 msec to allow for conversion MOVWF LOOP1 CALL DELAY_N_MS RETURN READ_TEMP: CALL INIT MOVLW 0AAH MOVWF O_BYTE CALL OUT_BYTE CALL IN_BYTE MOVF I_BYTE, W RETURN STOP_CONVERT: CALL INIT MOVLW 22H MOVWF O_BYTE CALL OUT_BYTE RETURN DISPLAY: CALL LCD_CLR MOVF T_C, W 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