Continuando, veamos con más detalle el diseño.
Como se ve en el video de arriba, luego del testeo del display el programa efectúa la lectura de los ID de 64 bytes que identifican los sensores DS0 y DS1 (64-BIT LASERED ROM).
Como dijimos el primer byte del ID es un identificador de tipo de sensor ( 28h) , el programa sólo lee los dos primeros bytes del ID de los dos sensores sólo para verificar su presencia.
En caso que un sensor no esté conectado o no responda, el display mostrará un guión (-) en lugar de su ID.
En este caso el DS0 responde con los códigos exadecimales 28 91, y el DS1 responde 28 XX (el XX no se ve porque es un valor exadecimal no displayable). Los restantes 62 bytes de los ID no son leidos pues no hacen falta ya que como vimos, el DS0 se maneja exclusivamente con la linea RA0 y el DS1 con la linea RA1.
Entonces, la secuencia del programa para leer los dos primeros bytes del ID del sensor DS0 de acuerdo al procedimiento aconsejado en su hoja de datos, actuando el PIC como Master y el DS0 como Slave, será la siguiente:
1) Coloca RA0 como salida (TRISA0 = 0) y coloca un estado Bajo ("0") durante 480 uS (Master Reset Pulse)
2) Coloca RA0 como entrada (TRISA0=1), espera de 15 uS a 60 uS y sensa el estado Bajo ("0") de respuesta del DS0 (Slave Presence Pulse) de 60 a 240 uS.
Si el pulso de presencia es detectado significa que el sensor está conectado y listo, en cambio si no se detecta durante un timeout de 480 uS, significa que el sensor no está o no funciona. En ese caso el programa mostrará guiones en el display indicando que el Master Reset falló.
3) Una vez que se detecta la presencia del sensor DS0 y este libera la linea de datos, pasa RA0 nuevamente como salida
4) El Master (PIC) envía sobre la linea, el Read ID Command byte (33h) y a continuación invierte RA0 como entrada
5) Lee el primer byte del ID, lo guarda en memoria. Lee el segundo byte del ID y lo guarda en memoria. Los restantes 62 bytes del ID no son leidos
6) Muestra ambos valores leidos en el display.
A continuación, la secuencia del programa para leer los dos primeros bytes del ID del sensor DS1 será la misma sobre su linea RA1.
Y ambos valores leidos se mostrarán a continuación en el display como puede verse en el video.
Luego de leer y mostrar ambos ID de ambos sensores, el programa entrará en el lazo de medición, muestra y comparación de la temperatura en ambos sensores.
Estos estarán por defecto en su máxima resolución de 12 bits y tendrán un tiempo de conversión de 750 mS.
La medición de temperatura en el DS0 se inicia con la siguiente secuencia:
1) Coloca RA0 como salida y envía el pulso de Reset (Master Reset Pulse)
2) Coloca RA0 como entrada y se verifica el pulso de respuesta del DS0 (Slave Presence Pulse)
3) Coloca RA0 como salida
4) El Master (PIC) envía sobre la linea, el Skip ROM Command byte (CCh)
5) El Master (PIC) envía sobre la linea, el Start Conversion Command byte (44h)
6) Coloca RA0 como entrada, el DS0 (Slave) colocará un Bajo "0" en la linea mientras dura la conversión de temperatura (750 mS)
7) A continuación, La medición de temperatura en el DS1 se inicia con misma secuencia sobre la linea RA1
8 ) Entra en el lazo de espera de fin de conversión sensando el estado Bajo "0" en RA0 forzado por el DSO mientras convierte
9) Una vez que el tiempo de conversión del DS0 finaliza indicado por la liberación de la linea RA0, se verifica también la finalización de conversión en el DS1 indicado por la liberación de la linea RA1.
Ambos sensores disparan su conversión en forma casi simultánea por lo cual ambos tendrán la medición lista en el mismo período de 750 mS
Una vez que se verifica que ambos sensores terminaron su conversión de temperatura, se leen los valores con la siguiente secuencia:
1) Coloca RA0 como salida y envía el pulso de Reset (Master Reset Pulse)
2) Coloca RA0 como entrada y se verifica el pulso de respuesta del DS0 (Slave Presence Pulse)
3) Coloca RA0 como salida
4) El Master (PIC) envía sobre la linea, el Skip ROM Command byte (CCh)
5) El Master (PIC) envía sobre la linea, el Read Scratchpad Command byte (44h), los dos primeros bytes recibidos serán el valor de temperatura en 12 bits
6) Coloca RA0 como entrada
7) Lee el primer byte del Scratchpad, son los 8 bits de menor peso (LS byte) donde están las unidades y los decimales
8 ) Lee el segundo byte del Scratchpad, son los 8 bits de mayor peso (MS byte) donde están los signos y las decenas
El formato de ambos bytes y los pesos de los bits será el siguiente:
LS byte 2^3 2^2 2^1 2^0 2^-1 2^-2 2^-3 2^-4 (unidades y decimales)
MS byte S S S S S 2^6 2^5 2^4 (bits de signo y decenas)
Los S son los bits de Signo que serán 0s con temperaturas positivas, el rango a mostrar será de 00.0 ºC a 99.9 ºC
Ejemplos de lectura de temperatura (ver manual del DS18B20)
- Temp= +125 °C , se lee 07D0h, o sea 7x16+13 = 125 . El ultimo digito son los decimales, que son cero
- Temp= +25.0625°C, se lee 0191h, o sea 2x16+5+ 0,0625 x 1 (la resolucion en 12 bits es 0,0625 ºC)
- Temp= +0.5°C, se lee 0008h, o sea 0,0625 x 8 = 0,5
La conversión de los valores binarios leidos en los bytes MS y LS a los valores BCD a mostrar en los displays será por tablas en EPROM
El contenido de la tabla de conversión para decenas y unidades será simple, se direcciona con decenas y unidades en binario (exadecimal) y se obtiene el valor a mostrar en BCD:
Tabla: (arranca en la posición 00h de la EPROM)
de 0x00 ; 00
de 0x01 ; 01
de 0x02 ; 02
de 0x03 ; 03
de 0x04 ; 04
de 0x05 ; 05
de 0x06 ; 06
de 0x07 ; 07
de 0x08 ; 08 - Ejemplo: si los MS y LS bytes son 0080 , el valor BCD a mostrar en decenas y unidades será 08
de 0x09 ; 09
de 0x10 ; 0A
de 0x11 ; 0B
de 0x12 ; 0C
de 0x13 ; 0D - Ejemplo: si los MS y LS bytes son 00D0 , el valor BCD a mostrar en decenas y unidades será 13
de 0x14 ; 0E
de 0x15 ; 0F
...la tabla continua hasta los valores finales...
de 0x90 ; 5A
de 0x91 ; 5B
de 0x92 ; 5C
de 0x93 ; 5D
de 0x94 ; 5E
de 0x95 ; 5F - Ejemplo: si los MS y LS bytes son 05F0 (16x5+15), el valor BCD a mostrar en decenas y unidades será 95
de 0x96 ; 60
de 0x97 ; 61
de 0x98 ; 62
de 0x99 ; 63 - Ejemplo: si los MS y LS bytes son 0630 (16x6+3) , el valor BCD a mostrar en decenas y unidades será 99
El contenido de la tabla de conversión para los decimales será el siguiente, se direcciona con el nibble de decimales ( 2^-1 2^-2 2^-3 2^-4) del LS byte en binario (exadecimal), y se obtiene el valor redondeado a mostrar en BCD (la resolucion en 12 bits es 1/16 o sea 0,0625 ºC)
Tabla (empieza en la posición 70h de la EPROM):
de 0x00 ;70 0 0,0000
de 0x01 ;71 1 0,0625
de 0x01 ;72 2 0,1250
de 0x02 ;73 3 0,1875 - Ejemplo: el nibble de decimales es 3 (03h), la dirección de memoria será 73h, el valor de temp será
de 0x02 ;74 4 0,2500 0,0625x3=0,1875 ºC, el valor redondeado retornado para mostrar será 2
de 0x03 ;75 5 0,3125
de 0x04 ;76 6 0,3750
de 0x04 ;77 7 0,4375
de 0x05 ;78 8 0,5000
de 0x06 ;79 9 0,5625
de 0x06 ;7A A 0,6250
de 0x07 ;7B B 0,6875 - Ejemplo: el nibble de decimales es B (0Bh), la dirección de memoria será 7Bh, el valor de temp. será
de 0x07 ;7C C 0,7500 0,0625x11=0,6875 ºC, el valor redondeado retornado para mostrar será 7
de 0x08 ;7D D 0,8125
de 0x09 ;7E E 0,8750
de 0x09 ;7F F 0,9375
Luego agregaré algo de código que hace todo esto.
Saludos