197 lines
4.8 KiB
NASM
197 lines
4.8 KiB
NASM
|
;------------------------------------------------------------------------------
|
||
|
;
|
||
|
;------------------------------------------------------------------------------
|
||
|
.equ OW_PORT = PORTB
|
||
|
.equ OW_PIN = PINB
|
||
|
.equ OW_DDR = DDRB
|
||
|
.equ OW_DQ = PB0
|
||
|
|
||
|
.def OWCount = r17
|
||
|
|
||
|
|
||
|
|
||
|
#define ReadRom 0x33
|
||
|
#define SkipRom 0xcc
|
||
|
#define ConvertTemp 0x44 ; Initiates temperature conversion.
|
||
|
#define WScratch 0x4e ; Writes data into scratchpad bytes 2, 3, and4 (TH, TL, and configuration registers).
|
||
|
#define RScratch 0xbe
|
||
|
;------------------------------------------------------------------------------
|
||
|
;
|
||
|
;------------------------------------------------------------------------------
|
||
|
|
||
|
;------------------------------------------------------------------------------
|
||
|
; Data segment, variable definitions
|
||
|
;------------------------------------------------------------------------------
|
||
|
.dseg
|
||
|
TempWord: .byte 3
|
||
|
TRegister: .byte 3
|
||
|
ConfigRegister: .byte 2
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
.cseg
|
||
|
;------------------------------------------------------------------------------
|
||
|
; Output : T - presence bit
|
||
|
;------------------------------------------------------------------------------
|
||
|
OWReset:
|
||
|
cbi OW_PORT,OW_DQ
|
||
|
sbi OW_DDR,OW_DQ
|
||
|
|
||
|
ldi XH, HIGH(DVUS(470))
|
||
|
ldi XL, LOW(DVUS(470))
|
||
|
rcall Wait4xCycles
|
||
|
|
||
|
cbi OW_DDR,OW_DQ
|
||
|
|
||
|
ldi XH, HIGH(DVUS(70))
|
||
|
ldi XL, LOW(DVUS(70))
|
||
|
rcall Wait4xCycles
|
||
|
|
||
|
set
|
||
|
sbis OW_PIN,OW_DQ
|
||
|
clt
|
||
|
|
||
|
ldi XH, HIGH(DVUS(240))
|
||
|
ldi XL, LOW(DVUS(240))
|
||
|
rcall Wait4xCycles
|
||
|
|
||
|
ret
|
||
|
;------------------------------------------------------------------------------
|
||
|
; Input : C - bit to write
|
||
|
;------------------------------------------------------------------------------
|
||
|
OWWriteBit:
|
||
|
brcc OWWriteZero
|
||
|
ldi XH, HIGH(DVUS(1))
|
||
|
ldi XL, LOW(DVUS(1))
|
||
|
rjmp OWWriteOne
|
||
|
OWWriteZero:
|
||
|
ldi XH, HIGH(DVUS(120))
|
||
|
ldi XL, LOW(DVUS(120))
|
||
|
OWWriteOne:
|
||
|
sbi OW_DDR, OW_DQ
|
||
|
rcall Wait4xCycles
|
||
|
cbi OW_DDR, OW_DQ
|
||
|
|
||
|
ldi XH, HIGH(DVUS(60))
|
||
|
ldi XL, LOW(DVUS(60))
|
||
|
rcall Wait4xCycles
|
||
|
ret
|
||
|
;------------------------------------------------------------------------------
|
||
|
; Input : r16 - byte to write
|
||
|
;------------------------------------------------------------------------------
|
||
|
OWWriteByte:
|
||
|
push OWCount
|
||
|
ldi OWCount,0
|
||
|
OWWriteLoop:
|
||
|
ror r16
|
||
|
rcall OWWriteBit
|
||
|
inc OWCount
|
||
|
cpi OWCount,8
|
||
|
brne OWWriteLoop
|
||
|
pop OWCount
|
||
|
ret
|
||
|
;------------------------------------------------------------------------------
|
||
|
; Output : C - bit from slave
|
||
|
;------------------------------------------------------------------------------
|
||
|
OWReadBit:
|
||
|
ldi XH, HIGH(DVUS(1))
|
||
|
ldi XL, LOW(DVUS(1))
|
||
|
sbi OW_DDR, OW_DQ
|
||
|
rcall Wait4xCycles
|
||
|
cbi OW_DDR, OW_DQ
|
||
|
ldi XH, HIGH(DVUS(5))
|
||
|
ldi XL, LOW(DVUS(5))
|
||
|
rcall Wait4xCycles
|
||
|
clt
|
||
|
sbic OW_PIN,OW_DQ
|
||
|
set
|
||
|
ldi XH, HIGH(DVUS(50))
|
||
|
ldi XL, LOW(DVUS(50))
|
||
|
rcall Wait4xCycles
|
||
|
sec
|
||
|
brts OWReadBitEnd
|
||
|
clc
|
||
|
OWReadBitEnd:
|
||
|
ret
|
||
|
;------------------------------------------------------------------------------
|
||
|
; Output : r16 - byte from slave
|
||
|
;------------------------------------------------------------------------------
|
||
|
OWReadByte:
|
||
|
push OWCount
|
||
|
ldi OWCount,0
|
||
|
OWReadLoop:
|
||
|
rcall OWReadBit
|
||
|
ror r16
|
||
|
inc OWCount
|
||
|
cpi OWCount,8
|
||
|
brne OWReadLoop
|
||
|
pop OWCount
|
||
|
ret
|
||
|
;------------------------------------------------------------------------------
|
||
|
; 18b20 MainReadTemp
|
||
|
;------------------------------------------------------------------------------
|
||
|
MainReadTemp:
|
||
|
|
||
|
ldi YL,LOW(TempWord)
|
||
|
ldi YH,HIGH(TempWord)
|
||
|
rcall OWReset ; One wire reset
|
||
|
brts MainReadTemp ; If device not present go to MainLoop
|
||
|
rcall OWReset ; One wire reset
|
||
|
brts MainReadTemp ; If device not present go to MainLoop
|
||
|
rcall OWReset ; One wire reset
|
||
|
brts MainReadTemp ; If device not present go to MainLoop
|
||
|
ldi r16,SkipRom ; Write Skip Rom one wire in "single-drop"
|
||
|
rcall OWWriteByte ;
|
||
|
ldi r16, RScratch ; Write ConvertCommand
|
||
|
rcall OWWriteByte ;
|
||
|
rcall OWReadByte
|
||
|
st Y+, r16 ; Store TEMPERATURE LSB(50h) byte to table, and increment pointer
|
||
|
mov r21, r16
|
||
|
rcall OWReadByte
|
||
|
st Y+, r16 ; Store TEMPERATURE MSB(05h) byte to table, and increment pointer
|
||
|
mov r22, r16
|
||
|
ret
|
||
|
|
||
|
TempRequest:
|
||
|
rcall OWReset ; One wire reset
|
||
|
brts MainReadTemp ; If device not present go to MainLoop
|
||
|
|
||
|
ldi r16,SkipRom ; Write Skip Rom one wire in "single-drop"
|
||
|
rcall OWWriteByte ;
|
||
|
ldi r16, ConvertTemp ; Write ConvertCommand
|
||
|
rcall OWWriteByte ;
|
||
|
ldi r16, 188
|
||
|
rcall WaitMiliseconds
|
||
|
reti
|
||
|
|
||
|
ConvertTempForLCD: ;r18 contiendra la partie décimal et xl la partie entiere
|
||
|
push r16
|
||
|
push r17
|
||
|
ldi YL,LOW(TempWord)
|
||
|
ldi YH,HIGH(TempWord)
|
||
|
ld XL, Y+
|
||
|
ld XH, Y+
|
||
|
lsr XL
|
||
|
lsr XL ;Sup des deux bit inutilisé
|
||
|
ldi r16, 0x03
|
||
|
mov r18, XL
|
||
|
AND r18, r16
|
||
|
ldi r16, 25
|
||
|
mul r18, r16
|
||
|
movw r18, r0
|
||
|
lsr XL
|
||
|
lsr XL ;Sup des deux bit de fraction
|
||
|
ldi r16, 15
|
||
|
and XH,r16
|
||
|
ROR XH
|
||
|
ROR XH
|
||
|
ROR XH
|
||
|
ROR XH
|
||
|
ROR XH ; xh>>4+1(+1 pour le carry)
|
||
|
or XL,XH
|
||
|
|
||
|
pop r17
|
||
|
pop r16
|
||
|
ret
|