Ejemplo One-Wire DS18B20

'****************************************************************

'*  Name    : temDS18B20AS                                      *

'*  Author  : [prof.martintorres@educ.ar]                       *

'*  Notice  : Copyright (c) 2016 [EduTecInformal]               *

'*          : All Rights Reserved                               *

'*  Date    : 8/1/20015                                         *

'*  Version : 1.0                                               *

'*  Notes   : Ejemplo sensor DS18B20 - pic 16F84A               *

'*          :                                                   *

'****************************************************************

'DEFINICION OSCILADOR EXTERNO                                                       

 

@ device xt_osc ; oscilador externo XT

define osc 4 ; especifica que se va a utilizar uno de 4 Mhz

' DEFINICION DE LIBRERIA PARA COMUNICACION

Define    LOADER_USED    1

'DEFINICION DE PINES PARA CONECTAR EL LCD

Define  LCD_DREG        PORTB

Define  LCD_DBIT        0

Define  LCD_RSREG       PORTB

Define  LCD_RSBIT       4

Define  LCD_EREG        PORTB

Define  LCD_EBIT        5                                   

' CREACION DE VARIABLES

command var     byte            ' VARIABLE PARA COMANDO

i       var     byte            ' VARIABLE PARA CONTEO

temp    var     word            ' PARA GUARDAR VALOR TEMP

' DETERMINACION DE PIN SENSOR DS 18S20 CONECTADO AL PIC 16F84a

DQ      var     PORTB.7         ' PIN DEL SENSOR DS18S20 CONECTADO A PORTB.7

DQ_DIR  var     TRISB.7         ' DEL PIC 16F84a

        Low PORTB.6             ' LCD R/W A CERO LOGIGO POR EL PIC 16F84a

        Pause 100               ' 100 MS PARA INICIALIZAR LCD

        Lcdout $fe, 1

        Lcdout $fe,$80, "Temp:"      'MOSTRAR MENSAJE

       

'PROGRAMA PARA LECTURA DE TEMPERATURA EN EL LCD

INICIO:

        Gosub init18S20          ' IR A RUTINA DE INICIALIZACION DEL LCD

        command = $cc          

        Gosub write18S20

        command = $44           ' EMPIEZE CONVERCION DE TEMPERATURA

        Gosub write18S20

        Pause 2000              ' ESPERO 2S EG HASTA QUE FINALICE LA CONVERSION

        Gosub init18S20         

        command = $cc          

        Gosub write18S20

        command = $be           ' LEER TEMPERATURA

        Gosub write18S20

        Gosub read18S20

'RUTINA PARA MOSTRAR VALOR DE TEMPERATURA EN EL LCD

       

        Lcdout $fe,$86, dec (temp >> 1),".",dec (temp.0 * 5), "oC"

        Goto INICIO           ' CREA UN BUCLE CERRADO

' INICIALIZA  DS18S20 Y CHEQUEA PRESENCIA

init18S20:

        Low DQ                 

        Pauseus 500          

        DQ_DIR = 1             

        Pauseus 100            

        If DQ = 1 Then

                Lcdout $fe, 1

                Lcdout $fe,$83,"SENSOR DS18S20"

                Lcdout $fe,$C2,"NO CONECTADO"

                Pause 500

                Goto INICIO  

        Endif

        Pauseus 400            

        Return

' RUTINA PARA COMUNICACION DEL PIC CON SENSOR DS1820 A 8 BYTE

write18S20:

        For i = 1 to 8       

                If command.0 = 0 Then

                        Gosub write0   

                Else

                        Gosub write1  

                Endif

                command = command >> 1 

        Next i

        Return

' RUTINA PARA DESHABILITAR DS18S20 A TRAVES DE UN BIT

write0:

        Low DQ

        Pauseus 60            

        DQ_DIR = 1             

        Return

' RUTINA PARA HABILITAR DS18S20 A TRAVES DE UN BIT

write1:

        Low DQ                 

@       nop                  ' RETARDO DE 1us CON UN OSCILADOR EXTERNO DE 4MHz

        DQ_DIR = 1             

        Pauseus 60             

        Return

                          

' RUTINA PARA LEER DS18S20

read18S20:

        For i = 1 to 16      

                temp = temp >> 1       

                Gosub readbit  

        Next i

        Return

' RUTINA PARA LEER BIT DS18S20

readbit:

        temp.15 = 1           

        Low DQ                

@       nop                  ' RETARDO DE 1us CON UN OSCILADOR EXTERNO DE 4MHz        

        DQ_DIR = 1             

        If DQ = 0 Then

                temp.15 = 0    

        Endif

        Pauseus 60             

        Return

        End