Hola, he intentado simular con proteus la programacion del DS1820, pero no he sido capaz de hacerlo funcionar.
He encontrado en el foro de Pic´s una manera de hacerlo de la siguiente forma:
'Read_1620:
' RST = 1
' SHIFTOUT DQ,CLK0,LSBFIRST,[$0C,$02] ' Continuous convert, CPU mode
' RST = 0
' PAUSE 10 ' Minimum wait time after write
' RST = 1 ' Enable 1620
' SHIFTOUT DQ, CLK0, LSBFIRST, [$EE] ' Send start temp convert command
' RST = 0 ' Disable 1620
' PAUSE 1000 ' Wait for conversion to complete
' RST = 1 ' Enable 1620
' SHIFTOUT DQ, CLK0, LSBFIRST, [$AA] ' Send read temp command
' SHIFTIN DQ, CLK0, LSBPRE, [Temp\9] ' Read 9 bit temperature
' RST = 0 ' Disable 1620
' Temp = Temp/2 ' Scale reading to whole degrees C.
' Temp = (Temp */ $01CC) ' Multiply by 1.8.
' Temp = Temp + 32 ' Complete C to F conversion.
' IF Temp > 99 THEN Ouch ' Is Temp > 99 deg F..?
' HSEROUT [DEC Temp DIG 1,".",DEC Temp DIG 0,13,10]
' Temp = (Temp DIG 1*16)+Temp DIG 0 ' No. Convert to BCD
Esta es la configuración básica para usarlo como termómetro, no he probado simularlo con un pic
porque no tengo el picbasic pro.
Leyendo las hojas de datos y comparándo el código me dá la impresión de que tiene que funcionar.
Intenté traducir a bascom éstas líneas y me ha quedado de esta forma:
$regfile = "m32def.dat"
$crystal = 8000000
$baud = 19200
$hwstack = 32
$swstack = 10
$framesize = 40
Portb = &B01000000
Ddrb = &B11110000
Dim Write_config_command As Byte
Dim Continuous_conversion As Byte
Dim Start_convert_t_command As Byte
Dim Read_temp_command As Byte
Dim Temp As Byte
Dim Temperatura As Integer
Write_config_command = &H0C
Continuous_conversion = &H02
Start_convert_t_command = &HEE
Read_temp_command = &HAA
Dq Alias Portb.4
Rst Alias Portb.7
Clk Alias Portb.6
Set Rst
Shiftout Dq , Clk , Write_config_command , Continuous_conversion , 2 , 8
Reset Rst
Waitms 100
Set Rst
Shiftout Dq , Clk , Start_convert_t_command , 2 , 8
Reset Rst
Waitms 100
Do
Set Rst
Shiftout Dq , Clk , Read_temp_command , 2 , 8
Shiftin Dq , Clk , Temperatura , 2 , 9
Reset Rst
Temp = Temperatura / 2
Print "temperature: " ; Temp
Waitms 1000
Loop
End
Tanto en el shiftin como el shiftout los he probado con los modos 2 y 3, pero no he notado ninguna diferencia en el funcionamiento.
Me he encontrado con una diferencia en el código que usé de ejemplo con la hoja de datos en que en el primero hace referencia a
que el valor para conseguir una conversión continua es &H02 y no &H00 como esta en la pagina 9 de la hoja de datos.
Según ésta &H02 es un comando de escritura del umbral de temperatura inferior.
Lo raro es que he visto utilizado &H02 en un ejemplo de Basic Stamp.
Como ven, no he seguido el ejemplo al 100% ya que las conversiones para poder ver la temperatura las he dejado por la mitad pero tiene que ser suficiente para poder ver que los valores cambian cuando modifico el DS1620.
Soy nuevo programando Atmel y aunque la información que trae bascom es buena muchas cosas se aprenden probando.
Para los que quieran usar constantes con shiftin y shiftout solo quiero comentar que estas no funcionan, dan error al compilar. por eso he tenido que declarar variables y luego pasarles el valor.
Si alguien tiene un poco de experiencia en esto se agradece un empujoncito para poder arrancar.
Saludos y buen fin de semana.