Yes, it works, but you have tu use #PB_SerialPort_Nohandshake.
With #PB_SerialPort_RtsCtsHandshake it gives me 0.0
With #PB_SerialPort_NoHandshake it gives me :
This is the modified code, with #PB_SerialPort_NoHandshake
Code: Select all
;
; DS1631 at a serial port
;
#StartConvertT = $51
#StopConvertT = $22
#ReadTemperature = $AA
#AccessTH = $A1
#AccessTL = $A2
#AccessConfig = $AC
#SoftwarePOR = $54
#IIC_Read = $01
#IIC_Write = $00
#IIC_Ack = #True
#IIC_Nack = #False
#Accuracy9Bit = $00
#Accuracy10Bit = $04
#Accuracy11Bit = $08
#Accuracy12Bit = $0C
Procedure.i open_iic_bus()
comport.s = "COM1"
OpenSerialPort(0, comport, 9600, #PB_SerialPort_NoParity, 8, 1, #PB_SerialPort_NoHandshake, 1, 1)
EndProcedure
Procedure close_iic_bus()
CloseSerialPort(0)
EndProcedure
Procedure iic_wait()
EndProcedure
Procedure SDA_value()
ProcedureReturn GetSerialPortStatus(0, #PB_SerialPort_CTS)
EndProcedure
Procedure SDA_low()
SetSerialPortStatus(0, #PB_SerialPort_DTR, 0)
iic_wait()
EndProcedure
Procedure SDA_high()
SetSerialPortStatus(0, #PB_SerialPort_DTR, 1)
iic_wait()
EndProcedure
Procedure SCL_low()
SetSerialPortStatus(0, #PB_SerialPort_RTS, 0)
iic_wait()
EndProcedure
Procedure SCL_high()
SetSerialPortStatus(0, #PB_SerialPort_RTS, 1)
iic_wait()
EndProcedure
Procedure SDA_input()
SetSerialPortStatus(0, #PB_SerialPort_DTR, 1)
EndProcedure
Procedure SDA_output()
SetSerialPortStatus(0, #PB_SerialPort_DTR, 1)
EndProcedure
Procedure IIC_rx_bit()
SDA_input()
SCL_low()
SCL_high()
retval = SDA_value()
SCL_low()
ProcedureReturn retval
EndProcedure
Procedure IIC_tx_bit_0()
SCL_low()
SDA_output()
SDA_low()
SCL_high()
SCL_low()
EndProcedure
Procedure IIC_tx_bit_1()
SCL_low()
SDA_output()
SDA_high()
SCL_high()
SCL_low()
EndProcedure
Procedure IIC_rx_byte(Acknowledge)
retval = 0
For i = 0 To 7
retval << 1
If IIC_rx_bit()
retval | $01
EndIf
Next i
If Acknowledge
IIC_tx_bit_0()
Else
IIC_tx_bit_1()
EndIf
ProcedureReturn retval
EndProcedure
Procedure IIC_tx_byte(Byte)
;Debug Hex(Byte)
For i = 0 To 7
If Byte & $80
IIC_tx_bit_1()
Else
IIC_tx_bit_0()
EndIf
Byte << 1
Next i
ProcedureReturn IIC_rx_bit()
EndProcedure
Procedure IIC_stop()
SDA_output()
SDA_low()
SCL_high()
SDA_high()
EndProcedure
Procedure IIC_start()
SDA_output()
SDA_high()
SCL_high()
SDA_low()
EndProcedure
Procedure.f DS1631ReadTemperature(Address, Accuracy)
Address << 1
open_iic_bus()
IIC_stop()
IIC_start()
IIC_tx_byte(Address | #IIC_Write)
IIC_tx_byte(#StopConvertT)
IIC_stop()
IIC_start()
IIC_tx_byte(Address | #IIC_Write)
IIC_tx_byte(#AccessConfig)
IIC_tx_byte(Accuracy)
IIC_stop()
IIC_start()
IIC_tx_byte(Address | #IIC_Write)
IIC_tx_byte(#StartConvertT)
IIC_stop()
Select Accuracy
Case #Accuracy9Bit : Delay(100)
Case #Accuracy10Bit : Delay(200)
Case #Accuracy11Bit : Delay(400)
Case #Accuracy12Bit : Delay(800)
EndSelect
IIC_start()
IIC_tx_byte(Address | #IIC_Write)
IIC_tx_byte(#ReadTemperature)
IIC_start()
IIC_tx_byte(Address | #IIC_Read)
Value.u = IIC_rx_byte(#IIC_Ack) << 8
Value | IIC_rx_byte(#IIC_Nack)
IIC_stop()
Debug Value
If Value & $8000 ; if sign bit is set, then temp is negative
temperature.f = (Value - 65536) / 256.0
Else
temperature.f = Value / 256.0
EndIf
;temperature =(temperature * 9/5) + 32 ; Fahrenheit
ProcedureReturn temperature
EndProcedure
For i = 1 To 1
Debug DS1631ReadTemperature($48, #Accuracy12Bit)
; Delay(1000)
Next i