# DS1621 y PIC



## rakata (Abr 30, 2012)

Quiero leer un DS1621 y mostrarlo en una LCD

Quien me puede ayudar, no se hacerlo, siempre me sale 00

Un saludo


----------



## kuropatula (Abr 30, 2012)

podrías poner tu codigo, tu esquema y todo lo que consideres necesario para que sea mas facil ayudarte


----------



## rakata (Abr 30, 2012)

este es mi codigo

```
'Configuro los fuses
        @__CONFIG    _CONFIG1L, _PLLDIV_5_1L & _CPUDIV_OSC1_PLL2_1L & _USBDIV_2_1L
        @__CONFIG    _CONFIG1H, _FOSC_HSPLL_HS_1H & _FCMEN_OFF_1H & _IESO_OFF_1H
        @__CONFIG    _CONFIG2L, _PWRT_OFF_2L & _BOR_ON_2L & _BORV_3_2L & _VREGEN_ON_2L
        @__CONFIG    _CONFIG2H, _WDT_ON_2H & _WDTPS_512_2H
        @__CONFIG    _CONFIG3H, _CCP2MX_ON_3H & _PBADEN_OFF_3H & _LPT1OSC_OFF_3H & _MCLRE_OFF_3H
        @__CONFIG    _CONFIG4L, _STVREN_ON_4L & _LVP_OFF_4L & _XINST_OFF_4L

'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'UTILIZAR EL REGISTRO  DE CONTROL/DATOS EN EL PUERTO B
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

'I2C
CMCON = 7
ADCON1 = 7
SCL VAR PORTA.0 
SDA VAR PORTA.1
W0 var word
ds var byte
Startconvert var byte

Startconvert = $EE ' Initiates temperature conversion.
ds = %10010000 ' device address


start:
i2cwrite SDA,SCL,ds,$AC,[0] ' Access Config
pause 100 
i2cwrite SDA,SCL,ds,Startconvert ' Start Conversion
pause 750 
gosub gettemp
lcdout $fe,1
lcdout "Temperature = ",dec2 W0 

pause 800
goto start

gettemp: 
i2cread SDA,SCL,ds,$AA,[W0] ' Read last converted temperature value from temperature register.
W0 = W0 >> 8 
return
```

y adjunto el esquema


----------



## kuropatula (Abr 30, 2012)

Segun el esquematico, te olvidaste las resistencias de pull up. Es I2C el protocolo, verdad?


----------



## rakata (Abr 30, 2012)

Si es i2c

Ni poniendo las Pull up funciona, se ve como la linea scl se activa pero no muestra lo que debe


----------



## rakata (May 1, 2012)

Nadie ha hecho algo parecido?


----------



## rakata (May 2, 2012)

Ayuda por favor, no encuentro la solucion!


----------



## rakata (May 3, 2012)

He cambiado algo a ver si consigo haserlo funcionar pero no


```
'Configuro los fuses
        @__CONFIG    _CONFIG1L, _PLLDIV_5_1L & _CPUDIV_OSC1_PLL2_1L & _USBDIV_2_1L
        @__CONFIG    _CONFIG1H, _FOSC_HSPLL_HS_1H & _FCMEN_OFF_1H & _IESO_OFF_1H
        @__CONFIG    _CONFIG2L, _PWRT_OFF_2L & _BOR_ON_2L & _BORV_3_2L & _VREGEN_ON_2L
        @__CONFIG    _CONFIG2H, _WDT_ON_2H & _WDTPS_512_2H
        @__CONFIG    _CONFIG3H, _CCP2MX_ON_3H & _PBADEN_OFF_3H & _LPT1OSC_OFF_3H & _MCLRE_OFF_3H
        @__CONFIG    _CONFIG4L, _STVREN_ON_4L & _LVP_OFF_4L & _XINST_OFF_4L

'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'UTILIZAR EL REGISTRO  DE CONTROL/DATOS EN EL PUERTO B
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

'I2C
CMCON = 7
ADCON1 = 7
SCL VAR PORTA.0 
SDA VAR PORTA.1
WO var WORD
T1 var WO.byte0
T2 var WO.byte1
main:
i2cwrite SDA,SCL,%10010000 'Apunto al dispositivo
Pause 10
i2cwrite SDA,SCL,$90,$AC,[0] 'Lo configuro para modo continuo
Pause 10
i2cwrite SDA,SCL,$90,$EE 'Empieza a convertir
Pause 50
i2cwrite SDA,SCL,$90,$AA 'Lee  almacena en WO
pause 10
i2cread SDA,SCL,$91,[T1,T2]
pause 10
LCDout $FE,1
LCDout $FE,1, #WO
goto main
```


----------



## D@rkbytes (May 6, 2012)

Saludos rakata.
 El código que pusiste esta algo mal.
Te adjunto un ejemplo para PBP con un PIC16F628A, ya lo podrás después migrar al PIC que uses.

No lo he probado físicamente, pero en la simulación que adjunto funciona bien.

Nota:
Encontre un BUG, pero ya lo corregí.
Hay que modificar esto:
    IF TempX >= 128 THEN
    TempNeg = "-"
    TempX = 256 - (TempX + Temp.7)
    ENDIF
Por esto.
    IF TempX > 128 THEN ; Solo quitar el signo  de =
    TempNeg = "-"
    TempX = 256 - (TempX + Temp.7)
    ENDIF

Y eliminar esta otra parte que por descuido repetí.
    TempX = Temp.HighByte  <--

Suerte y hasta luego.


----------



## yagami (Abr 19, 2016)

Saludos a todos. Estoy probando un ejemplo de supervision de temperatura en Proteus usando un PIC 16F876 y un DS1621.
Los datos de la fecha y hora se obtienen de un reloj en tiempo real DS1307 y se muestran en un lcd. Esta primera parte marcha bien, el problema esta en que cuando llamo a cualquier funcion de la libreria DS1621M.c entonces surgen las advertencias en Proteus y detenciones (breakpoints) en la simulacion por stack overflows y stack underflows, incluso desde el fichero del lcd, que no daba problemas. A continuacion les adjunto los archivos del proyecto. Si se descomenta la instruccion init_temp(0x01); en init() o en main() aparece el problema.

Muchas gracias de antemano. ...



Aqui estan los archivos del proyecto


----------

