Autor Tema: Problema leyendo ds18b20  (Leído 8076 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado greulich

  • PIC10
  • *
  • Mensajes: 5
Problema leyendo ds18b20
« en: 26 de Abril de 2010, 19:09:22 »
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  ;-)


Código: [Seleccionar]
'-----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

Desconectado Veguepic

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2119
Re: Problema leyendo ds18b20
« Respuesta #1 en: 27 de Abril de 2010, 09:15:34 »
Mira no recuerdo mucho de microcode y estoy a la pasada pero lo que no veo en tu programa es el comando $33 que es el que se usa para leer la temperatura del sensor.

Luego lo reviso con mas calma.

Saludos
“Si la gente es buena sólo porque temen al castigo y porque esperan una recompensa, entonces verdaderamente somos un grupo lastimoso." Albert Einstein.

Saludos desde Lima , Peru    -    Hugo

Desconectado greulich

  • PIC10
  • *
  • Mensajes: 5
Re: Problema leyendo ds18b20
« Respuesta #2 en: 27 de Abril de 2010, 15:02:10 »
Gracias por responder Veguepic.

Segun entiendo el comando $33 es para leer la ROM, muy util si tuviera mas de un sensor conectado.
En este caso por eso se usa $CC que es para saltear la ROM y pasar a la conversion de la temperatura.

Corriganme si me equivoco.

Saludos !


--------Editado-----------

Estoy casi seguro que el problema puede ser por los retardos.
Tengo otro programa el cual funciona perfectamente, pero si no uso el cristal adecuado para el reloj me lee 111111.. en todos los bits del sensor, lo mismo que en este programa. Esto me hace pensar que el problema puede ser de retardos.

Espero puedan ayudarme!
Saludos !
« Última modificación: 27 de Abril de 2010, 23:57:09 por greulich »

Desconectado Veguepic

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2119
Re: Problema leyendo ds18b20
« Respuesta #3 en: 28 de Abril de 2010, 01:15:50 »
Hola, pues tu codigo tiene varias cosas que no entiendo y mas con lo oxidado que estoy en Microcode.

Mejor te doy la secuencia que uso en yo y que he comprobado en Proteus y fisicamente

pin DQ salida, envia $CC,$44              CC salta leer la ROM y 44 inicia la conversion
pin DQ entrada                                   Chequear el pin DQ mediante un IF, si es cero seguir chequeando, si es uno leer dato
pin DQ salida , envia $BE                    BE leer scratchpad donde esta el valor de la temperatura, se leer solo los dos primeros bytes donde esta el valor de la
                                                        temperatura y se envia un reset para cortar el envio del resto de datos.
Mostrar en LCD

Como consejo te diria que primero hagas solo esto y muestres el valor en el LCD como binario, decimal o hexadecimal, ya luego vemos de convertirlo a grados centigrados y temperaturas negativas.

Hacerlo todo junto hace mas dificil buscar el error, a mi me paso lo mismo y lo hice paso a paso y ahora me funiciona bien.

Pon tus resultados y lo revisamos.

Saludos.
“Si la gente es buena sólo porque temen al castigo y porque esperan una recompensa, entonces verdaderamente somos un grupo lastimoso." Albert Einstein.

Saludos desde Lima , Peru    -    Hugo

Desconectado greulich

  • PIC10
  • *
  • Mensajes: 5
Re: Problema leyendo ds18b20
« Respuesta #4 en: 28 de Abril de 2010, 01:37:36 »
Gracias de nuevo por responder !  :-/

Pues es basicamente lo que hace el programa
Inicializo y despues en la etiqueta "write1820:" hago eso que comentas.

Lo voy a hacer paso a paso como dices para ver si sale el error. Creo que es que no le doy tiempo en $44 y se me queda ahi. por eso me da 1111.. como lectura siempre.

Lo checo en esta semana y comento.

Gracias !!

Desconectado greulich

  • PIC10
  • *
  • Mensajes: 5
Re: Problema leyendo ds18b20
« Respuesta #5 en: 29 de Abril de 2010, 04:32:54 »
Bueno, aca el asunto.

