TODOPIC

Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: Enner en 30 de Agosto de 2016, 15:18:55

Título: Problemas con el sensor LM92
Publicado por: Enner en 30 de Agosto de 2016, 15:18:55
Hey.

Buscando en el foro si alguien había trabajado con el sensor de temperatura LM92, fui a un link que me llevo al código
del LM92 desarrollado por Mario guillote (gracias)!

y ahora quería hacer una librería, pero desgraciadamente no funciona, los valores en las variables temperaturas que sale en el display son fijas, aunque ponga el dedo o el soldador no varía.

En la placa de circuito impreso tengo también montado el RTC DS3231 y funciona correctamente, aunque con resistencias de 2k2 porque si pongo de 10K, tal como pone en el DataSheet del LM92 no funciona,
aunque como en el display la temperatura del LM92 siempre es fija, decidí poner resistencias pull-up de 10K y nada naturalmente el reloj DS3231 dejo de funcionar hasta que nuevamente puse las pull-up de 2k2.

No creo que por esas resistencias de 2K2 en el bus (SDA y SCL) el LM92 no me de lectura.


Los Valores que salen son los siguientes:

TEM_R_LM92 = 0
TEMP_LM92 = 0.055

y si pongo el el comando "HBReStart" en la lectura sale esto otro

TEM_R_LM92 = 1111111111111
TEMP_LM92 = 296.955

los valores siempre son fijos como explique arriba.



El Código de la librería es el siguiente:
Código: [Seleccionar]
$ifndef __LM92_INC_
$define __LM92_INC_
'
 
' LM92 variables
'
  Dim TEM_R_LM92 As Word       ' VARIABLE WORD DE 16 BITS PARA LEER
  Dim ONLY_REG_TEMP As Word    ' VALOR DE TEMPERATURA DESPUES DE EXTRER LOS 3 BITS LSB
  Dim ManoFAct As Word                   
                               ' DATOS DE LAS ALARMAS                         
  Dim ONLY_TEMP As Byte        ' T1 ES LA PARTE ENTERA DE LA TEMPERATURA MEDIDA
  Dim EXTRACT_DECIM As Word    ' T3 SON LOS DECIMALES QUE EXTRAIGO DEL
                               ' PRIMER BYTE EN BINARIO
  Dim ONLY_DECIM As Float      ' T4 SERÁN LOS DECIMALES A MOSTRAR EN EL LCD
  Dim TEMP_LM92 As Float       ' TEMPERATURA FINAL A MOSTRAR EN EL LCD
'
'
' LM92 register addresses
'
     $define READ_LM92   $97    ' A0=1 A1=1, 10010111 I2C ADRESS LM92 READ
     $define WRITE_LM92  $96    ' A0=1 A1=1, 10010110 I2C ADRESS LM92 WRITE
    ' $define ADRESS_LM92 $4B   ' A0=1 A1=1, 1001011X  I2C ADRESS LM92 ACK
     $define POINT_LM92  $00   ' TEMPERATURA POINT (READ ONLY)
     $define CONFI_LM92  $01   ' CONFIGURACION (READ/WRITE)
     $define THYST_LM92  $02   ' PARA AVISO TEMPERATURA HISTERESIS (READ/WRITE)
     $define TCRIT_LM92  $03   ' PARA AVISO TEMPERATURA CRITICA (READ/WRITE)
     $define TLOW_LM92   $04   ' PARA AVISO TEMPERATURA BAJA (READ/WRITE)
     $define THIGH_LM92  $05   ' PARA AVISO TEMPERATURA ALTA (READ/WRITE)
     $define ManID_LM92  $07   ' MANOFACTURE'S ID
   
$ifndef False
    $define False 0
$endif
$ifndef True
    $define True 1
$endif

'----------------------------------------------------------------------------
    GoTo _LM92_Main                   ' Jump over the routines
'----------------------------------------------------------------------------

$define LM92_WriteDate() GoSub _LM92_WriteDate

_LM92_WriteDate:
        DelayMS 10                                                                                   ' RETARDO
        HBStart                                                                                         ' ABRO I2C
        HBusOut WRITE_LM92,TLOW_LM92 ,[%0000000000100000] ' SET TLOW A 2°C     
        HBReStart
        HBusOut WRITE_LM92,THIGH_LM92,[%0000001101110000] ' SET THIGH A 55°C
        HBReStart
        HBusOut WRITE_LM92,THYST_LM92,[%0000010000000000] ' SET THYST A 64°C
        HBStop                                                                                          ' CIERRO I2C
       DelayMS 3                                                                                      ' RETARDO
Return


$define LM92_ReadDate() GoSub _LM92_ReadDate

_LM92_ReadDate:

   ' LM92_Write/Read Date
                                             
 HBStart                                                        ' INICIO I2C
  HBusOut WRITE_LM92,[0]                         ' LE INDICO AL LM92 QUE VOY A USAR POINTER = 0           
  HBReStart                                                   '[b] Si pongo esta linea los valores cambian[/b]
  HBusIn READ_LM92,0,[TEM_R_LM92]       ' LEO LA TEMPERATURA EN EL PUNTERO 0
 HBStop                                                         ' CIERRO I2C
       
  ONLY_REG_TEMP = TEM_R_LM92 >> 3     ' AL VALOR CARGADO EN LA VARIABLE [TEMP]
                                                                      ' QUITO LOS TRES ÚLTIMOS DÍGITOS DESPLAZANDO
                                                                      ' TRES ESPACIOS A LA DERECHA
   
  EXTRACT_DECIM = ONLY_REG_TEMP & %000001111  ' EXTRAIGO SÓLO LOS 4 ÚLTIMOS DÍGITOS
                                                                                         ' QUE SERÁN DECIMALES CON UNA MÁSCARA
  ONLY_DECIM = EXTRACT_DECIM * 0.0625         ' CONVIERTO EL VALOR A DECIMAL REAL
     
  ONLY_TEMP = ONLY_REG_TEMP >> 4                 ' QUITO LOS CUATRO ÚLTIMOS DÍGITOS DESPLAZANDO
                                                                               ' 4 ESPACIOS A LA DERECHA. EL RESULTADO ES EL
                                                                               ' VALOR BINARIO DE TEMPERATURA LEÍDA POR EL LM92
   ' if ONLY_TEMP > 255 Then GoTo NEGA_TEMP   ' SI EL BIT (D15 SIGN) 256 ESTÁ EN 1
   '                                                                            ' LA TEMPERATURA MEDIDA SERÁ BAJO CERO
                                         
  TEMP_LM92 = ONLY_TEMP + ONLY_DECIM          ' SUMO EL ENTERO DE TEMPERATURA + LOS DECIMALES
                                                                                 ' OBTENGO EL TOTAL CON DECIMALES SALE EN DISPLAY
  DelayMs 50
Return



'----------------------------------------------------------------------------
_LM92_Main:

$endif  ' _LM92_INC_

Gracias.