EJECT ;**************************************** ;* * ;* DS18S20 Driver * ;* Stand: 22.2.2005 * ;* * ;**************************************** EXTERN XTAL EXTERN DS18S20_Port Public DS18S20_Reset ; C := DS18S20[B] Public DS18S20_Read ; A := DS18S20[B] Public DS18S20_Write ; DS18S20[B] := A Public GetTemperatur ; DPTR := Temperatur[B] Public SetTemperatur ; C := Reset[B] EJECT ; List Off ;------------------------------------------------------------------------------- Include MACROS.INC Timer4 Macro Value Mov R1, #XTAL/48*Value/1000000 @@1: NOP NOP DJNZ R1, @@1 EndM Timer2 Macro Value Mov R1, #XTAL/24*Value/1000000 DJNZ R1, $ EndM Timer0 Macro Value Mov R1, #XTAL/24*Value/1000000 EndM ;------------------------------------------------------------------------------- ; C := Reset[B] DS18S20_Reset: Mov A, B CPL A Anl DS18S20_Port, A Timer4 480;us CPL A Orl DS18S20_Port, A Timer2 66;us Mov A, DS18S20_Port Anl A, B Anl A, DS18S20_Port Timer4 450;us Anl A, DS18S20_Port Clr C JZ Reset1 SetB C Reset1: Ret ;C -> Sensor Error! ;------------------------------------------------------------------------------- ; A := DS18S20[B] DS18S20_Read: mov R0, #8 clr a Read1: CLR_B DS18S20_Port SETB_B DS18S20_Port Timer2 15;us PUSH A Mov A, DS18S20_Port Anl A, B Clr C JZ Read2 SetB C Read2: POP A RRC A Timer2 50;us Djnz R0, Read1 Ret ;------------------------------------------------------------------------------- ; DS18S20[B] := A ; 0 Lo|60..120us|Hi| 1.. 15us ; 1 Lo| 1.. 15us|Hi|60..120us DS18S20_Write: mov R0, #8 WRITE1: CLR_B DS18S20_Port Timer0 90;us rrc a JC WRITE2 DJNZ R1 ,$ Timer0 8;us WRITE2: SETB_B DS18S20_Port DJNZ R1, $ Djnz R0,WRITE1 Ret ;------------------------------------------------------------------------------- ; DTPR = Temperatur[B] ;In: B = Sensor ;Out: DPTR = Temperatur als 2er-Komplement ; C = 1 bei Fehler GetTemperatur: Call DS18S20_Reset JC GetTemperatur4 mov A,#0CCH ; Skip ROM call DS18S20_Write mov A,#0BEH ; read 9 Byte call DS18S20_Write call DS18S20_Read ; Read the Byte1 (T,LSB) Clr F0 mov DPH, A call DS18S20_Read ; Read the Byte2 (T,MSB) RLC a ; Sig -> C RRC_ DPH ; Int(T) call DS18S20_Read ; Read the Byte3 (User0,4BH) call DS18S20_Read ; Read the Byte4 (User1,46H) call DS18S20_Read ; Read the Byte5 (res,FFH) call DS18S20_Read ; Read the Byte6 (res,FFH) call DS18S20_Read ; Read the Byte7 (R) MOV DPL, A ; call DS18S20_Read ; Read the Byte8 (16 per °C) ; call DS18S20_Read ; Read the Byte9 (CRC) Mov B, #100 Mov A, DPH JnB A.7, GetTemperatur1 SetB F0 ;T = |T| CPL A Inc A GetTemperatur1: Mul AB ;T = T * 100 JnB F0, GetTemperatur2 XRL B, #0FFH ;T = -T CPL A Add A, #1 JnC GetTemperatur2 Inc B GetTemperatur2: SubB A, #25 ;T = T -25 XCH A, B SubB A, #0 MOV DPH, A Mov A, DPL ;R[1..16] Call GetTempTab ;A=round((16-R)/16) Add A, B ;T = T + A Mov DPL, A JnC GetTemperatur3 Inc DPH GetTemperatur3: Clr C ; mov dptr,#+200 ; mov dptr,#-200 GetTemperatur4: Ret ;------------------------------------------------------------------------------- GetTempTab: MovC A, @A+PC ;A= PC[A+1] Ret ;1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 DivTempTab: DB 94,88,81,75,69,63,56,50,44,38,31,25,19,13,06,0 ;------------------------------------------------------------------------------- ;In B = Sensor ;Out C = Fehler SetTemperatur: Call DS18S20_Reset JC SetTemperatur1 mov A,#0CCH ; Skip ROM call DS18S20_Write mov A,#044H ; Start Convert call DS18S20_Write Clr C SetTemperatur1: Ret ;------------------------------------------------------------------------------- End