Decidi hacer pruebas con el programa que si funciona en el Proteus

este es el codigo:

Código: [Seleccionar]
Busy        VAR BIT         ' Bit de ocupado
R_Temp      VAR WORD        ' temperatura leida directamente

    '--------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
   
Start_Convert: 'comienza conversion
    OWOUT   PortA.0, 1, [$CC, $44]' Salteo la ROM y hago conversion
   
Wait_Up: 'espera...
    OWIN    PortA.0, 4, [Busy]    'checa si esta ocupado
    IF      Busy = 0 THEN Wait_Up  'ocupado? espera otra vez...
    OWOUT   PortA.0, 1, [$CC, $BE] 'Saltea la ROM y lee la temperatura
    OWIN    PortA.0, 2, [R_Temp.Lowbyte, R_Temp.Highbyte] 'Lee 2 bits de temperatura
       
        IF R_Temp.Bit11 = 1 THEN    'Si el bit es 1, o es negativo o hay error en la lectura
            Lcdout $fe, 1,"**ERR o Neg**" 
            Lcdout $fe, $C0,IBIN16 R_Temp  'Muestra 111's
        ELSE
            Lcdout $fe, 1,"Leyendo..."
            Lcdout $fe, $C0,IBIN16 R_Temp  'muestra los bits de temperatura
        ENDIF

   
END

En el PROTEUS funciona perfectamente, tengo un swith en DQ  del ds18b20 para abrir y cerrar la comunicacion.
Si abro el swith me da "**ERR o Neg**" en el LCD, si lo cierro me da la temperatura. Hasta ahi todo bien.

El problema ahora es que cuando cargo el hex en el pic y lo pruebo este ya no hace nada.

Estoy usando el PICkit 2.
Los fuses en 3F50 (para usar el OSC interno del 16F628A)

Solo se queda el LCD como iniciando, pero no se ve nada.
El LCD funciona, ya que si solo mando un "texto" se visualiza bien, pero cuando agrego el codigo para el sensor ya no funciona.  :?

