Microchip Davidtait LM75.TXT
; LM75.ASM
;
; Written by Aaron Hickman <Aaron.Hickman@drexel.edu>
; Added to PIC archive: 21/May/1998
LIST p=16c84
#include <p16c84.inc>
__CONFIG 11h
CONSTANT VARS=0CH
CONSTANT SCL=7
CONSTANT SDA=6 ; bits on Portb defined
CONSTANT TX=5
DEVICE_ADR EQU VARS+0 ; A2 A1 A0 address
O_BYTE EQU VARS+1 ; byte sent on I2C bus
I_BYTE EQU VARS+2 ; byte received on I2C bus
_N EQU VARS+3 ; index
_25US_LOOP EQU VARS+4 ; timing
IN_BYTE_MSB EQU VARS+5
IN_BYTE_LSB EQU VARS+6
BCD_0 EQU VARS+7
BCD_1 EQU VARS+8
BCD_2 EQU VARS+9
COUNT EQU VARS+10
TEMP EQU VARS+11
DATA_BYTE EQU VARS+12
SEROUT_LP EQU VARS+13
BAUD_RATE EQU VARS+14
DELAY_A EQU VARS+15
DELAY_B EQU VARS+16
DELAY_LP1 EQU VARS+17
DELAY_LP2 EQU VARS+18
FRACTION EQU VARS+19
ORG 000H
MOVLW 90H
MOVWF DEVICE_ADR
MOVLW 0EH
MOVWF BAUD_RATE
CONFIG_PORTS:
BSF STATUS, RP0 ; select Bank 1
MOVLW 1FH ; PORTB bits 7,6 & 4 = outputs and 4-0 & 5 = inputs
MOVWF TRISB
BCF STATUS, RP0 ; select Bank 0
READ_LM75:
CALL START
MOVF DEVICE_ADR, W
IORLW 01H
MOVWF O_BYTE
CALL OUT_BYTE
CALL NACK
CALL IN_BYTE
CALL ACK
MOVF I_BYTE, W
MOVWF IN_BYTE_LSB
CALL IN_BYTE
CALL NACK
CALL STOP
MOVF I_BYTE, W
MOVWF FRACTION
CLRF IN_BYTE_MSB
MOVLW 0CH
CALL DISPLAY
BTFSS IN_BYTE_LSB, 7
GOTO POSITIVE
MOVLW '-'
CALL DISPLAY
COMF IN_BYTE_LSB, W
MOVWF IN_BYTE_LSB
GOTO FINISHUP
POSITIVE:
MOVLW '+'
CALL DISPLAY
FINISHUP:
CALL BIN_BCD
MOVF BCD_1, W
CALL ASCII_LOW
CALL DISPLAY
MOVF BCD_2, W
CALL ASCII_HIGH
CALL DISPLAY
MOVF BCD_2, W
CALL ASCII_LOW
CALL DISPLAY
MOVLW '.'
CALL DISPLAY
BTFSC FRACTION, 7
MOVLW '5'
BTFSS FRACTION, 7
MOVLW '0'
CALL DISPLAY
MOVLW 0xDF
CALL DISPLAY
MOVLW 'C'
CALL DISPLAY
CALL DELAY
CALL DELAY
GOTO READ_LM75
DISPLAY:
CALL OUT_SER_CHAR
CALL DELAY_100US
RETURN
;************************************************************************
; The BCD values resulting from the CONVERT subroutine *
; are transmited via RS-232 protocol to a PC using the *
; following subroutine. The 8-bit values are sent using *
; the 8,N,1 format at 9600 baud (assuming a 2MHz ceramic *
; clock). *
;************************************************************************
OUT_SER_CHAR:
MOVWF DATA_BYTE
MOVLW .9
MOVWF SEROUT_LP
BCF STATUS, C
SEROUT1:
BTFSC STATUS, C
BCF PORTB, TX
BTFSS STATUS, C
BSF PORTB, TX
MOVFW BAUD_RATE
MOVWF DELAY_A
MOVFW BAUD_RATE
MOVWF DELAY_B
SEROUT2:
DECFSZ DELAY_A, F
GOTO SEROUT2
RRF DATA_BYTE, F
DECFSZ SEROUT_LP, F
GOTO SEROUT1
BCF PORTB, TX
NOP
NOP
SEROUT3:
DECFSZ DELAY_B, F
GOTO SEROUT3
NOP
RETURN
;**********************************************************************
; Unpack the BCD values stored in R1 and R2, ignoring R0. *
;**********************************************************************
ASCII_HIGH:
ANDLW 0xF0
MOVWF DATA_BYTE
SWAPF DATA_BYTE, W
ADDLW 30H
RETURN
ASCII_LOW:
ANDLW 0x0F
ADDLW 30H
RETURN
;************************************************************
; Delay subroutine for general use. *
;************************************************************
DELAY:
MOVLW 0xFF
MOVWF DELAY_LP1
DELAY_1:
MOVLW 0xFF
MOVWF DELAY_LP2
DELAY_2:
NOP
DECFSZ DELAY_LP2, F
GOTO DELAY_2
DECFSZ DELAY_LP1, F
GOTO DELAY_1
RETURN
DELAY_100US:
MOVLW .20
MOVWF DELAY_LP1
DELAY_100US_1:
NOP
NOP
DECFSZ DELAY_LP1, F
GOTO DELAY_100US_1
RETURN
;****************************************************************
; This routine converts a 16 bit binary number *
; to a 5 digit BCD number. The 16 bit binary *
; input locations are IN_BYTE_MSB and IN_BYTE_LSB. *
; The 5 digit BCD number is returned in BCD_0, *
; BCD_1 and BCD_2 with BCD_0 containing the most *
; significant digit in the low order nibble. *
;****************************************************************
BIN_BCD:
BCF STATUS, 0
MOVLW 10H
MOVWF COUNT
CLRF BCD_0
CLRF BCD_1
CLRF BCD_2
LOOP16:
RLF IN_BYTE_LSB, F
RLF IN_BYTE_MSB, F
RLF BCD_2, F
RLF BCD_1, F
RLF BCD_0, F
DECFSZ COUNT, F
GOTO ADJ_DEC
RETLW 0
ADJ_DEC:
MOVLW BCD_2
MOVWF FSR
CALL ADJ_BCD
MOVLW BCD_1
MOVWF FSR
CALL ADJ_BCD
MOVLW BCD_0
MOVWF FSR
CALL ADJ_BCD
GOTO LOOP16
ADJ_BCD:
MOVLW 3
ADDWF 0, W
MOVWF TEMP
BTFSC TEMP, 3
MOVWF 0
MOVLW 30
ADDWF 0, W
MOVWF TEMP
BTFSC TEMP, 7
MOVWF 0
RETLW 0
; The following routines are low level I2C routines applicable to most
; interfaces with I2C devices.
IN_BYTE ; read byte on i2c bus
CLRF I_BYTE
MOVLW .8
MOVWF _N ; set index to 8
CALL HIGH_SDA ; be sure SDA is configured as input
IN_BIT
CALL HIGH_SCL ; clock high
BTFSS PORTB, SDA ; test SDA bit
GOTO IN_ZERO
GOTO IN_ONE
IN_ZERO
BCF STATUS, C ; clear any carry
RLF I_BYTE, F ; i_byte = i_byte <lt 1 | 0
GOTO CONT_IN
IN_ONE
BCF STATUS, C ; clear any carry
RLF I_BYTE, F
INCF I_BYTE, F ; i_byte = (i_byte <lt 1) | 1
GOTO CONT_IN
CONT_IN
CALL LOW_SCL ; bring clock low
DECFSZ _N, F ; decrement index
GOTO IN_BIT
RETURN
;**********************************************
OUT_BYTE: ; send o_byte on I2C bus
MOVLW .8
MOVWF _N
OUT_BIT:
BCF STATUS,C ; clear carry
RLF O_BYTE, F ; left shift, most sig bit is now in carry
BTFSS STATUS, C ; if one, send a one
GOTO OUT_ZERO
GOTO OUT_ONE
OUT_ZERO:
CALL LOW_SDA ; SDA at zero
CALL CLOCK_PULSE
CALL HIGH_SDA
GOTO OUT_CONT
OUT_ONE:
CALL HIGH_SDA ; SDA at logic one
CALL CLOCK_PULSE
GOTO OUT_CONT
OUT_CONT:
DECFSZ _N, F ; decrement index
GOTO OUT_BIT
RETURN
NACK: ; bring SDA high and clock
CALL HIGH_SDA
CALL CLOCK_PULSE
RETURN
ACK:
CALL LOW_SDA
CALL CLOCK_PULSE
RETURN
START:
CALL LOW_SCL
CALL HIGH_SDA
CALL HIGH_SCL
CALL LOW_SDA ; bring SDA low while SCL is high
CALL LOW_SCL
RETURN
STOP:
CALL LOW_SCL
CALL LOW_SDA
CALL HIGH_SCL
CALL HIGH_SDA ; bring SDA high while SCL is high
CALL LOW_SCL
RETURN
CLOCK_PULSE: ; SCL momentarily to logic one
CALL HIGH_SCL
CALL LOW_SCL
RETURN
HIGH_SDA: ; high impedance by making SDA an input
BSF STATUS, RP0 ; bank 1
BSF TRISB, SDA ; make SDA pin an input
BCF STATUS, RP0 ; back to bank 0
CALL DELAY_SHORT
RETURN
LOW_SDA:
BCF PORTB, SDA
BSF STATUS, RP0 ; bank 1
BCF TRISB, SDA ; make SDA pin an output
BCF STATUS, RP0 ; back to bank 0
CALL DELAY_SHORT
RETURN
HIGH_SCL:
BSF STATUS, RP0 ; bank 1
BSF TRISB, SCL ; make SCL pin an input
BCF STATUS, RP0 ; back to bank 0
CALL DELAY_SHORT
RETURN
LOW_SCL:
BCF PORTB, SCL
BSF STATUS, RP0 ; bank 1
BCF TRISB, SCL ; make SCL pin an output
BCF STATUS, RP0 ; back to bank 0
CALL DELAY_SHORT
RETURN
DELAY_SHORT: ; provides nominal 25 usec delay
MOVLW .5
MOVWF _25US_LOOP
DELAY_SHORT_1:
NOP
DECFSZ _25US_LOOP, F
GOTO DELAY_SHORT_1
RETURN
END
file: /Techref/microchip/davidtait/lm75.txt, 10KB, , updated: 2001/4/17 11:15, local time: 2024/12/25 21:19,
|
| ©2024 These pages are served without commercial sponsorship. (No popup ads, etc...).Bandwidth abuse increases hosting cost forcing sponsorship or shutdown. This server aggressively defends against automated copying for any reason including offline viewing, duplication, etc... Please respect this requirement and DO NOT RIP THIS SITE. Questions? <A HREF="http://linistepper.com/techref/microchip/davidtait/lm75.txt"> microchip davidtait lm75</A> |
Did you find what you needed?
|