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