Sugerencias ??  :(


Desconectado septiembre_negro

  • PIC18
  • ****
  • Mensajes: 310
Re: Problema leyendo ds18b20
« Respuesta #6 en: 29 de Abril de 2010, 14:31:56 »
Bueno, aca el asunto.

Decidi hacer pruebas con el programa que si funciona en el Proteus

este es el codigo:

Código: [Seleccionar]
Busy        VAR BIT         ' Bit de ocupado
R_Temp      VAR WORD        ' temperatura leida directamente

    '--------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
   
Start_Convert: 'comienza conversion
    OWOUT   PortA.0, 1, [$CC, $44]' Salteo la ROM y hago conversion
   
Wait_Up: 'espera...
    OWIN    PortA.0, 4, [Busy]    'checa si esta ocupado
    IF      Busy = 0 THEN Wait_Up  'ocupado? espera otra vez...
    OWOUT   PortA.0, 1, [$CC, $BE] 'Saltea la ROM y lee la temperatura
    OWIN    PortA.0, 2, [R_Temp.Lowbyte, R_Temp.Highbyte] 'Lee 2 bits de temperatura
       
        IF R_Temp.Bit11 = 1 THEN    'Si el bit es 1, o es negativo o hay error en la lectura
            Lcdout $fe, 1,"**ERR o Neg**" 
            Lcdout $fe, $C0,IBIN16 R_Temp  'Muestra 111's
        ELSE
            Lcdout $fe, 1,"Leyendo..."
            Lcdout $fe, $C0,IBIN16 R_Temp  'muestra los bits de temperatura
        ENDIF

   
END

En el PROTEUS funciona perfectamente, tengo un swith en DQ  del ds18b20 para abrir y cerrar la comunicacion.
Si abro el swith me da "**ERR o Neg**" en el LCD, si lo cierro me da la temperatura. Hasta ahi todo bien.

El problema ahora es que cuando cargo el hex en el pic y lo pruebo este ya no hace nada.

Estoy usando el PICkit 2.
Los fuses en 3F50 (para usar el OSC interno del 16F628A)

Solo se queda el LCD como iniciando, pero no se ve nada.
El LCD funciona, ya que si solo mando un "texto" se visualiza bien, pero cuando agrego el codigo para el sensor ya no funciona.  :?

Sugerencias ??  :(






Pues a mí nunca me funciono en proto_board   :? :? y sigo sin entender porque; así que si también lo tienes montado en  placa de pruebas deberías probar  armando el cto.

Desconectado xocas

  • Administrador
  • PIC24H
  • *******
  • Mensajes: 2312
Re: Problema leyendo ds18b20
« Respuesta #7 en: 29 de Abril de 2010, 15:04:02 »
perdona si resulta demasiado obvio pero... ¿no tendrías que deshabilitar los comparadores? a proteus creo que le da lo mismo pero en la práctica no es así.

un saludo

Desconectado greulich

  • PIC10
  • *
  • Mensajes: 5
Re: Problema leyendo ds18b20
« Respuesta #8 en: 29 de Abril de 2010, 16:25:02 »

Gracias septiembre_negro, ya me esta funcionando. Igual y seria bueno que pusieras tu codigo y ver que pasa.

xocoas06 pues como veras no resulto tan obvio para alguien que no tiene muchos conocimientos.   :oops:  jejeje
Solo coloque la linea CMCON=7 despues de la declaracion de variables y ya funciono en el protoboard. Gracias !  :)

Ya tenia idea de que algo faltaba  :D   pero en mi afan de ir paso a paso olvide hacer otros pasos importantes.  :shock:

Bien, pues seguiremos adelante con el proyecto y mas adelante veremos que dudas salen   :-/

Estoy empezando con esto y mi finalidad es hacer un controlador de temperatura, y humedad. Asi que supongo que saldran varios errores.
A quien le interese este tipo de proyectos pues estoy a sus ordenes para ayudar (tambien acepto cualquier ayuda  :D ) tengo bastante documentacion ya que en los ratos libres me dedico a buscar informacion.

No soy experto pero la lucha se hace!!

De nuevo xocas06 muchas gracias !

Slaudos a todos !

Desconectado septiembre_negro

  • PIC18
  • ****
  • Mensajes: 310
Re: Problema leyendo ds18b20
« Respuesta #9 en: 29 de Abril de 2010, 21:06:48 »

Gracias septiembre_negro, ya me esta funcionando. Igual y seria bueno que pusieras tu codigo y ver que pasa.


Ase rato que deje de lado al pic Basic y al dc18b20   tal vez algún día lo haga funcionar :mrgreen: :mrgreen:
De cualquier manera  te agradezco  ;-)

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re: Problema leyendo ds18b20
« Respuesta #10 en: 14 de Diciembre de 2013, 09:39:37 »
hola.a mi tembien me dio problemas y comunicarme con el DS18B20 en el isis.pensaba que era problema de la resisencia pull-up.
ahora se que no era este el fallo.ahora mismo tengo puesto una de 4.7k en el isis.asi como esta escrito.

el problema estaba en los tiempos de retardo.al poner el crystal en el procesador 18F2550 en el procesador a 48Mhz.los ciclos
el retardo de 500ms se quedaba sobre los 50ms.y es porque al tener activado el PLL el cristal debia de ser de 4Mhz.

fisicamente uso un crystal de 4Mhz.y y si que sabia de est configuracion.pero creia que el isis funcionaba de otra forma.

y otra cosa que me ocurrio es que pude leer la rom del DS18B20 pero la temperatura seleccionada solo me daba los valores 0x50 y 0x05.
en el datasheet vi que estos valores se mandan por defecto.pero no sabia que en el simulador para visualizar la temperatura,hay que actualizar
constantemente al sensor.es decir hay que hacer un bucle cerrado e ir dandole a las flechitas.asi si que se puede leer el valor del sensor.


Montando mi primera impresora 3D (Raprep Prusa i3)