Que tal?
Tengo un problema simulando en ISIS un un circuito con un sensor ds18b20 y un 16f628a
Usando como base un programa de
www.neoteo.com, un poco de codigo encontrado por aqui y junto con una simulacion ya funcional me hice este programa basic en MicroCode Studio
Ya he buscado y esto que tengo es todo lo que he encotrado.
El caso es que cuando comienzo la simulacion solo me marca "-127" com temperatura (solo estoy tratando con la parte entera solamente)
veo que los valores de tempe.0 hasta tempe.15 siempre estan en 1
Ya lo he checado paso por paso y no le encuentro por donde este el error
Casi seguro que no es problema del Proteus ya que una simulacion con ese mismo sensor funciona bien (tmbn use parte de ese codigo para el mio)
Puede ser problema de reloj, aunque me base en varios ejemplos y use los mismos tiempos de espera.
En fin, ya no se que mas hacerle
Imagino el error puede estar en la etiqueta "read1820"; no le entiendo muy bien, pero creo que algo falta o sobra, o algo no cuadra bien ahi
Ahi les dejo el codigo.
saludos a todos y de antemano gracias
'-----Defino variables
aux VAR Byte ' Variable tipo Byte multiproposito
comando VAR Byte 'Comando a enviar al DS1820
tempe VAR Word 'Temperatura leida
DS_TSensor VAR Bit
Neg_Pos_Temp VAR Byte
f_temp VAR Word
f_dpart1 Var word
f_ndpart1 Var word
f_zeros Var byte
'-----Defino alias
Symbol ds1820pin = PORTA.4 'Puerto en que se conecta el DS1820
Symbol ds1820rw = TRISA.4 '1=Leer DS1820 / 0=Escribir DS1820
'---------Inicializo puertos
TRISA = %00010000 '0 = salida
TRISB = %11111111 '0 = salida
PORTB = 0 ' PORTB todo en 0
'--------Configuro el puerto para el LCD:
DEFINE LCD_DREG PORTB 'UTILIZAR 4 BITS DEL PUERTO B PARA TX DE DATOS
DEFINE LCD_DBIT 4 'DESDE EL BIT B.4 AL BIT B.7
DEFINE LCD_RSREG PORTB'SELECCIÓN DEL PUERTO DEL REGISTRO
DEFINE LCD_RSBIT 1 'EN EL BIT B.1
DEFINE LCD_EREG PORTB 'UTILIZAR EL ENABLE EN EL PUERTO B
DEFINE LCD_EBIT 2 'EN EL BIT B.2
' PAUSA DE INICIO DEL LCD
PAUSEUS 500
loop:
'--------Leo la temperatura del sensor
Gosub init1820 'Inicializo el sensor y...
comando = $cc '..salteo la ROM.
Gosub write1820
comando = $44 'Comienzo la conversion A/D de la temperatura
Gosub write1820
pause 1000 ' Espero a que termine la conversion
Gosub init1820 'Inicializo el sensor y...
comando = $cc '..salteo la ROM.
Gosub write1820
comando = $be 'Pido que me envie lo que calculo el sensor...
Gosub write1820
pause 750
Gosub read1820 'Me devuelve la temperatura
'If DS_TSensor=1 then
LCDOUT $FE, 1," * No Device * "
pause 500
LCDOUT $FE, 1 ' Limpiar LCD
'Else
LCDOUT $FE, 1," La temperatura "
Lcdout $fe, $C2,Neg_Pos_Temp
Lcdout $fe, $C4,dec f_ndpart1
'while f_zeros>0
' Lcdout $fe, $C10,dec 0
' f_zeros=f_zeros-1
' wend
' Lcdout $fe, $C9, dec f_dpart1
Endif
pause 100
GOTO loop 'Vuelvo a loop: para repetir indefinidamente.
'------RUTINAS
'-------------------------------------------------
'Inicializa el DS1820
'-------------------------------------------------
init1820:
ds1820rw = 0 'pongo el pin como salida
ds1820pin = 0 'Pongo en cero el pin del DS1820
pauseus 500 'Espero mas de 480 us
ds1820rw = 1 'pin como entrada
pauseus 100 ' Espero mas de 60 us a que "reaccione"
DS_TSensor = ds1820pin 'saber si esta conectado el pin
pauseus 400
Return
'-------------------------------------------------
'Escribe el DS1820
'-------------------------------------------------
write1820:
For aux = 0 To 7 'Recorro los 8 bits de "Comando"
ds1820rw = 0 'pin como salida
ds1820pin = 1 'pin en bajo
If comando.0 = 0 Then
pauseus 60 'hay que mantener bajo el pin mas 60 us
ds1820rw = 1
Else
pauseus 5 'hay que mantener bajo el pin menos de 15 60 us
ds1820rw = 1
pauseus 55 'espero el resto del tiempo...
Endif
comando = comando >> 1
Next aux
Return
'-------------------------------------------------
'Lee temperatura del DS1820
'-------------------------------------------------
read1820:
For aux = 1 To 16 ' los 16 bits de temp (word)
tempe = tempe >> 1
ds1820rw = 0
ds1820pin = 0
pauseus 1
ds1820rw = 1
tempe.15 = ds1820pin
pauseus 59
Next aux
f_temp=0
Neg_Pos_Temp="+"
If (tempe.15=1 and tempe.14=1 and tempe.13=1 and tempe.12=1 and tempe.11=1) Then
Neg_Pos_Temp="-"
Endif
f_ndpart1=0
if tempe.10=1 then
f_temp=f_temp+64
endif
if tempe.9=1 then
f_temp=f_temp+32
endif
if tempe.8=1 then
f_temp=f_temp+16
endif
if tempe.7=1 then
f_temp=f_temp+8
endif
if tempe.6=1 then
f_temp=f_temp+4
endif
if tempe.5=1 then
f_temp=f_temp+2
endif
if tempe.4=1 then
f_temp=f_temp+1
endif
f_ndpart1 = f_temp
Return