Autor Tema: Reloj/Calendario/Posicionador Geográfico/Termómetro sincronizado por módulo GPS  (Leído 8043 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Jorge Bern

  • PIC10
  • *
  • Mensajes: 46
    • Mis Proyectos de Electrónica Aplicada
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
« Última modificación: 26 de Marzo de 2021, 11:38:28 por Jorge Bern »

"Voyager 1, llevando el microcontrolador activo que más se alejó de sus programadores"

Desconectado Jorge Bern

  • PIC10
  • *
  • Mensajes: 46
    • Mis Proyectos de Electrónica Aplicada
Buenas noches colegas,
primero pido disculpas por haber colgado este proyecto durante estos meses pero tuve inconvenientes con el gabinete de acrílico que con esta pandemia me tardaron en entregar.
Finalmente logré instalar el prototipo en el gabinete (bastante desprolijo por cierto) con todo lo aquí descrito y ya está funcionando como muestro en el siguiente video.



El video muestra al principio la hora local  10:29:32  (con leds separadores verdes e indicación de HOR MIN SEG ) y luego la fecha 19:06:21 (con leds separadores rojos e indicación de MES AÑO DIA) También el calendario se enciende en día SAB y mes JUN
Luego oprimiendo el pulsador el display muestra LONG 57 Grados 33.5 Minutos y LAT 37 Grados 58.2 Minutos que es la posición geográfica donde se encuentra el Reloj.
Sobre la derecha como ya vimos se ven los displays del termómetro de dos canales, mostrando temperatura exterior 17.3 ºC  e interior 39.9 ºC
En el Seg.28 del video la temperatura interna pasa a 40ºC y el ventilador se enciende, puede verse funcionando en el Seg.33, entonces la temperatura baja a 39ºC y el ventilador se detiene.
En el Seg.39 se ven los leds de interface con el módulo GPS, el verde indica actividad de datos entrantes (mensaje de sincronismo GPS) y el amarillo indica el eco de los datos de salida (HyperTerminal)
En el Seg.59 puede verse el sensor de temperatura interna sobre el transformador de alta tensión (3.500V) de los TRCs NIMO, que es el punto mas caliente del equipo.
Por último en el Seg.112 se ve nuevamente que la temperatura del trafo alcanza los 40ºC , se enciende el ventilador y esta baja a 39ºC.

Con este posteo y con el prototipo terminado y funcionando, de mi parte doy por terminado este tema, espero les haya resultado interesante.
Cualquier comentario y/o aclaración de los colegas, quedo a disposición
Gracias por vuestros comentarios y atención

Un saludo.


« Última modificación: 20 de Junio de 2021, 18:35:56 por Jorge Bern »

"Voyager 1, llevando el microcontrolador activo que más se alejó de sus programadores"

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Te quedo excelente Jorge. Muchas Felicitaciones

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Grandísimo hilo y grandísimo proyecto. Felicidades Jorge

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
 (((:-))) (((:-))) (((:-)))

Desconectado Jorge Bern

  • PIC10
  • *
  • Mensajes: 46
    • Mis Proyectos de Electrónica Aplicada
Muchas gracias colegas por los comentarios y felicitaciones.
Son de muy buen nivel los temas que se presentan aquí y espero haber estado a la altura.
Algún otro proyecto presentare por aquí en breve.
Un saludo  :-/

"Voyager 1, llevando el microcontrolador activo que más se alejó de sus programadores"

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Hay una cosa que vi hace bastante y por falta de tiempo no pude decirtelo, en la parte donde buscas el "$GNRMC," podrias haberlo realizado asi:

Código: ASM
  1. enc_gps:
  2.         ADDWF   PCL,f
  3.         DT "$GNRMC,",0x00
  4.  
  5. recepcion:     
  6.         MOVF    INDEX, W
  7.         CALL    enc_gps
  8.         IORLW   0x00                    ; Reviso que no sea un 0x00, para determinar si llegue a la ultima letra
  9.         BTFSC   STATUS, Z
  10.         GOTO    encabezado_correcto
  11.         XORWF   RCDATO
  12.         BTFSS   STATUS, Z
  13.         GOTO    siguiente_letra
  14.         CLRF    INDEX                   ; Es otro encabezado
  15.         RETURN
  16. siguiente_letra:
  17.         INCF    INDEX, F
  18.         RETURN
  19.  
  20. encabezado_correcto:
  21.          ;Aca podes usar los estados, para determinar todo lo que viene y quitar las comas. Especialmente si usar acceso indirecto para almacenarlo en espacios contiguos de la RAM, ya que solo seria incrementar.

Aplicando lo mismo podes hacer la separacion de los datos del receptor

Código: ASM
  1. Limpieza_recepcion_inicial
  2.         ;Aca limpiar todo los datos anteriores.
  3.         CLRF    INDEX_DATA
  4.         GOTO    cargar_direccion
  5. Recepcion_datos:
  6.         MOVF    RCDATO, W
  7.         XORLW   ','
  8.         BTFSC   STATUS,Z
  9.         GOTO    siguiente_dato
  10.         MOVF    RCDATO
  11.         MOVWF   INDF
  12.         RETURN
  13.  
  14. siguiente_dato:
  15.         INCF    INDEX_DATA, F
  16. cargar_direccion:
  17.         MOVF    INDEX_DATA, W
  18.         CALL    tabla_direccion
  19.         IORLW   0x00  ; Proteccion
  20.         BTFSC   STATUS, Z
  21.         GOTO    error_recepcion
  22.         MOVWF   FSR
  23.         RETURN
  24.  
  25. error_recepcion:
  26.         ;Se recibieron mas comas que lo pensado.
  27.  
  28. tabla_direccion:
  29.         ADDWF PCL, F
  30.         DT      0x20,0x25,0x30,0x35,0x40, 0x00  ;Inicio de direcciones de RAM donde se van a depositar cada valor, mas un 0x00 por las dudas, definir los espacios necesarios para una recepcion completa

Lo mejor para esto hubiera sido un PIC18F. Tiene muchas mas ventajas respecto al manejo de la memoria.

PD: Lo escribí sin probarlo, lo hice en el bloc de notas, así que seguramente tenga algunos/millones de errores. Es solo de referencia.
« Última modificación: 18 de Julio de 2021, 12:56:31 por KILLERJC »

Desconectado Jorge Bern

  • PIC10
  • *
  • Mensajes: 46
    • Mis Proyectos de Electrónica Aplicada
Hola Killer,
En un momento pensé hacer así como decís , comparar la parte fija de los mensajes con una tabla en memoria en lugar de la casi interminable maquina de estados, probablemente hubiera quedado mas sencillo el código.
Gracias por el aporte!

"Voyager 1, llevando el microcontrolador activo que más se alejó de sus programadores"