Proyecto completo por Joaquín Berrocal Piris, hecho en ensamblador y controlado por bus I2C. (para ver en youtube: https://www.youtube.com/watch?v=GzJFyv9X17Y)
Se puede modificar fácilmente los valores de temperatura mínima y máxima desde el puerto serie con ayuda del hiperterminal de windows o cual quier otro.
Dispone de display LCD de 4x20 . se ven fotos del montaje. Dispone de los esquemas electrónicos en proteus y en el eagle. Al final esta el programa en ensamblador y los archivos HEXADECIMALES.
Pongo dos, uno para usar LCD de 4x20 y otro si deseo usar una LCD de 4X16.
10. 11/01/2012 10:08:16 f=0.71 C:MIS PROYECTOSPROYECTOS TEMPERATURA OKARCHIVOS CNC Y EAGLE SENSORES DS1621 PARA LCDCNC 3 PASADAS 100X108para 0,4
RESET
RA0
RA2
RB4
RB5
RB6
RB7
+LED
VSS
VDD
VEE
RS
RW
E
D0
D1
D2
D3
D4
D5
D6
D7
RB7
RB6
RB5
RB4
RC7
RC6
RC5
RC4
RC3
RC2
RC1
RC0
LCD 4X16 ó LCD 4X20
Comandos para situar el cursor en el Inicio de Línea
LCD 4X16
Línea1; 0x 80 b'1000 0000'
Línea 2; 0x C0 b'1100 0000'
Línea3; 0x 90 b'1001 0000'
Línea4; 0x D0 b'1101 0000'
Línea 1 0x 80 b'1000 0000'
Línea 2; 0x C0 b'1100 0000'
Línea 3; 0x 94 b'1001 0100'
Línea 4; 0x D4 b'1101 0100'
LCD 4X20
CONEXIÓN SENSORES TEMPERATURA
"DS1621 ó DS1624"
SDA-RA4
SCL-RA3
SDA-RA4
SDA-RA4
SDA-RA4
SCL-RA3
SCL-RA3
SCL-RA3
SDA-RA4
Mantener Pulsado para
desde el PC configurar
las TempMin,TempMax
RC0
RC7
SDA-RA4
SCL-RA3
SDA-RA4
SDA-RA4
SDA-RA4
SCL-RA3
SCL-RA3
RB1y el Tiempo de Muestreo
RB0
RB1
RB0
RB1
(+) Valores al PC para configurar
(-) Solo al LCD NO Comunica con PC
RA5_RD_PIC
RA1_TX_PIC
RS232
EnelEAGLE:Con-subdF09HP
Patilla3:TxD
Patilla2:RxD
RxD
TxD
(+ 16) y (- 15)
SDA-RA4
SCL-RA3
RA0
RA1_TX_PIC
RA5_RD_PIC
RA2
BUS I2C
BUSI2C
RB0
RB1
Realizado con "Invoque"
ON +
OFF (-)
Salidas; Activadas si los Sensores 1 al 8
superan la temperatura establecida
Led1 se activa si Sensor 1 está entre su
TempMin y TempMax establecida.
La histérisis de activación es de Abajo arriba, es decir,
Led1 estará activo si la temperatura a ascendido
desde la TempMi a la TempMax
pero no se activará si estaba por encima de la TempMax
hasta que baje de la TempMin y vuelva a ascender
Y así con todos los demás Sensores y Leds.
EAGLE;(EI42-1)-->TRANSF ENCAPSULADO :(TR9V6VA)
220 VOLT ALTERNA
9VOLCC6VA
Puentes para utilizar o no
el transformador como alimentación
>=9 Vcc
Tx el Pic Transmite "Rojo"
Rx el Pic Recibe "Verde"
LEDS de 3 mm
(SDA)
(SCL)
(-)
(+)
Pull Up RB3.
Evita se reinicia
tocar patilla RB3
MCLR-RESET
MCLR-RESET
PIC16876P
>= 9 VCC
400
220 uF 220 uF
GND
+5V
+12V
4MHZ
15pF15pF
400
400
400
400
400
400
400
GND
10010K+5V
GND
GND
470 k
+5V
GND
GND
+5V
+5V
4K7
4K7
+5V
GND
GND
+5V
GND
10K
10K
+5V
GND
GND
MAX232
1uF1uF
1uF
1uF
100n
GND
+5V
GND
+5V
GND
TL36PO
1K
220 VAC
470
470
+5V
10K+5V
MCLR/THV1
RA0/AN02
RA1/AN13
RA2/AN24
RA3/AN35
RA4/T0CKI6
RA5/AN47
OSC1/CLKIN9
OSC2/CLKOUT10
RC0/T1OSO11
RC1/T1OSI12
RC2/CCP113
RC3/SCK14
SDI/RC4 15
SDO/RC5 16
RC6 17
RC7 18
8
20
INT/RB0 21
RB1 22
RB2 23
PGM/RB3 24
RB4 25
RB5 26
PGC/RB6 27
PGD/RB7 28
19
IC1
VDD
VSS
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
JP1
3 1
24
S1
3 1
24
S4
X1-1
X1-2
IC2
GND
IN OUT
LED1
R1
C1 C2
Q1
C3C4
LED2
LED3
LED4
LED5
LED6
LED7
LED8
R2
R3
R4
R5
R6
R7
R8
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
JP2
R9R10
C5
1
2
3
4
5
6
7
8
JP3
R11
R12
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
JP4
R13
R14
1
6 2
7 3
8 4
9 5
X2
C1+1
C1-3
C2+4
C2-5
T1IN11
T2IN10
R1OUT12
R2OUT9
V+ 2
V- 6
T1OUT 14
T2OUT 7
R1IN 13
R2IN 8
IC4
1615
GNDVCC
IC4P
C7C8
C9
C10
C11
2
3
1
S3
LED9
1
5
7
9
TR1
1
2
JP5
1
2
JP6
X3-1
X3-2
LED10 R16
LED11 R17
R18
Autor: Joaquín Berrocal Piris
+
+
+
+
+
+
PRI
SEC
In 0
I/O 0
I/O 0
I/O 0
I/O 0
I/O 0
I/O 0
In 0
Out 0
I/O 0
I/O 0
I/O 0
I/O 0
I/O 0
I/O 0
I/O 0
I/O 0
Pwr0
Pwr0
I/O 0
I/O 0
I/O 0
I/O 0
I/O 0
I/O 0
I/O 0
I/O 0
Pwr0
Pas0
Pas0
Pas0
Pas0
Pas0
Pas0
Pas0
Pas0
Pas0
Pas0
Pas0
Pas0
Pas0
Pas0
Pas0
Pas0
Pas 2 Pas 1
Pas 1Pas 2
Pas 2 Pas 1
Pas 1Pas 2
Pas 0
Pas 0
In 0
In0
Pas 0
Pas0Pas0Pas1Pas1
Pas0Pas0
Pas0Pas0
Sup0
Sup0
Sup0
Pas1Pas112
Pas 1 Pas 1
Pas 1 Pas 1
Pas0Pas0
Pas0Pas0
Pas0Pas0
Pas0Pas0
Pas0Pas0
Pas0Pas0
Pas0Pas0
Pas1Pas1
Pas1Pas1
Pas1Pas1
Pas1Pas1
Pas1Pas1
Pas1Pas1
Pas1Pas1
Sup0
Pas 0
Pas 0
Pas 0
Pas 0
Pas 0
Pas 0
Pas 0
Pas 0
Pas 0
Pas 0
Pas 0
Pas 0
Pas 0
Pas 0
Pas 0
Pas 0
Pas1Pas1Pas1Pas1Sup0
Sup0
Sup0
Pas1Pas1
Sup0
Sup0
Sup0
Sup0
Pas0
Pas0
Pas0
Pas0
Pas0
Pas0
Pas0
Pas0
Sup0
Pas1Pas1
Pas1Pas1
Sup0
Pas 0
Pas 0
Pas 0
Pas 0
Pas 0
Pas 0
Pas 0
Pas 0
Pas 0
Pas 0
Pas 0
Pas 0
Pas 0
Pas 0
Pas 0
Pas 0
Sup0
Sup0Sup0
Sup0
Pas1Pas1
Pas1Pas1
Sup0
Sup0
Pas 0
Pas 0 Pas 0
Pas 0 Pas 0
Pas 0 Pas 0
Pas 0 Pas 0
Sup0
I/O 0
I/O 0
I/O 0
I/O 0
In 0
In 0
Out 0
Out 0
I/O 0
I/O 0
Out 0
Out 0
In 0
In 0 Pwr0Pwr0
Pas 0 Pas 0
Pas 0 Pas 0
Pas 0Pas 0
Pas 0 Pas 0
Pas 1Pas 1
Sup0
Sup0
Sup 0
Sup0Sup0
Pas 0
Pas 0
Pas 0
Pas0Pas0Pas1Pas1
Pas 1
Pas 1
Pas 2
Pas 2
Pas0
Pas0Pas0
Pas0
Pas 0
Pas 0
Pas 0Pas 0 Pas 1Pas 1
Pas 0Pas 0 Pas 1Pas 1
Sup0
Pas1Pas1Sup0
15. OYECTOSPROYECTOS TEMPERATURA OKCON DECI COMPLETOTermometro Con 16F876A _LCD20X4_Y_PCControl_I2C_8_Sensores_De_Tempera
;******************************* Control_I2C_8_Sensores_Temperatura.asm ************************
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; Realizado por JOAQUÍN BERROCAL PIRIS en marzo de 2011
;+++++++++++++++++++++++ ¡¡ PARA EL LCD 20X4 !!+++++++++++++++++++++++++++
;-------LE HE AÑADIDO LA LIBRERÍA LCD 4X20.INC-------
; ESTOY UTILIZANDO EL PIC16F876A
;+Programa de control DE 8 SENSORES DE TEMPERATURA DS1624 ó el DS1621
;+VISUALIZACIÓN SOBRE LCD 4X16 LÍNEAS Y TAMBIÉN SI QUEREMOS SOBRE PC A TRAVÉS DE PUERTO SERIE
RS232.
;+DESDE EL PC (hiperterminal) se pueden configurar las TempMín y TempMax de cada sensor
;+Si la temperatura del sensor es inferior a la TempMáx configurada para él, se activará la
salida correspondiente.
;OBSERVACIÓN:
;LO TENGO PREPARADA CON UNA HISTÉRISIS PARA EVITAR CONSTANTE ACTIVACIONES Y DESACTIVACIONES.
; PARA ELLO POR EJEMPLO SI CONFIGURO EL SENSOR 1 con una TempMi---> 10ºC y la TempMax a 12ºC.
;su salida estará activa (RC0), SI ES INFERIOR A < 12ºC "PERO TIENE QUE EMPEZAR A ACTIVARSE POR
DEBAJO DE LA TempMin establecida en este caso 10ºC
;de lo contrario hasta que no descienda de la temperatura TempMin 10º no se volverá a activar
;Conclusión; mantiene activa la salida si la temperatura del sensor es < TempMin y < TempMax y
para poder estar activa debe encontrarse inicialmente
;por debajo de la TempMin o bien descender por debajo de dicha temperatura. De esta manera se
consigue una correcta HISTÉRISIS DE ACTIVACIÓN.
;
;
;PARA SIMULARLO EN PROTEUS USAR EL DS1621 funciona igual,SOLO QUE ÉSTE LA APRECIACION ES DE
0.5ºC.
;(CON EL "DS1624" SE CONSIGUIRÍA UNA APRECIACIÓN DE 0.1º SEGÚN LA TABLA DE CONVERSIÓN QUE TENGO
EN el comienzo del programa **.asm)
;visualizarlo sobre LCD una LCD 4X16 .También se podría hacer sobre LCD 2x16 ligeros cambios
;++++++++++++++++++++++++++++++OBSERVACIÓN FINAL+++++++++++++++++++++++++++++++++++++
;TENGO MUCHAS INSTRUCCIONES ANULADAS CON ";" PERO LAS DEJO POR POSIBLES REFORMAS A FUTURO
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;
; ZONA DE DATOS **********************************************************************
LIST P=16F876A
INCLUDE <P16F876A.INC>
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
CBLOCK 0x20
;para guardar temporalmente la temperatura de los sensores y poder reflejarlas en la pantalla
todas a la vez
TempSensor_0
TempSensor_1
TempSensor_2
TempSensor_3
TempSensor_4
TempSensor_5
TempSensor_6
TempSensor_7
TempSigno_0
TempSigno_1
TempSigno_2
TempSigno_3
TempSigno_4
TempSigno_5
TempSigno_6
TempSigno_7
; para guardar el valor decimal redondeado a un sólo dígito.
DS1624_Decimal_0
DS1624_Decimal_1
DS1624_Decimal_2
1
16. OYECTOSPROYECTOS TEMPERATURA OKCON DECI COMPLETOTermometro Con 16F876A _LCD20X4_Y_PCControl_I2C_8_Sensores_De_Tempera
DS1624_Decimal_3
DS1624_Decimal_4
DS1624_Decimal_5
DS1624_Decimal_6
DS1624_Decimal_7
; FlagSaltarElReturn ;Para poder hacer el parpadeo de "Leyendo Sensores": LO SUPRIMO
POR NO UTILIZARLO
;para recoger las Temperaturas mínimas y máximas de cada Sensor entre las que estará
;activa la salida a relé indicadO.
TempMin_0
TempMax_0
TempMin_1
TempMax_1
TempMin_2
TempMax_2
TempMin_3
TempMax_3
TempMin_4
TempMax_4
TempMin_5
TempMax_5
TempMin_6
TempMax_6
TempMin_7
TempMax_7
ENDC
;------------------------------------------
RetornoCarro EQU .13 ; Código de tecla "Enter" o "Retorno de Carro".
CambioLinea EQU .10 ; Código para el cambio de línea.
;;TabuladorH EQU .9 ;Código para un salto de tabulador horizontal
;;TabuladorV EQU .11 ;Código para tabulador Vertical y poder así borrar lo escrito en
el PC
;;InicioCabecera EQU .1
;;BorrarPC EQU .127 ;DEL borrar
;ESTOS SOBRAN PERO LOS DEJO DE MOMENTO
;;#DEFINE Entrada0 PORTB,4 ; Define dónde se sitúan las entradas.
;;#DEFINE Entrada1 PORTB,5
;;#DEFINE Entrada2 PORTB,6
;;#DEFINE Entrada3 PORTB,7
;-----------------------------------------
; *******************************ZONA DE CÓDIGOS *************************************
ORG 0
goto Inicio ;Pone la línea 1 y 2 con las iniciales de T1: T2: T3: t4:
Mensajes ; Los mensajes no deben sobrepasar las 256
addwf PCL,F ; primeras posiciones de memoria de programa.
MensajeEnBlanco
DT " ", 0x00 ;Lo utilizo por si falla un Sensor aparezca en blanco su valor en lugar de
:-0º
MensajeGradoCentigrado
DT "º", 0x00 ; En la pantalla: "ºC" "C" Se puede suprimir para que quepa un
2
17. OYECTOSPROYECTOS TEMPERATURA OKCON DECI COMPLETOTermometro Con 16F876A _LCD20X4_Y_PCControl_I2C_8_Sensores_De_Tempera
decimal
;PARA REFLEJAR EN LCD T1: a T8:
T1
DT "T1:",0x00
T2
DT "T2:",0x00
T3
DT "T3:",0x00
T4
DT "T4:",0x00
T5
DT "T5:",0x00
T6
DT "T6:",0x00
T7
DT "T7:",0x00
T8
DT "T8:",0x00
Espere
DT " ESPERE", 0x00 ;LE AÑADO DOS ESPACIOS PARA EL LCD 20X4.Para poner en la línea 1 DT "
ESPERE ", 0x00
Leyendo_Sensores ;Mensaje de Espera a leer los 8 sensores aprox 9 sgs
DT " Leyendo Sensores", 0x00 ;LE AÑADO DOS ESPACIOS PARA EL LCD 20X4
;UTILIZO ESTOS MENSAJES PARA VERLOS UNO DEBAJO DEL OTRO YA QUE EN EL HIPERTERMINAL DEL "PROTEUS"
No actúa el Tabulador y
;se ven todas las temperaturas una detrás de la otra sin tabulación
MensajesAlPC_PROGRAMAR ;Lo primero que sale si tengo comunicación con el PC
interruptor RB0 = 1
DT CambioLinea,RetornoCarro
DT "PROGRAMAR:",0x00
;------PARA REDUCIR POSICIONES DE LAS 256 POSIBLES---
MensajesAlPC_SENSOR ;VALOR "SENSOR " global para todos los sensores AÑADIRLE después el número
DT CambioLinea,RetornoCarro,RetornoCarro
DT "SENSOR ",0x00
MensajesAlPC_Sensor1
DT "1: ",0x00
MensajesAlPC_Sensor2
DT "2: ",0x00
MensajesAlPC_Sensor3
DT "3: ",0x00
MensajesAlPC_Sensor4
DT "4: ",0x00
MensajesAlPC_Sensor5
DT "5: ",0x00
MensajesAlPC_Sensor6
DT "6: ",0x00
MensajesAlPC_Sensor7
DT "7: ",0x00
MensajesAlPC_Sensor8
DT "8: ",0x00
;-------------------------------------------------------------------------------------------------
--
MensajeAlPC_Tmin
DT CambioLinea,RetornoCarro,RetornoCarro ;DT RetornoCarro
DT "Tmin: ",0x00
MensajeAlPC_Tmax
DT CambioLinea,RetornoCarro,RetornoCarro ;DT RetornoCarro
DT "Tmax: ",0x00
3
18. OYECTOSPROYECTOS TEMPERATURA OKCON DECI COMPLETOTermometro Con 16F876A _LCD20X4_Y_PCControl_I2C_8_Sensores_De_Tempera
SELECCION_1 ;Para indicar en el PC "SELECCIONADO: 1 = 10 Sg"
DT " 10 Sg",0x00
SELECCION_2 ;Para indicar en el PC "SELECCIONADO: 1 = 10 Sg"
; DT RetornoCarro
DT " 20 Sg",0x00; DT "SELECCIONADO: 2 = 20 Sg",0x00
SELECCION_3 ;Para indicar en el PC "SELECCIONADO: 1 = 10 Sg"
; DT RetornoCarro
DT " 1 Min",0x00 ;DT "SELECCIONADO: 3 = 1 Min",0x00
MensajesAlPC_Tiempo_Muestreo ;SELECCIONAR TIEMPO DE MUESTREO: 1 = 10 Sg 2 = 20 Sg 3 = 30 Sg
DT CambioLinea, RetornoCarro,RetornoCarro
DT "SELECCIONAR TIEMPO DE MUESTREO : "
DT CambioLinea, RetornoCarro,RetornoCarro
DT "1 = 10 Sg"
DT CambioLinea, RetornoCarro
DT "2 = 20 Sg"
DT CambioLinea,RetornoCarro
DT "3 = 1 Min"
DT CambioLinea,RetornoCarro,0x00 ;para dejar una separación en el PC
Elegido
DT "ELEGIDO", 0x00 ;Para poner en la línea 1 DT " ESPERE ", 0x00
;Subrutina "DS1624_RedondeaDecimal" ----------------------------------------------------
;Esta rutina NO LA PUEDO DEJAR en "DS1624_Modificado_0.INC" por tener problemas en su lectura
probablemente por la
;distancia. Aquí no da problemas
; Esta subrutina redondea el valor del contenido del registro de trabajo W al valor más cercano
; con un decimal indicado en una tabla.
;
;ESTA TABLA ESTÁ PENSADA PARA EL SENSOR "DS1624" Que tiene una apreciación de 0,03125º
;NO PARA EL SENSOR "DS1621" el cual su apreciación es de 0,5º
;no obstante la dejo integra por posible uso a futuro con un DS1624
DS1624_RedondeoDecimal
addwf PCL,F ;LO MISMO ES PONER "F" QUE "1"
retlw d'0' ;0; (DS1624_Decimal)=b'0000'. Mide 0,0000ºC. Redondeado a 0,0ºC.
retlw d'1' ;1; (DS1624_Decimal)=b'0001'. Mide 0,0625ºC. Redondeado a 0,1ºC.
retlw d'1' ;2; (DS1624_Decimal)=b'0010'. Mide 0,1250ºC. Redondeado a 0,1ºC.
retlw d'2' ;3; (DS1624_Decimal)=b'0011'. Mide 0,1875ºC. Redondeado a 0,2ºC.
retlw d'3' ;4; (DS1624_Decimal)=b'0100'. Mide 0,2500ºC. Redondeado a 0,3ºC.
retlw d'3' ;5; (DS1624_Decimal)=b'0101'. Mide 0,3125ºC. Redondeado a 0,3ºC.
retlw d'4' ;6; (DS1624_Decimal)=b'0110'. Mide 0,3750ºC. Redondeado a 0,4ºC.
retlw d'4' ;7; (DS1624_Decimal)=b'0111'. Mide 0,4375ºC. Redondeado a 0,4ºC.
retlw d'5' ;8; (DS1624_Decimal)=b'1000'. Mide 0,5000ºC. Redondeado a 0,5ºC.;Este es el
único valor utilizado para el DS1621
retlw d'6' ;9; (DS1624_Decimal)=b'1001'. Mide 0,5625ºC. Redondeado a 0,6ºC.
retlw d'6' ;10 (DS1624_Decimal)=b'1010'. Mide 0,6250ºC. Redondeado a 0,6ºC.
retlw d'7' ;11 (DS1624_Decimal)=b'1011'. Mide 0,6875ºC. Redondeado a 0,7ºC.
retlw d'8' ;12 (DS1624_Decimal)=b'1100'. Mide 0,7500ºC. Redondeado a 0,8ºC.
retlw d'8' ;13 (DS1624_Decimal)=b'1101'. Mide 0,8125ºC. Redondeado a 0,8ºC.
retlw d'9' ;14 (DS1624_Decimal)=b'1110'. Mide 0,8750ºC. Redondeado a 0,9ºC.
retlw d'9' ;15 (DS1624_Decimal)=b'1111'. Mide 0,9375ºC. Redondeado a 0,9ºC.
DS1624_FinTablaRedondeo
IF (DS1624_FinTablaRedondeo > 0xFF)
; ERROR "¡CUIDADO!" ;;;"¡CUIDADO!: La tabla ha superado el tamaño de la página de los"
; MESSG "Error";;;"primeros 256 bytes de memoria ROM. NO funcionará correctamente."
4
19. OYECTOSPROYECTOS TEMPERATURA OKCON DECI COMPLETOTermometro Con 16F876A _LCD20X4_Y_PCControl_I2C_8_Sensores_De_Tempera
bsf PORTC,6 ;ACTIVOLA SALIDA 7
ENDIF
; ---------Subrutina "Inicio" --------------------------
Inicio
;-----Para el pic16f876a puerta A E/S digitales--------
bsf STATUS,RP0 ;Selección Banco 1
movlw b'00000011' ;PUERTA B como Salida PERO
movwf TRISB ;RBO Y RB1 COMO ENTRADA. Una para no tener comunicación con el PC y
la otra para obligar a PROGRAMAR
;;; clrf TRISB ;PUERTA B como Salida PERO
;;; bsf TRISB,0 ;RB0 lo configuro como ENTRADA para tener o no comunicación con el
PC a través del interruptor conectado al RB0
;comunicación con el PC y LCD ->RB0 = 1. SÓLO LCD -> RB0 = 0
;; bsf TRISB,1
clrf TRISC ;PUERTA C como Salida
movlw b'00000110' ;PUERTAA E/S Digitales
movwf ADCON1
; movlw b'00011111' ;La PUERTAA se configura como Entrada
; movwf TRISA ;NO ES NECESARIO. configurarlo
bcf STATUS,RP0 ;Vuelta al BANCO 0
;INICIA LOS PUERTOS APAGANDO TODAS SUS SALIDAS
clrf PORTB
clrf PORTC
clrf Flag_No_Repetir_Programar
clrf FlagValorNegativo ;reseteo el flag
;PARA PONER A CERO TODOS ESTOS REGISTROS
clrf TempSensor_0
clrf TempSensor_1
clrf TempSensor_2
clrf TempSensor_3
clrf TempSensor_4
clrf TempSensor_5
clrf TempSensor_6
clrf TempSensor_7
;---------------------------------
clrf Flag_Es_Negativo ;reiniciar aquí el flag lo utilizo para suprimir el '.' y la 'º'
si la parte entera tiene
;3 Caracteres incluido del signo (-) y la decimal es .0º
;----------------------------------------------------
;-----------INICIA LA PANTALLA LCD-------------------
;----------------------------------------------------
call LCD_Inicializa ;PARA INICIAR LA LCD
call RS232_Inicializa ;Inicializa la comunicación con el puerto Serie. RA1=TX y
RA5 = RD (en lugar de RA3 y RA4
;----------------------------------------------------
;++++++POR SI SE VA LA LUZ LEER LAS POSICIONES DE 0 A 17 DE LA EEPROM++++++
;++++++++++++para así trabajar con los valores PROGRAMADOS ++++++++++++
;LAS POSICIONES 0 a 17 están recogidas el flag de no reptir programar. Las TempMin y TempMax de
cada SENSOR Y el valor del "TiempoMuestreo"
call EEPROM_Lectura_De_0_a_17 ;;;Rutina en EEPROM_16F87XX.INC;EEPROM_Lectura_De_0_a_17
EEPROM_Lectura_TempMin_a_TempMax ;EEPROM_Lectura_TempMin_a_TempMax Rutina en
5
20. OYECTOSPROYECTOS TEMPERATURA OKCON DECI COMPLETOTermometro Con 16F876A _LCD20X4_Y_PCControl_I2C_8_Sensores_De_Tempera
EEPROM_16F87XX.INC
Parpadeo ;Fijo el mensaje "ESPERE" y Parpadeante el "Leyendo Sensores"
movlw .5
call LCD_PosicionLinea1 ; primera línea más el valor del registro W
movlw Espere ;Mensaje "ESPERE"
call LCD_Mensaje ;Visualiza el Mensaje
; En la primera línea de la pantalla aparece un mensaje fijo.
call LCD_Linea2 ; Pasa a la segunda línea.
movlw Leyendo_Sensores ; Apunta al mensaje parpadeante. "Leyendo Sensores"
call LCD_Mensaje ; Lo visualiza.
;------ANULO EL PARPADEO-----
;; call Retardo_500ms ; Durante este tiempo.
;; call LCD_Linea2 ; Vuelve a situarse al principio de la línea 2.
;; call LCD_LineaEnBlanco ; Visualiza línea en blanco.Para no ver nada en esa línea y así
producir efecto intermitente
; call Retardo_500ms ; Durante este tiempo, produciendo un efecto de Parpadeo LO
SUPRIMO por
;tener en cada sensor un Call Retardo_1s que se va a mantener
apagado
;++++++SI QUITO LAS DOS INSTRUCCIONES DE ABAJO SE QUEDA PARPADEANDO PERMANENTEMENTE+++++
; btfsc FlagSaltarElReturn,0 ;Si está cargado con valor (0) saltar el Return ya que es la
primera vez
; return ;retorna de cada Sensor_1 al Sensor_7 Si está cargado con valor
1 hacer el return para poder seguir con el parpadeo
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;---------------------------------------------------------------------------
;LECTURA DE LOS SENSORES DE TEMPERATURA
;
Sensor_0
;; bsf FlagSaltarElReturn,0 ;para activar el flag
call DS1624_Inicializa_0 ; Configura el DS1624 e inicia la conversión.
call Retardo_1s ;retardo de 1 segundos
call DS1624_LeeTemperatura ; Lee la temperatura.
; call DS1624_IniciaConversion ;Comienza conversión para la siguiente lectura SI LO
PONGO NO FUNCIONAN NI LOS ENTEROS -8
movwf TempSensor_0 ;lo guardo temporalmente para reflejarlo en la LCD todas las
temperaturas juntas
movf DS1624_Signo,W
movwf TempSigno_0 ;Para guardar temporalmente el signo del sensor 1
;---Para guardar temporalmente el DECIMAL del Sensor_0---
movf DS1624_Decimal,W
movwf DS1624_Decimal_0
;--------------------------------------------------------
;++++INSTRUCCIONES PARA PODER PROGRAMAR LAS TempMin y TempMax y el TiempoMuestreo++++++
btfsc PORTB,1 ;VERIFICA si está PULSADO .No pongo RB1 por no reconocerlo
goto Sensor_1 ;NO ESTÁ PULSADO continuar en "Sensor_0"
call Retardo_20ms ;Espera que se estabilicen los niveles de tensión
btfsc PORTB,1 ;Comprueba si es un Rebote
goto Sensor_1 ;NO ESTÁ PULSADO "Sensor_0"
goto VisualizaTermometro_LCD_0 ;Sí está pulsado
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Sensor_1
;; call Parpadeo
6
21. OYECTOSPROYECTOS TEMPERATURA OKCON DECI COMPLETOTermometro Con 16F876A _LCD20X4_Y_PCControl_I2C_8_Sensores_De_Tempera
call DS1624_Inicializa_1 ; Configura el DS1624 e inicia la conversión.
call Retardo_1s ;retardo de 1 segundos
call DS1624_LeeTemperatura_1 ; Lee la temperatura.
; call DS1624_IniciaConversion_1 ;Comienza conversión para la siguiente lectura
movwf TempSensor_1 ;lo guardo temporalmente para reflejarlo en la LCD todas las
temperaturas juntas
movf DS1624_Signo,W
movwf TempSigno_1 ;Para guardar temporalmente el signo del sensor 1
;---Para guardar temporalmente el DECIMAL del Sensor_1---
movf DS1624_Decimal,W
movwf DS1624_Decimal_1
;--------------------------------------------------------
Sensor_2
;; call Parpadeo
call DS1624_Inicializa_2 ; Configura el DS1624 e inicia la conversión.
call Retardo_1s ;retardo de 1 segundos
call DS1624_LeeTemperatura_2 ; Lee la temperatura.
; call DS1624_IniciaConversion_2 ;Comienza conversión para la siguiente lectura
movwf TempSensor_2 ;lo guardo temporalmente para reflejarlo en la LCD todas las
temperaturas juntas
movf DS1624_Signo,W
movwf TempSigno_2 ;Para guardar temporalmente el signo del sensor 2
;---Para guardar temporalmente el DECIMAL del Sensor_2---
movf DS1624_Decimal,W
movwf DS1624_Decimal_2
;--------------------------------------------------------
Sensor_3
;; call Parpadeo
call DS1624_Inicializa_3 ; Configura el DS1624 e inicia la conversión.
call Retardo_1s ;retardo de 1 segundos
call DS1624_LeeTemperatura_3 ; Lee la temperatura.
; call DS1624_IniciaConversion_1 ;Comienza conversión para la siguiente lectura
movwf TempSensor_3 ;lo guardo temporalmente para reflejarlo en la LCD todas las
temperaturas juntas
movf DS1624_Signo,W
movwf TempSigno_3 ;Para guardar temporalmente el signo del sensor 3
;---Para guardar temporalmente el DECIMAL del Sensor_0---
movf DS1624_Decimal,W
movwf DS1624_Decimal_3
;--------------------------------------------------------
Sensor_4
;; bsf FlagSaltarElReturn,0 ;para activar el flag
call DS1624_Inicializa_4 ; Configura el DS1624 e inicia la conversión.
call Retardo_1s ;retardo de 1 segundos
call DS1624_LeeTemperatura_4 ; Lee la temperatura.
; call DS1624_IniciaConversion ;Comienza conversión para la siguiente lectura SI LO
PONGO NO FUNCIONAN NI LOS ENTEROS -8
movwf TempSensor_4 ;lo guardo temporalmente para reflejarlo en la LCD todas las
temperaturas juntas
movf DS1624_Signo,W
movwf TempSigno_4 ;Para guardar temporalmente el signo del sensor 4
7
22. OYECTOSPROYECTOS TEMPERATURA OKCON DECI COMPLETOTermometro Con 16F876A _LCD20X4_Y_PCControl_I2C_8_Sensores_De_Tempera
;---Para guardar temporalmente el DECIMAL del Sensor_0---
movf DS1624_Decimal,W
movwf DS1624_Decimal_4
;--------------------------------------------------------
Sensor_5
;; call Parpadeo
call DS1624_Inicializa_5 ; Configura el DS1624 e inicia la conversión.
call Retardo_1s ;retardo de 1 segundos
call DS1624_LeeTemperatura_5 ; Lee la temperatura.
; call DS1624_IniciaConversion_1 ;Comienza conversión para la siguiente lectura
movwf TempSensor_5 ;lo guardo temporalmente para reflejarlo en la LCD todas las
temperaturas juntas
movf DS1624_Signo,W
movwf TempSigno_5 ;Para guardar temporalmente el signo del sensor 5
;---Para guardar temporalmente el DECIMAL del Sensor_5---
movf DS1624_Decimal,W
movwf DS1624_Decimal_5
;--------------------------------------------------------
;++++INSTRUCCIONES PARA PODER PROGRAMAR LAS TempMin y TempMax y el TiempoMuestreo++++++
btfsc PORTB,1 ;VERIFICA si está PULSADO .No pongo RB1 por no reconocerlo
goto Sensor_6 ;NO ESTÁ PULSADO continuar en "Sensor_0"
call Retardo_20ms ;Espera que se estabilicen los niveles de tensión
btfsc PORTB,1 ;Comprueba si es un Rebote
goto Sensor_6 ;NO ESTÁ PULSADO "Sensor_6"
goto VisualizaTermometro_LCD_0 ;Sí está pulsado
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Sensor_6
;; call Parpadeo
call DS1624_Inicializa_6 ; Configura el DS1624 e inicia la conversión.
call Retardo_1s ;retardo de 1 segundos
call DS1624_LeeTemperatura_6 ; Lee la temperatura.
; call DS1624_IniciaConversion_2 ;Comienza conversión para la siguiente lectura
movwf TempSensor_6 ;lo guardo temporalmente para reflejarlo en la LCD todas las
temperaturas juntas
movf DS1624_Signo,W
movwf TempSigno_6 ;Para guardar temporalmente el signo del sensor 6
;---Para guardar temporalmente el DECIMAL del Sensor_6---
movf DS1624_Decimal,W
movwf DS1624_Decimal_6
;--------------------------------------------------------
Sensor_7
;; call Parpadeo
call DS1624_Inicializa_7 ; Configura el DS1624 e inicia la conversión.
call Retardo_1s ;retardo de 1 segundos
call DS1624_LeeTemperatura_7 ; Lee la temperatura.
; call DS1624_IniciaConversion_1 ;Comienza conversión para la siguiente lectura
movwf TempSensor_7 ;lo guardo temporalmente para reflejarlo en la LCD todas las
temperaturas juntas
movf DS1624_Signo,W
movwf TempSigno_7 ;Para guardar temporalmente el signo del sensor 7
;---Para guardar temporalmente el DECIMAL del Sensor_7---
8
23. OYECTOSPROYECTOS TEMPERATURA OKCON DECI COMPLETOTermometro Con 16F876A _LCD20X4_Y_PCControl_I2C_8_Sensores_De_Tempera
movf DS1624_Decimal,W
movwf DS1624_Decimal_7
;--------------------------------------------------------
;++++++Primero visualiza todos los sensores desde el 0 al 7 en la LCD+++++
goto VisualizaTermometro_LCD_0 ;EN PANTALLA LCD *ESTE SÍ ESTABA la de arriba y abajo NO
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;*****PARA EVITAR SI ALGÚN SENSOR DEJA DE FUNCIONAR QUE APAREZCA
;*****EN LA PANTALLA EL VALOR -0º. con estas rutinas de más abajo
;*****se consigue que aparezca en blanco el valor.
EliminarMenosCero_0
movlw MensajeEnBlanco ;;Lo utilizo por si falla un Sensor aparezca en blanco su valor en
lugar de :-0º
call LCD_Caracter ;LCD_Mensaje
goto Histerisis_0 ;para que active o desactive la salida en función del valor de
histerisis establecido
;con la TempMini y TempMax
EliminarMenosCero_1
movlw MensajeEnBlanco ;;Lo utilizo por si falla un Sensor aparezca en blanco su valor en
lugar de :-0º
call LCD_Caracter ;LCD_Mensaje
goto Histerisis_1 ;para que active o desactive la salida en función del valor de
histerisis establecido
;con la TempMini y TempMax
EliminarMenosCero_2
movlw MensajeEnBlanco ;;Lo utilizo por si falla un Sensor aparezca en blanco su valor en
lugar de :-0º
call LCD_Caracter ;LCD_Mensaje
goto Histerisis_2 ;para que active o desactive la salida en función del valor de
histerisis establecido
;con la TempMini y TempMax
EliminarMenosCero_3
movlw MensajeEnBlanco ;;Lo utilizo por si falla un Sensor aparezca en blanco su valor en
lugar de :-0º
call LCD_Caracter ;LCD_Mensaje
goto Histerisis_3 ;para que active o desactive la salida en función del valor de
histerisis establecido
;con la TempMini y TempMax
EliminarMenosCero_4
movlw MensajeEnBlanco ;;Lo utilizo por si falla un Sensor aparezca en blanco su valor en
lugar de :-0º
call LCD_Caracter ;LCD_Mensaje
goto Histerisis_4 ;para que active o desactive la salida en función del valor de
histerisis establecido
;con la TempMini y TempMax
EliminarMenosCero_5
movlw MensajeEnBlanco ;;Lo utilizo por si falla un Sensor aparezca en blanco su valor en
lugar de :-0º
call LCD_Caracter ;LCD_Mensaje
goto Histerisis_5 ;para que active o desactive la salida en función del valor de
histerisis establecido
;con la TempMini y TempMax
EliminarMenosCero_6
movlw MensajeEnBlanco ;;Lo utilizo por si falla un Sensor aparezca en blanco su valor en
lugar de :-0º
call LCD_Caracter ;LCD_Mensaje
goto Histerisis_6 ;para que active o desactive la salida en función del valor de
histerisis establecido
;con la TempMini y TempMax
EliminarMenosCero_7
movlw MensajeEnBlanco
call LCD_Caracter ;LCD_Mensaje
goto Histerisis_7 ;**Iniciar ciclo de visualización de los sensores sin repetir T1 a T8
;---------------------------------------------------------------------------
;RUTINAS PARA VISUALIZAR EN PANTALLA LCD y/o HIPERTERMINAL LAS TEMPERATURAS
;DEPENDERÁ DE LA POSICIÓN DEL INTERRUPTOR SE SELECCIÓN (RB0) : SÓLO LCD o bien PC Y LCD par
poder configurar
;---------------------------------------------------------------------------
9
24. OYECTOSPROYECTOS TEMPERATURA OKCON DECI COMPLETOTermometro Con 16F876A _LCD20X4_Y_PCControl_I2C_8_Sensores_De_Tempera
;-----------------PARA VER EN LCD LA TEMPERATURA DEL Sensor_0---------------------
;-------------------ESTE COMIENZA EN LA LÍNEA 1 posición .3 -------------------------
VisualizaTermometro_LCD_0 ;EN PANTALLA LCD
call LCD_Borra ;Borra toda la pantalla.EVITA que al pasar de 10º a 9º se vea
9ºº SE ENCUENTRA EN LA LIBRERIA "LCD_4BIT_4X16.INC"
call Visualizar_T1_a_T8 ;Para visualizar en la LCD T:1 a T:8 SE ENCUENTRA EN LA
LIBRERIA "Temperatura_a_LCD.INC"
;EVITA que al pasar de XXº a Xº se vean dos grados Xºº
;-------------------------------------------------
; PONER AQUÍ SALTO SI NO QUIERO ENVIAR AL PC
;-------------------------------------------------
;----Lo primero será ver si DESEO MODIFICAR LA PROGRAMACIÓN DE LOS VALORES-----
;Para ver si modifico los valores de TempMin, TempMax y el Tiempo de Muestreo
;"SI Mantengo Presionado el Pulsador "RB1" A MASA, SÍ DESEO PROGRAMAR."
goto Verificar_Deseo_PROGRAMAR ;esta rutina está en "CONFIGURACION_DESDE_PC.INC"
;según desee PROGRAMAR o No, se irá a "Continuar" o a
"Continuar_1"
;------------------------------------------------------------------------------
Continuar ;NO QUIERO PROGRAMAR. Verificar ahora si deseo llevar también al PC
btfss PORTB,0 ;Compruebo si quiero PC o sólo LCD ;RB0=1 SÍ QUIERO PC
goto No_PC_0_1 ;primer salto para evitar el PC
;-------------------------------------------------------------------------------------
;************INICIALIZAR EL PUERTO SERIE comunicación con el PC*******************
;;Continuar_1 ;si mantengo pulsado "RB1" Es porque quiero PROGRAMAR. se vuelve aquí
desde "Borrar_EEPROM"
;PRIMERO COMPRUEBO SI ES LA PRIMERA VEZ QUE SE PROGRAMA SI ES ASÍ PERMITIRLO DE
LO CONTRARIO NO
;PARA ELLO LEER EL FLAG GRABADO EN LE POSICIÓN "0" DE LA EEPROM DONDE GUARDO EL
FLAG CON VALOR 1 DE
;Flag_No_Repetir_Programar
movlw .1
movwf Flag_No_Repetir_Programar ;utilizo el mismo nombre por no utilizar otro registro
clrf EE_Dir ;Posición "0" donde está grabado el Flag en la EEPROM (lo
hice dese la Rutina "PROGRAMAR"
call EEPROM_LeeDato ;lee lo escrito en la posición "0" de la EEprom si ya se
hubiese PROGRAMADO tendrá valor "1"
;----COMPARA SI TIENE VALOR 1 EN CUYO CASO NO VOLVER A PROGRAMAR-----
subwf Flag_No_Repetir_Programar,W ;
btfsc STATUS,Z ;Si Z=1 NO VOLVER A PROGRAMAR. Y SI Z=0 PROGRAMAR es decir
configurar las Tmin y Tmax de cada sensor
goto No_Volver_A_PROGRAMAR ;si quiero volver a programar pulsar el boton de RESET.
;--------------------------------------------------------------------
;+++++PARA BORRAR LO QUE HAYA EN LA PANTALLA DEL PC HIPERTERMINAL++++
;Para ello simplemente salto de página--> decimal; .12
movlw .12 ; Nueva página
call RS232_EnviaDato
call Retardo_200ms ;para que no salga raro la primera vez aunque en las siguientes ok
Continuar_1 ;LO PONGO AQUÍ PARA QUE SIEMPRE TENGA UN RENGLÓN DE SEPARACIÓN Respecto a lo
anterior escrito
movlw .13
call RS232_EnviaDato
10
25. OYECTOSPROYECTOS TEMPERATURA OKCON DECI COMPLETOTermometro Con 16F876A _LCD20X4_Y_PCControl_I2C_8_Sensores_De_Tempera
call PROGRAMAR ; Rutina de la librería "CONFIGURACION_DESDE_PC.INC"
;escribe en PC ; "PROGRAMAR: SENSOR1: Tmin: Tmax: HASTA EL
SENSOR8: Tmin: Tmax:"
nop
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;------------MENSAJE TIEMPO DE MUESTREO------------------
movlw MensajesAlPC_Tiempo_Muestreo ;carga el Mensaje para visualizar en el PC
call RS232_Mensaje ;Mensaje al PC
call Tiempo_De_Muestreo ;Rutina donde selecciono el valor 1-2-3 del tiempo de muestreo
(1= 10sg)(2=20 Sg)(3 = 1 min)
;y lo guarda en el registro: "TiempoMuestreo" y en EEPROM posición
.17
;--------------------------------------------------------------------------
No_Volver_A_PROGRAMAR ;Este primer corte es para una vez PROGRAMADAS LAS Tmin y Tmax
;No vuelva a salir lo de volver a PROGRAMARLAS
;; call RS232_Inicializa ;Inicializa la comunicación con el
puerto Serie. RA1=TX y RA5 = RD (en lugar de RA3 y RA4
;----No suprimirlo evito que salga "SENSOR 1" SI volviese a PROGRAMAR-----------
btfss PORTB,0 ;Si está a (1) Si llevar datos al PC
goto No_PC_0_1 ;Si está a (0) no llevar al PC
;-------------------------------------------------------------------------------
movlw .13
call RS232_EnviaDato
movlw MensajesAlPC_SENSOR ;carga la primera posición del mensaje "SENSOR "
call RS232_Mensaje ;lo visualiza en el PC
movlw MensajesAlPC_Sensor1 ;carga la primera posición del mensaje "1: "
call RS232_Mensaje ;lo visualiza en el PC
;---------------------------------------
;PONER AQUÍ SALTO SI NO QUIERO ENVIAR AL PC
No_PC_0_1 ; éste es el primer salto para no reflejar en PC
;--------------------------------------
; Se coloca para visualización en la T1:XXº T2:
movlw .3 ; Se coloca para visualización en la
call LCD_PosicionLinea1 ; primera línea más el valor del registro W
btfss TempSigno_0,7 ; ¿Temperatura negativa?.
goto TemperaturaPositiva_0 ; No, la temperatura es positiva.
TemperaturaNegativa_0
;Para comprobar que un registro vale (0) hay que cargar el registro sobre sí mismo
;mediante la instrucción (movf)(que es la única que posiciona flags), con lo cual se logra
;posicionar el flag (Z) sin variar su contenido.
;Si el sensor Falla daria -0º y no puede ser. Por tanto para que salga en blanco:
;Compara si el registro vale 0
movf TempSensor_0,F ;para posicionar el flag Z
btfsc STATUS,Z ;¿Es cero?, ¿Z=1? Si Z=1 "el Registro vale 0"
goto EliminarMenosCero_0 ;Si el valor es cero eliminar el menos -0º
;si es Z=0 el registro NO vale 0 por tanto escribir -
;Si el registro No vale Cero ponerle el signo -
movlw '-' ; Visualiza el signo "-" de temperatura negativa.
call LCD_Caracter
;---------------------------------------------------------------------------------------
;activar El "Flag_Es_Negativo" Para ver o no ver el signo 'º' por falta de espacio en LCD
bsf Flag_Es_Negativo,0
11
26. OYECTOSPROYECTOS TEMPERATURA OKCON DECI COMPLETOTermometro Con 16F876A _LCD20X4_Y_PCControl_I2C_8_Sensores_De_Tempera
;---------------------------------------------------------------------------------------
;_______________________________________________________________________
;++++++++++++++++++++AÑADIDO PARA VER EN EL PC++++++++++++
;PONER AQUÍ SALTO SI NO QUIERO ENVIAR AL PC
btfss PORTB,0 ;Compruebo si quiero PC o sólo LCD ;RB0=1 SÍ QUIERO PC
goto TemperaturaPositiva_0 ;sólo EN PANTALLA LCD
;PARA LLEVARLO AL PC En negativo
movlw '-' ; Visualiza el signo "-" de temperatura negativa. en el PC
call RS232_EnviaDato
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;______________________________________________________________________________
TemperaturaPositiva_0
movf TempSensor_0,W ; Visualiza el valor absoluto de la temperatura siempre en (+)
call BIN_a_BCD ; pasándola previamente a BCD.
Call Temperatura_En_LCD ;para ver la temperatura suprimiendo el cero no
significativo ej "089" saldrá "89"
;+++++++++++++AÑADIDO PARTE DECIMAL++++++++++++++++
movf DS1624_Decimal_0,F ;para ver si tiene el valor .0º en cuyo caso no visualizarlo
en la LCD por falta de espacio
btfsc STATUS,Z ;Si Z=1 es CERO LA PARTE DECIMAL .0º
goto Decimal_0_Es_Cero ;como es cero NO REPRESENTARLO y ponerle 'º'
;Si Z=0 NO ES CERO y por tanto visualizar el '.' y el 'º'
movlw '.' ; Visualiza el punto decimal.
call LCD_Caracter
movf DS1624_Decimal_0,W ;Visualiza la parte decimal
call LCD_Nibble ;Visualiza en el lugar actual de la pantalla el valor HEXADECIMAL
que almacena el nibble bajo del registro (W). El
;nibble alto en (W) no es tenido en cuenta ej: si (W) = 0101 0110 se
visualiza "6"
; si (W) es 1010 1110, se visualiza "E"
;------------lo he suprimido de la libreria Temperatura_a_LCD.INC-------------
btfsc Flag_TresCaracteres,0 ;Si tiene tres Caracteres la parte entera NO PONER 'º' por
razón de NO TENER espacio
goto Continua_0 ;
;Se representa el signo "º"
Decimal_0_Es_Cero
movlw MensajeGradoCentigrado ; En pantalla aparece "º".
call LCD_Mensaje
;++++++++++++++++++++++++++++++++++++++++++++++++++++
;PONER AQUÍ SALTO SI NO QUIERO ENVIAR AL PC
;ACTIVAR LAS SALIDAS comparando con los valores de la EEPROM programados
Continua_0
btfss PORTB,0 ;Compruebo si quiero PC o sólo LCD ;RB0=1 SÍ QUIERO PC
goto Histerisis_0 ;para también activar las salidas aún eligiendo solo el LCD sin
PC;;;;; goto VisualizaTermometro_LCD_1 ;EN PANTALLA LCD
;-------------------------------------
movf DS1624_Decimal_0,W ;para poder ver el valor en decimal de cada sensor librería
"temperatura_a_PC.INC"
movwf DS1624_Decimal
;--------------------------------------------------------------
movf TempSensor_0,W ; Visualiza el valor absoluto de la temperatura, en (+)
call Temperatura_En_PC ;Desde aquí se verán las Centanas-Decenas-Unidades en el PC
12
27. OYECTOSPROYECTOS TEMPERATURA OKCON DECI COMPLETOTermometro Con 16F876A _LCD20X4_Y_PCControl_I2C_8_Sensores_De_Tempera
;---------------------------------------------------------------------------------------
;+++++ACTIVA LA SALIDA CORRESPONDIENTE ENTRE LOS VALORES DE HISTERISIS ESTABLECIDOS++++++
;++++++ENTRE LA TempMin_X y TempMax_X. Es decir sólo activa entre estos valores++++++++
;---------------------------------------------------------------------------------------
Histerisis_0 ;Activar_Desactivar_Salidas
call EEPROM_Lectura_De_0_a_17 ;Esta en "EEPROM_16F87X.INC" para la lectura de los
valores de
;la TempMin y TempMax de cada sensor grabados en
la EEPROM
btfss TempSigno_0,7 ;Si el último bit es un "1" Es una temperatura Negativa.
goto EsPositivo_0
goto EsNegativo_0
EsPositivo_0
movf TempSensor_0,W ;Carga el Valor (+) de la Temperatura en (W)
goto Activar_Desactivar_Salidas_0 ;Se va a Activar o Desactivar la salida
EsNegativo_0
movf GlobalNegativa_0,W ;Carga el Valor (-) de la Temperatura en (W) se encuentra en
libreria "DS1624_Modificado_0.INC"
movwf TempSensor_0 ;y ya en VALOR NEGATIVO lo llevo a TempSensor_0
;goto Activar_Desactivar_Salidas ;Se va a Activar o
Desactivar la salida
;-----está modificado para hacer como en el programa de internet que active por encima de la
tempMin hasta la TempMax pero siempre de abajo a arriba y no al revés
Activar_Desactivar_Salidas_0
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;-----------------------------------------------------------------
;Si la Temperatura del Sensor (TempSensor_x)está por debajo de la TempMin_X estará activa la
Salida. Y se mantendrá activa hasta
;alcanzar la TempMax_X . Nota si partimos de una temperatura del sensor comprendida entre dichos
valores No estará activa la salida
;hasta quedar por debajo de la TempMini_X.
;(La otras instrucciones que tenía la salida estaría activa siempre que la temperatura del
sensor estuviese entre los valores
; de la TempMin y la TempMax)
;-----------------------------------------------------------------
movf TempMax_0,W
subwf TempSensor_0,W
btfsc STATUS,C ;¿C=0? TempSensor_0 < (TempMax_0)
bcf PORTC,0 ;Desactiva la salida 0 de PORTC por ser Mayor o igual la
TempMax_0 que la del TempSensor_0
movf TempMin_0,W
subwf TempSensor_0,W
btfss STATUS,C ;¿C=1? (TempMin_0) >= TempSensor_0
bsf PORTC,0 ;Activa la salida 0 de PORTC por ser Mayor la TempMin_0 que
la del Sensor_0
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;-----------------PARA VER EN LCD LA TEMPERATURA DEL Sensor_1---------------------
;-------------------ESTE COMIENZA EN LA LÍNEA 1 posición .11 -------------------------
VisualizaTermometro_LCD_1 ;EN PANTALLA LCD
;---------------------------------------
;PONER AQUÍ SALTO SI NO QUIERO ENVIAR AL PC
btfss PORTB,0 ;Compruebo si quiero PC o sólo LCD ;RB0=1 SÍ QUIERO PC
goto No_PC_1_1 ;
;-------------------------------------
;+++++++++++++++++++++++++++++++++++++++++++++++++++++
13
28. OYECTOSPROYECTOS TEMPERATURA OKCON DECI COMPLETOTermometro Con 16F876A _LCD20X4_Y_PCControl_I2C_8_Sensores_De_Tempera
;SOBRA EL goto no_pc_2 de arriba
; 2º CORTE , NO HACE FALTA LLAMAR POR HABERLO YA HECHO DESDE EL PRIMER SENSOR
movlw MensajesAlPC_SENSOR ;carga la primera posición del mensaje "SENSOR "
call RS232_Mensaje ;lo visualiza en el PC
movlw MensajesAlPC_Sensor2 ;carga la primera posición del mensaje "2: "
call RS232_Mensaje ;lo visualiza en el PC
; movlw MensajesAlPC_Sensor2 ;carga la primera posición del mensaje "SENSOR 2: "
; call RS232_Mensaje ;lo visualiza en el PC
;++++++++++++++++++++++++++++++++++++++++++++++++++++
;PONER AQUÍ SALTO SI NO QUIERO ENVIAR AL PC
No_PC_1_1 ; éste es el segundo salto para no reflejar en PC
;-------------------------------------
movlw .11 ; Se coloca para visualización en la T1: T2:XXº
call LCD_PosicionLinea1 ; primera línea.
btfss TempSigno_1,7 ; ¿Temperatura negativa?.
goto TemperaturaPositiva_1 ; No, la temperatura es positiva.
TemperaturaNegativa_1
;Si el el sensor Falla daria -0º y no puede ser. Por tanto para que salga en blanco:
movf TempSensor_1,F
btfsc STATUS,Z ;¿Es cero?, ¿Z=1? Si Z=1 "el Registro vale 0"
goto EliminarMenosCero_1 ;Si el valor es cero eliminar el menos -0º
;si es Z=0 el registro NO vale 0 por tanto escribir -
;Si el registro No vale Cero ponerle el signo -
movlw '-' ; Visualiza el signo "-" de temperatura negativa.
call LCD_Caracter
;---------------------------------------------------------------------------------------
;activar El "Flag_Es_Negativo" Para ver o no ver el signo 'º' por falta de espacio en LCD
bsf Flag_Es_Negativo,0
;---------------------------------------------------------------------------------------
;_______________________________________________________________________
;PONER AQUÍ SALTO SI NO QUIERO ENVIAR AL PC
btfss PORTB,0 ;Compruebo si quiero PC o sólo LCD ;RB0=1 SÍ QUIERO PC
goto No_PC_1_2 ;
;-------------------------------------
;PARA LLEVARLO AL PC En negativo
movlw '-' ; Visualiza el signo "-" de temperatura negativa. en el PC
call RS232_EnviaDato
;---------------------------------------
;PONER AQUÍ SALTO SI NO QUIERO ENVIAR AL PC
No_PC_1_2 ; se puede quitar. Salto para no reflejar en PC
nop ;se puede quitar
TemperaturaPositiva_1
movf TempSensor_1,W ; Visualiza el valor absoluto de la temperatura,
call BIN_a_BCD ; pasándola previamente a BCD.
call Temperatura_En_LCD ;para ver la temperatura suprimiendo el cero no significativo ej
"089" saldrá "89"
;+++++++++++++AÑADIDO PARTE DECIMAL++++++++++++++++
movf DS1624_Decimal_1,F ;para ver si tiene el valor .0º en cuyo caso no visualizarlo
en la LCD por falta de espacio
btfsc STATUS,Z ;Si Z=1 es CERO LA PARTE DECIMAL .0º
goto Decimal_1_Es_Cero ;como es cero NO REPRESENTARLO y ponerle 'º'
;Si Z=0 NO ES CERO y por tanto visualizar el '.' y el 'º'
14
29. OYECTOSPROYECTOS TEMPERATURA OKCON DECI COMPLETOTermometro Con 16F876A _LCD20X4_Y_PCControl_I2C_8_Sensores_De_Tempera
movlw '.' ; Visualiza el punto decimal.
call LCD_Caracter
movf DS1624_Decimal_1,W ;Visualiza la parte decimal
call LCD_Nibble ;Visualiza en el lugar actual de la pantalla el valor HEXADECIMAL
que almacena el nibble bajo del registro (W). El
;nibble alto en (W) no es tenido en cuenta ej: si (W) = 0101 0110 se
visualiza "6"
; si (W) es 1010 1110, se visualiza "E"
;------------lo he suprimido de la libreria Temperatura_a_LCD.INC-------------
btfsc Flag_TresCaracteres,0 ;Si tiene tres Caracteres la parte entera NO PONER 'º' por
razón de NO TENER espacio
goto Continua_1 ;
;Se representa el signo "º"
Decimal_1_Es_Cero
movlw MensajeGradoCentigrado ; En pantalla aparece "º".
call LCD_Mensaje
;++++++++++++++++++++++++++++++++++++++++++++++++++++
;PONER AQUÍ SALTO SI NO QUIERO ENVIAR AL PC
;ACTIVAR LAS SALIDAS comparando con los valores de la EEPROM programados
Continua_1
btfss PORTB,0 ;Compruebo si quiero PC o sólo LCD ;RB0=1 SÍ QUIERO PC
goto Histerisis_1 ;Se va a Activar o Desactivar la salida
;-------------------------------------
;--------------------------------------------------------------
movf DS1624_Decimal_1,W ;para poder ver el valor en decimal de cada sensor librería
"temperatura_a_PC.INC"
movwf DS1624_Decimal
;--------------------------------------------------------------
movf TempSensor_1,W ; Visualiza el valor absoluto de la temperatura,
call Temperatura_En_PC ;Desde aquí se verán las centenas-decenas-unidades en el PC
; call RetornoCarro_Y_CambioLinea ; hace cambio de linea con retorno
;---------------------------------------------------------------------------------------
;+++++ACTIVA LA SALIDA CORRESPONDIENTE ENTRE LOS VALORES DE HISTERISIS ESTABLECIDOS++++++
;++++++ENTRE LA TempMin_1 y TempMax_1. Es decir sólo activa entre estos valores++++++++
;---------------------------------------------------------------------------------------
Histerisis_1
btfss TempSigno_1,7 ;Si el último bit es un "1" Es una temperatura Negativa.
goto EsPositivo_1
goto EsNegativo_1
EsPositivo_1
movf TempSensor_1,W ;Carga el Valor (+) de la Temperatura en (W)
goto Activar_Desactivar_Salidas_1 ;Se va a Activar o Desactivar la salida
EsNegativo_1
movf GlobalNegativa_1,W ;Carga el Valor (-) de la Temperatura en (W) se encuentra en
libreria "DS1624_Modificado_0.INC"
movwf TempSensor_1 ;y ya en VALOR NEGATIVO lo llevo a TempSensor_1
;goto Activar_Desactivar_Salidas ;Se va a Activar o
Desactivar la salida
Activar_Desactivar_Salidas_1
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;-----------------------------------------------------------------
;Si la Temperatura del Sensor (TempSensor_x)está por debajo de la TempMin_X estará activa la
Salida. Y se mantendrá activa hasta
;alcanzar la TempMax_X . Nota si partimos de una temperatura del sensor comprendida entre dichos
15
30. OYECTOSPROYECTOS TEMPERATURA OKCON DECI COMPLETOTermometro Con 16F876A _LCD20X4_Y_PCControl_I2C_8_Sensores_De_Tempera
valores No estará activa la salida
;hasta quedar por debajo de la TempMini_X.
;(La otras instrucciones que tenía la salida estaría activa siempre que la temperatura del
sensor estuviese entre los valores
; de la TempMin y la TempMax)
;-----------------------------------------------------------------
movf TempMax_1,W
subwf TempSensor_1,W
btfsc STATUS,C ;¿C=0? TempSensor_1 < (TempMax_1)
bcf PORTC,1 ;Desactiva la salida 0 de PORTC por ser Mayor o igual la
TempMax_0 que la del TempSensor_1
movf TempMin_1,W
subwf TempSensor_1,W
btfss STATUS,C ;¿C=1? (TempMin_1) >= TempSensor_1
bsf PORTC,1 ;Activa la salida 1 de PORTC por ser Mayor la TempMin_1 que
la del Sensor_1
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;Activar_Desactivar_Salidas_1
;;Para comprobar si un registro es mayor o menor que otro ver la pag 123 del
libro de Remiro.
; subwf TempMin_1,W ;(TempMin_1)- (TempSensor_1) subwf TempMin_1,W
; btfss STATUS,C ;¿C=1? (TempMin_1) >= TempSensor_1
; goto Menor_1
;goto MayorIgual_1 ;sobra
;MayorIgual_1
;C=1 Entonces ha sido (TempMin_1 ó TempMax_1) >= TempSensor_1
; btfsc STATUS,Z ;SI (Z)=1 SON IGUALES Y EN ESE CASO ACTIVAR LA SALIDA para que
se active desde el valor mínimo al máximo que establezcamos
; goto Menor_1
; bcf PORTC,1 ;Desactiva la salida 1 de PORTC
; goto VisualizaTermometro_LCD_2 ;***Para salir y continuar con las siguientes
instrucciones Sería AL VisualizaTermometro_LCD_2
;Menor_1
; bsf PORTC,1 ;Activa la salida 0 de PORTC
; movf TempSensor_1,W ;valor absoluto de Temperatura del "Sensor 2"
; subwf TempMax_1,W ;(TempMax_1)- (TempSensor_1)
; btfss STATUS,C ;¿C=1? (TempMax_1) >= TempSensor_1
; goto MayorIgual_1 ;"Desactiva la Salida Estará activa sólo entre la TempMin y la
TempMax"
;------------------------------------------------------------------
;-----------------PARA VER EN LCD LA TEMPERATURA DEL Sensor_2---------------------
;-------------------ESTE COMIENZA EN LA LÍNEA 2 posición .3 -------------------------
VisualizaTermometro_LCD_2 ;EN PANTALLA LCD
;---------------------------------------
;PONER AQUÍ SALTO SI NO QUIERO ENVIAR AL PC
btfss PORTB,0 ;Compruebo si quiero PC o sólo LCD ;RB0=1 SÍ QUIERO PC
goto No_PC_2_1 ;
;-------------------------------------
;+++++++++++++++++++++++++++++++++++++++++++++++++++++
;SOBRA EL goto no_pc_2 de arriba
; 2º CORTE , NO HACE FALTA LLAMAR POR HABERLO YA HECHO DESDE EL PRIMER SENSOR
movlw MensajesAlPC_SENSOR ;carga la primera posición del mensaje "SENSOR "
16
31. OYECTOSPROYECTOS TEMPERATURA OKCON DECI COMPLETOTermometro Con 16F876A _LCD20X4_Y_PCControl_I2C_8_Sensores_De_Tempera
call RS232_Mensaje ;lo visualiza en el PC
movlw MensajesAlPC_Sensor3 ;carga la primera posición del mensaje "3: "
call RS232_Mensaje ;lo visualiza en el PC
; movlw MensajesAlPC_Sensor3 ;carga la primera posición del mensaje "SENSOR 3: "
; call RS232_Mensaje ;lo visualiza en el PC
;++++++++++++++++++++++++++++++++++++++++++++++++++++
;PONER AQUÍ SALTO SI NO QUIERO ENVIAR AL PC
No_PC_2_1 ; éste es el segundo salto para no reflejar en PC
;-------------------------------------
movlw .3 ; Se coloca para visualización en la T3: T4:XXº
call LCD_PosicionLinea2 ; SEGUNDA línea.
btfss TempSigno_2,7 ; ¿Temperatura negativa?.
goto TemperaturaPositiva_2 ; No, la temperatura es positiva.
TemperaturaNegativa_2
;Si el el sensor Falla daria -0º y no puede ser. Por tanto para que salga en blanco:
movf TempSensor_2,F
btfsc STATUS,Z ;¿Es cero?, ¿Z=1? Si Z=1 "el Registro vale 0"
goto EliminarMenosCero_2 ;Si el valor es cero eliminar el menos -0º
;si es Z=0 el registro NO vale 0 por tanto escribir -
;Si el registro No vale Cero ponerle el signo -
movlw '-' ; Visualiza el signo "-" de temperatura negativa.
call LCD_Caracter
;---------------------------------------------------------------------------------------
;activar El "Flag_Es_Negativo" Para ver o no ver el signo 'º' por falta de espacio en LCD
bsf Flag_Es_Negativo,0
;---------------------------------------------------------------------------------------
;_______________________________________________________________________
;PONER AQUÍ SALTO SI NO QUIERO ENVIAR AL PC
btfss PORTB,0 ;Compruebo si quiero PC o sólo LCD ;RB0=1 SÍ QUIERO PC
goto No_PC_2_2 ;
;-------------------------------------
;PARA LLEVARLO AL PC En negativo
movlw '-' ; Visualiza el signo "-" de temperatura negativa. en el PC
call RS232_EnviaDato
;---------------------------------------
;PONER AQUÍ SALTO SI NO QUIERO ENVIAR AL PC
No_PC_2_2 ; éste es el tercer salto para no reflejar en PC
nop ;se puede quitar
TemperaturaPositiva_2
movf TempSensor_2,W ; Visualiza el valor absoluto de la temperatura,
call BIN_a_BCD ; pasándola previamente a BCD.
call Temperatura_En_LCD ;para ver la temperatura suprimiendo el cero no significativo ej
"089" saldrá "89"
;+++++++++++++AÑADIDO PARTE DECIMAL++++++++++++++++
movf DS1624_Decimal_2,F ;para ver si tiene el valor .0º en cuyo caso no visualizarlo
en la LCD por falta de espacio
btfsc STATUS,Z ;Si Z=1 es CERO LA PARTE DECIMAL .0º
goto Decimal_2_Es_Cero ;como es cero NO REPRESENTARLO y ponerle 'º'
;Si Z=0 NO ES CERO y por tanto visualizar el '.' y el 'º'
movlw '.' ; Visualiza el punto decimal.
17
32. OYECTOSPROYECTOS TEMPERATURA OKCON DECI COMPLETOTermometro Con 16F876A _LCD20X4_Y_PCControl_I2C_8_Sensores_De_Tempera
call LCD_Caracter
movf DS1624_Decimal_2,W ;Visualiza la parte decimal
call LCD_Nibble ;Visualiza en el lugar actual de la pantalla el valor HEXADECIMAL
que almacena el nibble bajo del registro (W). El
;nibble alto en (W) no es tenido en cuenta ej: si (W) = 0101 0110 se
visualiza "6"
; si (W) es 1010 1110, se visualiza "E"
;------------lo he suprimido de la libreria Temperatura_a_LCD.INC-------------
btfsc Flag_TresCaracteres,0 ;Si tiene tres Caracteres la parte entera NO PONER 'º' por
razón de NO TENER espacio
goto Continua_2 ;
;Se representa el signo "º"
Decimal_2_Es_Cero
movlw MensajeGradoCentigrado ; En pantalla aparece "º".
call LCD_Mensaje
;++++++++++++++++++++++++++++++++++++++++++++++++++++
;PONER AQUÍ SALTO SI NO QUIERO ENVIAR AL PC
;ACTIVAR LAS SALIDAS comparando con los valores de la EEPROM programados
Continua_2
btfss PORTB,0 ;Compruebo si quiero PC o sólo LCD ;RB0=1 SÍ QUIERO PC
goto Histerisis_2 ;Se va a Activar o Desactivar la salida
;-------------------------------------
;--------------------------------------------------------------
movf DS1624_Decimal_2,W ;para poder ver el valor en decimal de cada sensor librería
"temperatura_a_PC.INC"
movwf DS1624_Decimal
;--------------------------------------------------------------
movf TempSensor_2,W ; Visualiza el valor absoluto de la temperatura,
call Temperatura_En_PC ;Desde aquí se verán las centenas-decenas-unidades en el PC
; call RetornoCarro_Y_CambioLinea ; hace cambio de linea con retorno
;---------------------------------------------------------------------------------------
;+++++ACTIVA LA SALIDA CORRESPONDIENTE ENTRE LOS VALORES DE HISTERISIS ESTABLECIDOS++++++
;++++++ENTRE LA TempMin_2 y TempMax_2. Es decir sólo activa entre estos valores++++++++
;---------------------------------------------------------------------------------------
Histerisis_2
btfss TempSigno_2,7 ;Si el último bit es un "1" Es una temperatura Negativa.
goto EsPositivo_2
goto EsNegativo_2
EsPositivo_2
movf TempSensor_2,W ;Carga el Valor (+) de la Temperatura en (W)
goto Activar_Desactivar_Salidas_2 ;Se va a Activar o Desactivar la salida
EsNegativo_2
movf GlobalNegativa_2,W ;Carga el Valor (-) de la Temperatura en (W) se encuentra en
libreria "DS1624_Modificado_0.INC"
movwf TempSensor_2 ;y ya en VALOR NEGATIVO lo llevo a TempSensor_1
;goto Activar_Desactivar_Salidas ;Se va a Activar o
Desactivar la salida
Activar_Desactivar_Salidas_2
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;-----------------------------------------------------------------
;Si la Temperatura del Sensor (TempSensor_x)está por debajo de la TempMin_X estará activa la
Salida. Y se mantendrá activa hasta
;alcanzar la TempMax_X . Nota si partimos de una temperatura del sensor comprendida entre dichos
valores No estará activa la salida
;hasta quedar por debajo de la TempMini_X.
;(La otras instrucciones que tenía la salida estaría activa siempre que la temperatura del
sensor estuviese entre los valores
18
33. OYECTOSPROYECTOS TEMPERATURA OKCON DECI COMPLETOTermometro Con 16F876A _LCD20X4_Y_PCControl_I2C_8_Sensores_De_Tempera
; de la TempMin y la TempMax)
;-----------------------------------------------------------------
movf TempMax_2,W
subwf TempSensor_2,W
btfsc STATUS,C ;¿C=0? TempSensor_2 < (TempMax_2)
bcf PORTC,2 ;Desactiva la salida 2 de PORTC por ser Mayor o igual la
TempMax_2 que la del TempSensor_2
movf TempMin_2,W
subwf TempSensor_2,W
btfss STATUS,C ;¿C=1? (TempMin_2) >= TempSensor_2
bsf PORTC,2 ;Activa la salida 2 de PORTC por ser Mayor la TempMin_2 que
la del Sensor_2
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;-----------------PARA VER EN LCD LA TEMPERATURA DEL Sensor_3---------------------
;-------------------ESTE COMIENZA EN LA LÍNEA 2 posición .11 -------------------------
VisualizaTermometro_LCD_3 ;EN PANTALLA LCD
;---------------------------------------
;PONER AQUÍ SALTO SI NO QUIERO ENVIAR AL PC
btfss PORTB,0 ;Compruebo si quiero PC o sólo LCD ;RB0=1 SÍ QUIERO PC
goto No_PC_3_1 ;
;-------------------------------------
;+++++++++++++++++++++++++++++++++++++++++++++++++++++
;SOBRA EL goto no_pc_2 de arriba
; 2º CORTE , NO HACE FALTA LLAMAR POR HABERLO YA HECHO DESDE EL PRIMER SENSOR
movlw MensajesAlPC_SENSOR ;carga la primera posición del mensaje "SENSOR "
call RS232_Mensaje ;lo visualiza en el PC
movlw MensajesAlPC_Sensor4 ;carga la primera posición del mensaje "4: "
call RS232_Mensaje ;lo visualiza en el PC
;---------------------------------------
;PONER AQUÍ SALTO SI NO QUIERO ENVIAR AL PC
No_PC_3_1 ; éste es el segundo salto para no reflejar en PC
;-------------------------------------
movlw .11 ; Se coloca para visualización en la T3: T4:XXº
call LCD_PosicionLinea2 ; SEGUNDA línea.
btfss TempSigno_3,7 ; ¿Temperatura negativa?.
goto TemperaturaPositiva_3 ; No, la temperatura es positiva.
TemperaturaNegativa_3
;Si el el sensor Falla daria -0º y no puede ser. Por tanto para que salga en blanco:
movf TempSensor_3,F
btfsc STATUS,Z ;¿Es cero?, ¿Z=1? Si Z=1 "el Registro vale 0"
goto EliminarMenosCero_3 ;Si el valor es cero eliminar el menos -0º
;si es Z=0 el registro NO vale 0 por tanto escribir -
;Si el registro No vale Cero ponerle el signo -
movlw '-' ; Visualiza el signo "-" de temperatura negativa.
call LCD_Caracter
;---------------------------------------------------------------------------------------
;activar El "Flag_Es_Negativo" Para ver o no ver el signo 'º' por falta de espacio en LCD
bsf Flag_Es_Negativo,0
;---------------------------------------------------------------------------------------
;_______________________________________________________________________
19
34. OYECTOSPROYECTOS TEMPERATURA OKCON DECI COMPLETOTermometro Con 16F876A _LCD20X4_Y_PCControl_I2C_8_Sensores_De_Tempera
;PONER AQUÍ SALTO SI NO QUIERO ENVIAR AL PC
btfss PORTB,0 ;Compruebo si quiero PC o sólo LCD ;RB0=1 SÍ QUIERO PC
goto No_PC_3_2 ;
;-------------------------------------
;PARA LLEVARLO AL PC En negativo
movlw '-' ; Visualiza el signo "-" de temperatura negativa. en el PC
call RS232_EnviaDato
;---------------------------------------
;PONER AQUÍ SALTO SI NO QUIERO ENVIAR AL PC
No_PC_3_2 ; éste es el tercer salto para no reflejar en PC
nop ;se puede quitar
TemperaturaPositiva_3
movf TempSensor_3,W ; Visualiza el valor absoluto de la temperatura,
call BIN_a_BCD ; pasándola previamente a BCD.
call Temperatura_En_LCD ;para ver la temperatura suprimiendo el cero no significativo ej
"089" saldrá "89"
;+++++++++++++AÑADIDO PARTE DECIMAL++++++++++++++++
movf DS1624_Decimal_3,F ;para ver si tiene el valor .0º en cuyo caso no visualizarlo
en la LCD por falta de espacio
btfsc STATUS,Z ;Si Z=1 es CERO LA PARTE DECIMAL .0º
goto Decimal_3_Es_Cero ;como es cero NO REPRESENTARLO y ponerle 'º'
;Si Z=0 NO ES CERO y por tanto visualizar el '.' y el 'º'
movlw '.' ; Visualiza el punto decimal.
call LCD_Caracter
movf DS1624_Decimal_3,W ;Visualiza la parte decimal
call LCD_Nibble ;Visualiza en el lugar actual de la pantalla el valor HEXADECIMAL
que almacena el nibble bajo del registro (W). El
;nibble alto en (W) no es tenido en cuenta ej: si (W) = 0101 0110 se
visualiza "6"
; si (W) es 1010 1110, se visualiza "E"
;------------lo he suprimido de la libreria Temperatura_a_LCD.INC-------------
btfsc Flag_TresCaracteres,0 ;Si tiene tres Caracteres la parte entera NO PONER 'º' por
razón de NO TENER espacio
goto Continua_3 ;
;Se representa el signo "º"
Decimal_3_Es_Cero
movlw MensajeGradoCentigrado ; En pantalla aparece "º".
call LCD_Mensaje
;++++++++++++++++++++++++++++++++++++++++++++++++++++
;PONER AQUÍ SALTO SI NO QUIERO ENVIAR AL PC
;ACTIVAR LAS SALIDAS comparando con los valores de la EEPROM programados
Continua_3
btfss PORTB,0 ;Compruebo si quiero PC o sólo LCD ;RB0=1 SÍ QUIERO PC
goto Histerisis_3 ;Se va a Activar o Desactivar la salida
;-------------------------------------
;--------------------------------------------------------------
movf DS1624_Decimal_3,W ;para poder ver el valor en decimal de cada sensor librería
"temperatura_a_PC.INC"
movwf DS1624_Decimal
;--------------------------------------------------------------
movf TempSensor_3,W ; Visualiza el valor absoluto de la temperatura,
call Temperatura_En_PC ;Desde aquí se verán las centenas-decenas-unidades en el PC
; call RetornoCarro_Y_CambioLinea ; hace cambio de linea con retorno
20
35. OYECTOSPROYECTOS TEMPERATURA OKCON DECI COMPLETOTermometro Con 16F876A _LCD20X4_Y_PCControl_I2C_8_Sensores_De_Tempera
;---------------------------------------------------------------------------------------
;+++++ACTIVA LA SALIDA CORRESPONDIENTE ENTRE LOS VALORES DE HISTERISIS ESTABLECIDOS++++++
;++++++ENTRE LA TempMin_3 y TempMax_3. Es decir sólo activa entre estos valores++++++++
;---------------------------------------------------------------------------------------
Histerisis_3
btfss TempSigno_3,7 ;Si el último bit es un "1" Es una temperatura Negativa.
goto EsPositivo_3
goto EsNegativo_3
EsPositivo_3
movf TempSensor_3,W ;Carga el Valor (+) de la Temperatura en (W)
goto Activar_Desactivar_Salidas_3 ;Se va a Activar o Desactivar la salida
EsNegativo_3
movf GlobalNegativa_3,W ;Carga el Valor (-) de la Temperatura en (W) se encuentra en
libreria "DS1624_Modificado_0.INC"
movwf TempSensor_3 ;y ya en VALOR NEGATIVO lo llevo a TempSensor_1
;goto Activar_Desactivar_Salidas ;Se va a Activar o
Desactivar la salida
Activar_Desactivar_Salidas_3
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;-----------------------------------------------------------------
;Si la Temperatura del Sensor (TempSensor_x)está por debajo de la TempMin_X estará activa la
Salida. Y se mantendrá activa hasta
;alcanzar la TempMax_X . Nota si partimos de una temperatura del sensor comprendida entre dichos
valores No estará activa la salida
;hasta quedar por debajo de la TempMini_X.
;(La otras instrucciones que tenía la salida estaría activa siempre que la temperatura del
sensor estuviese entre los valores
; de la TempMin y la TempMax)
;-----------------------------------------------------------------
movf TempMax_3,W
subwf TempSensor_3,W
btfsc STATUS,C ;¿C=0? TempSensor_3 < (TempMax_3)
bcf PORTC,3 ;Desactiva la salida 3 de PORTC por ser Mayor o igual la
TempMax_3 que la del TempSensor_3
movf TempMin_3,W
subwf TempSensor_3,W
btfss STATUS,C ;¿C=1? (TempMin_3) >= TempSensor_3
bsf PORTC,3 ;Activa la salida 3 de PORTC por ser Mayor la TempMin_3 que
la del Sensor_3
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;-----------------PARA VER EN LCD LA TEMPERATURA DEL Sensor_4---------------------
;-------------------ESTE COMIENZA EN LA LÍNEA 3 posición .3 -------------------------
VisualizaTermometro_LCD_4 ;EN PANTALLA LCD
;PONER AQUÍ SALTO SI NO QUIERO ENVIAR AL PC
btfss PORTB,0 ;Compruebo si quiero PC o sólo LCD ;RB0=1 SÍ QUIERO PC
goto No_PC_4_1 ;
;-------------------------------------
;+++++++++++++++++++++++++++++++++++++++++++++++++++++
;SOBRA EL goto no_pc_2 de arriba
; 2º CORTE , NO HACE FALTA LLAMAR POR HABERLO YA HECHO DESDE EL PRIMER SENSOR
movlw MensajesAlPC_SENSOR ;carga la primera posición del mensaje "SENSOR "
call RS232_Mensaje ;lo visualiza en el PC
21
36. OYECTOSPROYECTOS TEMPERATURA OKCON DECI COMPLETOTermometro Con 16F876A _LCD20X4_Y_PCControl_I2C_8_Sensores_De_Tempera
movlw MensajesAlPC_Sensor5 ;carga la primera posición del mensaje "5: "
call RS232_Mensaje ;lo visualiza en el PC
;PONER AQUÍ SALTO SI NO QUIERO ENVIAR AL PC
No_PC_4_1 ; éste es el segundo salto para no reflejar en PC
;-------------------------------------
movlw .3 ; Se coloca para visualización en la T5:XXº T6:
call LCD_PosicionLinea3 ; primera línea.
btfss TempSigno_4,7 ; ¿Temperatura negativa?.
goto TemperaturaPositiva_4 ; No, la temperatura es positiva.
TemperaturaNegativa_4
;Si el el sensor Falla daria -0º y no puede ser. Por tanto para que salga en blanco:
movf TempSensor_4,F
btfsc STATUS,Z ;¿Es cero?, ¿Z=1? Si Z=1 "el Registro vale 0"
goto EliminarMenosCero_4 ;Si el valor es cero eliminar el menos -0º
;si es Z=0 el registro NO vale 0 por tanto escribir -
;Si el registro No vale Cero ponerle el signo -
movlw '-' ; Visualiza el signo "-" de temperatura negativa.
call LCD_Caracter
;---------------------------------------------------------------------------------------
;activar El "Flag_Es_Negativo" Para ver o no ver el signo 'º' por falta de espacio en LCD
bsf Flag_Es_Negativo,0
;---------------------------------------------------------------------------------------
;_______________________________________________________________________
;PONER AQUÍ SALTO SI NO QUIERO ENVIAR AL PC
btfss PORTB,0 ;Compruebo si quiero PC o sólo LCD ;RB0=1 SÍ QUIERO PC
goto No_PC_4_2 ;
;-------------------------------------
;PARA LLEVARLO AL PC En negativo
movlw '-' ; Visualiza el signo "-" de temperatura negativa. en el PC
call RS232_EnviaDato
;---------------------------------------
;PONER AQUÍ SALTO SI NO QUIERO ENVIAR AL PC
No_PC_4_2 ; éste es el tercer salto para no reflejar en PC
;-------------------------------------
nop ;se puede quitar
TemperaturaPositiva_4
movf TempSensor_4,W ; Visualiza el valor absoluto de la temperatura,
call BIN_a_BCD ; pasándola previamente a BCD.
call Temperatura_En_LCD ;para ver la temperatura suprimiendo el cero no significativo ej
"089" saldrá "89"
;+++++++++++++AÑADIDO PARTE DECIMAL++++++++++++++++
movf DS1624_Decimal_4,F ;para ver si tiene el valor .0º en cuyo caso no visualizarlo
en la LCD por falta de espacio
btfsc STATUS,Z ;Si Z=1 es CERO LA PARTE DECIMAL .0º
goto Decimal_4_Es_Cero ;como es cero NO REPRESENTARLO y ponerle 'º'
;Si Z=0 NO ES CERO y por tanto visualizar el '.' y el 'º'
movlw '.' ; Visualiza el punto decimal.
call LCD_Caracter
movf DS1624_Decimal_4,W ;Visualiza la parte decimal
call LCD_Nibble ;Visualiza en el lugar actual de la pantalla el valor HEXADECIMAL
que almacena el nibble bajo del registro (W). El
;nibble alto en (W) no es tenido en cuenta ej: si (W) = 0101 0110 se
visualiza "6"
22
37. OYECTOSPROYECTOS TEMPERATURA OKCON DECI COMPLETOTermometro Con 16F876A _LCD20X4_Y_PCControl_I2C_8_Sensores_De_Tempera
; si (W) es 1010 1110, se visualiza "E"
;------------lo he suprimido de la libreria Temperatura_a_LCD.INC-------------
btfsc Flag_TresCaracteres,0 ;Si tiene tres Caracteres la parte entera NO PONER 'º' por
razón de NO TENER espacio
goto Continua_4 ;
;Se representa el signo "º"
Decimal_4_Es_Cero
movlw MensajeGradoCentigrado ; En pantalla aparece "º".
call LCD_Mensaje
;++++++++++++++++++++++++++++++++++++++++++++++++++++
;PONER AQUÍ SALTO SI NO QUIERO ENVIAR AL PC
;ACTIVAR LAS SALIDAS comparando con los valores de la EEPROM programados
Continua_4
btfss PORTB,0 ;Compruebo si quiero PC o sólo LCD ;RB0=1 SÍ QUIERO PC
goto Histerisis_4 ;Se va a Activar o Desactivar la salida ;;;;;No_PC_4 ;
;-------------------------------------
;--------------------------------------------------------------
movf DS1624_Decimal_4,W ;para poder ver el valor en decimal de cada sensor librería
"temperatura_a_PC.INC"
movwf DS1624_Decimal
;--------------------------------------------------------------
movf TempSensor_4,W ; Visualiza el valor absoluto de la temperatura,
call Temperatura_En_PC ;Desde aquí se verán las centenas-decenas-unidades en el PC
; call RetornoCarro_Y_CambioLinea ; hace cambio de linea con retorno
;---------------------------------------------------------------------------------------
;+++++ACTIVA LA SALIDA CORRESPONDIENTE ENTRE LOS VALORES DE HISTERISIS ESTABLECIDOS++++++
;++++++ENTRE LA TempMin_4 y TempMax_4. Es decir sólo activa entre estos valores++++++++
;---------------------------------------------------------------------------------------
Histerisis_4
btfss TempSigno_4,7 ;Si el último bit es un "1" Es una temperatura Negativa.
goto EsPositivo_4
goto EsNegativo_4
EsPositivo_4
movf TempSensor_4,W ;Carga el Valor (+) de la Temperatura en (W)
goto Activar_Desactivar_Salidas_4 ;Se va a Activar o Desactivar la salida
EsNegativo_4
movf GlobalNegativa_4,W ;Carga el Valor (-) de la Temperatura en (W) se encuentra en
libreria "DS1624_Modificado_0.INC"
movwf TempSensor_4 ;y ya en VALOR NEGATIVO lo llevo a TempSensor_1
;goto Activar_Desactivar_Salidas ;Se va a Activar o
Desactivar la salida
Activar_Desactivar_Salidas_4
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;-----------------------------------------------------------------
;Si la Temperatura del Sensor (TempSensor_x)está por debajo de la TempMin_X estará activa la
Salida. Y se mantendrá activa hasta
;alcanzar la TempMax_X . Nota si partimos de una temperatura del sensor comprendida entre dichos
valores No estará activa la salida
;hasta quedar por debajo de la TempMini_X.
;(La otras instrucciones que tenía la salida estaría activa siempre que la temperatura del
sensor estuviese entre los valores
; de la TempMin y la TempMax)
;-----------------------------------------------------------------
movf TempMax_4,W
subwf TempSensor_4,W
btfsc STATUS,C ;¿C=0? TempSensor_4 < (TempMax_4)
bcf PORTC,4 ;Desactiva la salida 4 de PORTC por ser Mayor o igual la
TempMax_4 que la del TempSensor_4
23
38. OYECTOSPROYECTOS TEMPERATURA OKCON DECI COMPLETOTermometro Con 16F876A _LCD20X4_Y_PCControl_I2C_8_Sensores_De_Tempera
movf TempMin_4,W
subwf TempSensor_4,W
btfss STATUS,C ;¿C=1? (TempMin_4) >= TempSensor_4
bsf PORTC,4 ;Activa la salida 4 de PORTC por ser Mayor la TempMin_4 que
la del Sensor_4
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;-----------------PARA VER EN LCD LA TEMPERATURA DEL Sensor_5---------------------
;-------------------ESTE COMIENZA EN LA LÍNEA 3 posición .11 -------------------------
VisualizaTermometro_LCD_5 ;EN PANTALLA LCD
;---------------------------------------
;PONER AQUÍ SALTO SI NO QUIERO ENVIAR AL PC
btfss PORTB,0 ;Compruebo si quiero PC o sólo LCD ;RB0=1 SÍ QUIERO PC
goto No_PC_5_1 ;
;-------------------------------------
;+++++++++++++++++++++++++++++++++++++++++++++++++++++
;SOBRA EL goto no_pc_2 de arriba
; 2º CORTE , NO HACE FALTA LLAMAR POR HABERLO YA HECHO DESDE EL PRIMER SENSOR
movlw MensajesAlPC_SENSOR ;carga la primera posición del mensaje "SENSOR "
call RS232_Mensaje ;lo visualiza en el PC
movlw MensajesAlPC_Sensor6 ;carga la primera posición del mensaje "6: "
call RS232_Mensaje ;lo visualiza en el PC
; movlw MensajesAlPC_Sensor6 ;carga la primera posición del mensaje "SENSOR 6: "
; call RS232_Mensaje ;lo visualiza en el PC
;++++++++++++++++++++++++++++++++++++++++++++++++++++
;EL TABULADOR NO ACTÚA EN EL PROTEUS PERO LUEGO EN LA PRÁCTICA SÍ ACTÚA. ver ejemplo
"Termometro_4_LM35"
; movlw TabuladorH ;Un tabulador horizontal
; call RS232_EnviaDato
;------------------------------------------------
;PONER AQUÍ SALTO SI NO QUIERO ENVIAR AL PC
No_PC_5_1 ; éste es el segundo salto para no reflejar en PC
;-------------------------------------
movlw .11 ; Se coloca para visualización en la T5: T6:XXº
call LCD_PosicionLinea3 ; TERCERA línea.
btfss TempSigno_5,7 ; ¿Temperatura negativa?.
goto TemperaturaPositiva_5 ; No, la temperatura es positiva.
TemperaturaNegativa_5
;Si el el sensor Falla daria -0º y no puede ser. Por tanto para que salga en blanco:
movf TempSensor_5,F
btfsc STATUS,Z ;¿Es cero?, ¿Z=1? Si Z=1 "el Registro vale 0"
goto EliminarMenosCero_5 ;Si el valor es cero eliminar el menos -0º
;si es Z=0 el registro NO vale 0 por tanto escribir -
;Si el registro No vale Cero ponerle el signo -
movlw '-' ; Visualiza el signo "-" de temperatura negativa.
call LCD_Caracter
;---------------------------------------------------------------------------------------
;activar El "Flag_Es_Negativo" Para ver o no ver el signo 'º' por falta de espacio en LCD
bsf Flag_Es_Negativo,0
24
39. OYECTOSPROYECTOS TEMPERATURA OKCON DECI COMPLETOTermometro Con 16F876A _LCD20X4_Y_PCControl_I2C_8_Sensores_De_Tempera
;---------------------------------------------------------------------------------------
;_______________________________________________________________________
;PONER AQUÍ SALTO SI NO QUIERO ENVIAR AL PC
btfss PORTB,0 ;Compruebo si quiero PC o sólo LCD ;RB0=1 SÍ QUIERO PC
goto No_PC_5_2 ;
;-------------------------------------
;PARA LLEVARLO AL PC En negativo
movlw '-' ; Visualiza el signo "-" de temperatura negativa. en el PC
call RS232_EnviaDato
;---------------------------------------
;PONER AQUÍ SALTO SI NO QUIERO ENVIAR AL PC
No_PC_5_2 ; éste es el tercer salto para no reflejar en PC
;-------------------------------------
nop ;se puede quitar
TemperaturaPositiva_5
movf TempSensor_5,W ; Visualiza el valor absoluto de la temperatura,
call BIN_a_BCD ; pasándola previamente a BCD.
call Temperatura_En_LCD ;para ver la temperatura suprimiendo el cero no significativo ej
"089" saldrá "89"
;+++++++++++++AÑADIDO PARTE DECIMAL++++++++++++++++
movf DS1624_Decimal_5,F ;para ver si tiene el valor .0º en cuyo caso no visualizarlo
en la LCD por falta de espacio
btfsc STATUS,Z ;Si Z=1 es CERO LA PARTE DECIMAL .0º
goto Decimal_5_Es_Cero ;como es cero NO REPRESENTARLO y ponerle 'º'
;Si Z=0 NO ES CERO y por tanto visualizar el '.' y el 'º'
movlw '.' ; Visualiza el punto decimal.
call LCD_Caracter
movf DS1624_Decimal_5,W ;Visualiza la parte decimal
call LCD_Nibble ;Visualiza en el lugar actual de la pantalla el valor HEXADECIMAL
que almacena el nibble bajo del registro (W). El
;nibble alto en (W) no es tenido en cuenta ej: si (W) = 0101 0110 se
visualiza "6"
; si (W) es 1010 1110, se visualiza "E"
;------------lo he suprimido de la libreria Temperatura_a_LCD.INC-------------
btfsc Flag_TresCaracteres,0 ;Si tiene tres Caracteres la parte entera NO PONER 'º' por
razón de NO TENER espacio
goto Continua_5 ;
;Se representa el signo "º"
Decimal_5_Es_Cero
movlw MensajeGradoCentigrado ; En pantalla aparece "º".
call LCD_Mensaje
;++++++++++++++++++++++++++++++++++++++++++++++++++++
;PONER AQUÍ SALTO SI NO QUIERO ENVIAR AL PC
;ACTIVAR LAS SALIDAS comparando con los valores de la EEPROM programados
Continua_5
btfss PORTB,0 ;Compruebo si quiero PC o sólo LCD ;RB0=1 SÍ QUIERO PC
goto Histerisis_5 ;Se va a Activar o Desactivar la salida
;-------------------------------------
;--------------------------------------------------------------
movf DS1624_Decimal_5,W ;para poder ver el valor en decimal de cada sensor librería
"temperatura_a_PC.INC"
movwf DS1624_Decimal
;--------------------------------------------------------------
movf TempSensor_5,W ; Visualiza el valor absoluto de la temperatura,
25
40. OYECTOSPROYECTOS TEMPERATURA OKCON DECI COMPLETOTermometro Con 16F876A _LCD20X4_Y_PCControl_I2C_8_Sensores_De_Tempera
call Temperatura_En_PC ;Desde aquí se verán las centenas-decenas-unidades en el PC
; call RetornoCarro_Y_CambioLinea ; hace cambio de linea con retorno
;---------------------------------------------------------------------------------------
;+++++ACTIVA LA SALIDA CORRESPONDIENTE ENTRE LOS VALORES DE HISTERISIS ESTABLECIDOS++++++
;++++++ENTRE LA TempMin_5 y TempMax_5. Es decir sólo activa entre estos valores++++++++
;---------------------------------------------------------------------------------------
Histerisis_5
btfss TempSigno_5,7 ;Si el último bit es un "1" Es una temperatura Negativa.
goto EsPositivo_5
goto EsNegativo_5
EsPositivo_5
movf TempSensor_5,W ;Carga el Valor (+) de la Temperatura en (W)
goto Activar_Desactivar_Salidas_5 ;Se va a Activar o Desactivar la salida
EsNegativo_5
movf GlobalNegativa_5,W ;Carga el Valor (-) de la Temperatura en (W) se encuentra en
libreria "DS1624_Modificado_0.INC"
movwf TempSensor_5 ;y ya en VALOR NEGATIVO lo llevo a TempSensor_5
;goto Activar_Desactivar_Salidas ;Se va a Activar o
Desactivar la salida
Activar_Desactivar_Salidas_5
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;-----------------------------------------------------------------
;Si la Temperatura del Sensor (TempSensor_x)está por debajo de la TempMin_X estará activa la
Salida. Y se mantendrá activa hasta
;alcanzar la TempMax_X . Nota si partimos de una temperatura del sensor comprendida entre dichos
valores No estará activa la salida
;hasta quedar por debajo de la TempMini_X.
;(La otras instrucciones que tenía la salida estaría activa siempre que la temperatura del
sensor estuviese entre los valores
; de la TempMin y la TempMax)
;-----------------------------------------------------------------
movf TempMax_5,W
subwf TempSensor_5,W
btfsc STATUS,C ;¿C=0? TempSensor_5 < (TempMax_5)
bcf PORTC,5 ;Desactiva la salida 5 de PORTC por ser Mayor o igual la
TempMax_5 que la del TempSensor_5
movf TempMin_5,W
subwf TempSensor_5,W
btfss STATUS,C ;¿C=1? (TempMin_5) >= TempSensor_5
bsf PORTC,5 ;Activa la salida 5 de PORTC por ser Mayor la TempMin_5 que
la del Sensor_5
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;-----------------PARA VER EN LCD LA TEMPERATURA DEL Sensor_6---------------------
;-------------------ESTE COMIENZA EN LA LÍNEA 4 posición .3 -------------------------
VisualizaTermometro_LCD_6 ;EN PANTALLA LCD
;---------------------------------------
;PONER AQUÍ SALTO SI NO QUIERO ENVIAR AL PC
btfss PORTB,0 ;Compruebo si quiero PC o sólo LCD ;RB0=1 SÍ QUIERO PC
goto No_PC_6_1 ;
;-------------------------------------
;+++++++++++++++++++++++++++++++++++++++++++++++++++++
;SOBRA EL goto no_pc_2 de arriba
; 2º CORTE , NO HACE FALTA LLAMAR POR HABERLO YA HECHO DESDE EL PRIMER SENSOR
26
41. OYECTOSPROYECTOS TEMPERATURA OKCON DECI COMPLETOTermometro Con 16F876A _LCD20X4_Y_PCControl_I2C_8_Sensores_De_Tempera
movlw MensajesAlPC_SENSOR ;carga la primera posición del mensaje "SENSOR "
call RS232_Mensaje ;lo visualiza en el PC
movlw MensajesAlPC_Sensor7 ;carga la primera posición del mensaje "1: "
call RS232_Mensaje ;lo visualiza en el PC
;PONER AQUÍ SALTO SI NO QUIERO ENVIAR AL PC
No_PC_6_1 ; éste es el segundo salto para no reflejar en PC
;-------------------------------------
movlw .3 ; Se coloca para visualización en la T7:XXº T8:
call LCD_PosicionLinea4 ; CUARTA línea.
btfss TempSigno_6,7 ; ¿Temperatura negativa?.
goto TemperaturaPositiva_6 ; No, la temperatura es positiva.
TemperaturaNegativa_6
;Si el el sensor Falla daria -0º y no puede ser. Por tanto para que salga en blanco:
movf TempSensor_6,F
btfsc STATUS,Z ;¿Es cero?, ¿Z=1? Si Z=1 "el Registro vale 0"
goto EliminarMenosCero_6 ;Si el valor es cero eliminar el menos -0º
;si es Z=0 el registro NO vale 0 por tanto escribir -
;Si el registro No vale Cero ponerle el signo -
movlw '-' ; Visualiza el signo "-" de temperatura negativa.
call LCD_Caracter
;---------------------------------------------------------------------------------------
;activar El "Flag_Es_Negativo" Para ver o no ver el signo 'º' por falta de espacio en LCD
bsf Flag_Es_Negativo,0
;---------------------------------------------------------------------------------------
;PONER AQUÍ SALTO SI NO QUIERO ENVIAR AL PC
btfss PORTB,0 ;Compruebo si quiero PC o sólo LCD ;RB0=1 SÍ QUIERO PC
goto No_PC_6_2 ;
;-------------------------------------
;PARA LLEVARLO AL PC En negativo
movlw '-' ; Visualiza el signo "-" de temperatura negativa. en el PC
call RS232_EnviaDato
;---------------------------------------
;PONER AQUÍ SALTO SI NO QUIERO ENVIAR AL PC
No_PC_6_2 ; éste es el tercer salto para no reflejar en PC
nop ;se puede quitar
TemperaturaPositiva_6
movf TempSensor_6,W ; Visualiza el valor absoluto de la temperatura,
call BIN_a_BCD ; pasándola previamente a BCD.
call Temperatura_En_LCD ;para ver la temperatura suprimiendo el cero no significativo ej
"089" saldrá "89"
;+++++++++++++AÑADIDO PARTE DECIMAL++++++++++++++++
movf DS1624_Decimal_6,F ;para ver si tiene el valor .0º en cuyo caso no visualizarlo
en la LCD por falta de espacio
btfsc STATUS,Z ;Si Z=1 es CERO LA PARTE DECIMAL .0º
goto Decimal_6_Es_Cero ;como es cero NO REPRESENTARLO y ponerle 'º'
;Si Z=0 NO ES CERO y por tanto visualizar el '.' y el 'º'
movlw '.' ; Visualiza el punto decimal.
call LCD_Caracter
movf DS1624_Decimal_6,W ;Visualiza la parte decimal
call LCD_Nibble ;Visualiza en el lugar actual de la pantalla el valor HEXADECIMAL
27
42. OYECTOSPROYECTOS TEMPERATURA OKCON DECI COMPLETOTermometro Con 16F876A _LCD20X4_Y_PCControl_I2C_8_Sensores_De_Tempera
que almacena el nibble bajo del registro (W). El
;nibble alto en (W) no es tenido en cuenta ej: si (W) = 0101 0110 se
visualiza "6"
; si (W) es 1010 1110, se visualiza "E"
;------------lo he suprimido de la libreria Temperatura_a_LCD.INC-------------
btfsc Flag_TresCaracteres,0 ;Si tiene tres Caracteres la parte entera NO PONER 'º' por
razón de NO TENER espacio
goto Continua_6 ;
;Se representa el signo "º"
Decimal_6_Es_Cero
movlw MensajeGradoCentigrado ; En pantalla aparece "º".
call LCD_Mensaje
;++++++++++++++++++++++++++++++++++++++++++++++++++++
;PONER AQUÍ SALTO SI NO QUIERO ENVIAR AL PC
;ACTIVAR LAS SALIDAS comparando con los valores de la EEPROM programados
Continua_6
btfss PORTB,0 ;Compruebo si quiero PC o sólo LCD ;RB0=1 SÍ QUIERO PC
goto Histerisis_6 ;Se va a Activar o Desactivar la salida ;;;;;No_PC_4 ;
;-------------------------------------
;--------------------------------------------------------------
movf DS1624_Decimal_6,W ;para poder ver el valor en decimal de cada sensor librería
"temperatura_a_PC.INC"
movwf DS1624_Decimal
;--------------------------------------------------------------
movf TempSensor_6,W ; Visualiza el valor absoluto de la temperatura,
call Temperatura_En_PC ;Desde aquí se verán las centenas-decenas-unidades en el PC
; call RetornoCarro_Y_CambioLinea ; hace cambio de linea con retorno
;---------------------------------------------------------------------------------------
;+++++ACTIVA LA SALIDA CORRESPONDIENTE ENTRE LOS VALORES DE HISTERISIS ESTABLECIDOS++++++
;++++++ENTRE LA TempMin_6 y TempMax_6. Es decir sólo activa entre estos valores++++++++
;---------------------------------------------------------------------------------------
Histerisis_6
btfss TempSigno_6,7 ;Si el último bit es un "1" Es una temperatura Negativa.
goto EsPositivo_6
goto EsNegativo_6
EsPositivo_6
movf TempSensor_6,W ;Carga el Valor (+) de la Temperatura en (W)
goto Activar_Desactivar_Salidas_6 ;Se va a Activar o Desactivar la salida
EsNegativo_6
movf GlobalNegativa_6,W ;Carga el Valor (-) de la Temperatura en (W) se encuentra en
libreria "DS1624_Modificado_0.INC"
movwf TempSensor_6 ;y ya en VALOR NEGATIVO lo llevo a TempSensor_1
;goto Activar_Desactivar_Salidas ;Se va a Activar o
Desactivar la salida
Activar_Desactivar_Salidas_6
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;-----------------------------------------------------------------
;Si la Temperatura del Sensor (TempSensor_x)está por debajo de la TempMin_X estará activa la
Salida. Y se mantendrá activa hasta
;alcanzar la TempMax_X . Nota si partimos de una temperatura del sensor comprendida entre dichos
valores No estará activa la salida
;hasta quedar por debajo de la TempMini_X.
;(La otras instrucciones que tenía la salida estaría activa siempre que la temperatura del
sensor estuviese entre los valores
; de la TempMin y la TempMax)
;-----------------------------------------------------------------
movf TempMax_6,W
subwf TempSensor_6,W
btfsc STATUS,C ;¿C=0? TempSensor_6 < (TempMax_6)
28
43. OYECTOSPROYECTOS TEMPERATURA OKCON DECI COMPLETOTermometro Con 16F876A _LCD20X4_Y_PCControl_I2C_8_Sensores_De_Tempera
bcf PORTC,6 ;Desactiva la salida 6 de PORTC por ser Mayor o igual la
TempMax_6 que la del TempSensor_6
movf TempMin_6,W
subwf TempSensor_6,W
btfss STATUS,C ;¿C=1? (TempMin_6) >= TempSensor_6
bsf PORTC,6 ;Activa la salida 6 de PORTC por ser Mayor la TempMin_6 que
la del Sensor_6
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;-----------------PARA VER EN LCD LA TEMPERATURA DEL Sensor_7---------------------
;-------------------ESTE COMIENZA EN LA LÍNEA 4 posición .11 -------------------------
VisualizaTermometro_LCD_7 ;EN PANTALLA LCD
;---------------------------------------
;PONER AQUÍ SALTO SI NO QUIERO ENVIAR AL PC
btfss PORTB,0 ;Compruebo si quiero PC o sólo LCD ;RB0=1 SÍ QUIERO PC
goto No_PC_7_1 ;
;-------------------------------------
;+++++++++++++++++++++++++++++++++++++++++++++++++++++
;SOBRA EL goto no_pc_2 de arriba
; 2º CORTE , NO HACE FALTA LLAMAR POR HABERLO YA HECHO DESDE EL PRIMER SENSOR
movlw MensajesAlPC_SENSOR ;carga la primera posición del mensaje "SENSOR "
call RS232_Mensaje ;lo visualiza en el PC
movlw MensajesAlPC_Sensor8 ;carga la primera posición del mensaje "8: "
call RS232_Mensaje ;lo visualiza en el PC
;PONER AQUÍ SALTO SI NO QUIERO ENVIAR AL PC
No_PC_7_1 ; éste es el segundo salto para no reflejar en PC
;-------------------------------------
movlw .11 ; Se coloca para visualización en la T7: T8:XXº
call LCD_PosicionLinea4 ; TERCERA línea.
btfss TempSigno_7,7 ; ¿Temperatura negativa?.
goto TemperaturaPositiva_7 ; No, la temperatura es positiva.
TemperaturaNegativa_7
;Si el el sensor Falla daria -0º y no puede ser. Por tanto para que salga en blanco:
movf TempSensor_7,F
btfsc STATUS,Z ;¿Es cero?, ¿Z=1? Si Z=1 "el Registro vale 0"
goto EliminarMenosCero_7 ;Si el valor es cero eliminar el menos -0º
;si es Z=0 el registro NO vale 0 por tanto escribir -
;Si el registro No vale Cero ponerle el signo -
movlw '-' ; Visualiza el signo "-" de temperatura negativa.
call LCD_Caracter
;---------------------------------------------------------------------------------------
;activar El "Flag_Es_Negativo" Para ver o no ver el signo 'º' por falta de espacio en LCD
bsf Flag_Es_Negativo,0
;---------------------------------------------------------------------------------------
;_______________________________________________________________________
;PONER AQUÍ SALTO SI NO QUIERO ENVIAR AL PC
btfss PORTB,0 ;Compruebo si quiero PC o sólo LCD ;RB0=1 SÍ QUIERO PC
goto No_PC_7_2 ;
;-------------------------------------
29
44. OYECTOSPROYECTOS TEMPERATURA OKCON DECI COMPLETOTermometro Con 16F876A _LCD20X4_Y_PCControl_I2C_8_Sensores_De_Tempera
;PARA LLEVARLO AL PC En negativo
movlw '-' ; Visualiza el signo "-" de temperatura negativa. en el PC
call RS232_EnviaDato
;---------------------------------------
;PONER AQUÍ SALTO SI NO QUIERO ENVIAR AL PC
No_PC_7_2 ; éste es el tercer salto para no reflejar en PC
;-------------------------------------
nop ;se puede quitar
TemperaturaPositiva_7
movf TempSensor_7,W ; Visualiza el valor absoluto de la temperatura,
call BIN_a_BCD ; pasándola previamente a BCD.
call Temperatura_En_LCD ;para ver la temperatura suprimiendo el cero no significativo ej
"089" saldrá "89"
;+++++++++++++AÑADIDO PARTE DECIMAL++++++++++++++++
movf DS1624_Decimal_7,F ;para ver si tiene el valor .0º en cuyo caso no visualizarlo
en la LCD por falta de espacio
btfsc STATUS,Z ;Si Z=1 es CERO LA PARTE DECIMAL .0º
goto Decimal_7_Es_Cero ;como es cero NO REPRESENTARLO y ponerle 'º'
;Si Z=0 NO ES CERO y por tanto visualizar el '.' y el 'º'
movlw '.' ; Visualiza el punto decimal.
call LCD_Caracter
movf DS1624_Decimal_7,W ;Visualiza la parte decimal
call LCD_Nibble ;Visualiza en el lugar actual de la pantalla el valor HEXADECIMAL
que almacena el nibble bajo del registro (W). El
;nibble alto en (W) no es tenido en cuenta ej: si (W) = 0101 0110 se
visualiza "6"
; si (W) es 1010 1110, se visualiza "E"
;------------lo he suprimido de la libreria Temperatura_a_LCD.INC-------------
btfsc Flag_TresCaracteres,0 ;Si tiene tres Caracteres la parte entera NO PONER 'º' por
razón de NO TENER espacio
goto Continua_7 ;
;Se representa el signo "º"
Decimal_7_Es_Cero
movlw MensajeGradoCentigrado ; En pantalla aparece "º".
call LCD_Mensaje
;++++++++++++++++++++++++++++++++++++++++++++++++++++
;PONER AQUÍ SALTO SI NO QUIERO ENVIAR AL PC
;ACTIVAR LAS SALIDAS comparando con los valores de la EEPROM programados
Continua_7
btfss PORTB,0 ;Compruebo si quiero PC o sólo LCD ;RB0=1 SÍ QUIERO PC
goto Histerisis_7 ;Se va a Activar o Desactivar la salida
;--------SÍ QUIERO PC---------
;--------------------------------------------------------------
movf DS1624_Decimal_7,W ;para poder ver el valor en decimal de cada sensor librería
"temperatura_a_PC.INC"
movwf DS1624_Decimal
;--------------------------------------------------------------
movf TempSensor_7,W ; Visualiza el valor absoluto de la temperatura,
call Temperatura_En_PC ;Desde aquí se verán las centenas-decenas-unidades en el PC
; call RetornoCarro_Y_CambioLinea ; hace cambio de linea con retorno
;---------------------------------------------------------------------------------------
;+++++ACTIVA LA SALIDA CORRESPONDIENTE ENTRE LOS VALORES DE HISTERISIS ESTABLECIDOS++++++
30
45. OYECTOSPROYECTOS TEMPERATURA OKCON DECI COMPLETOTermometro Con 16F876A _LCD20X4_Y_PCControl_I2C_8_Sensores_De_Tempera
;++++++ENTRE LA TempMin_7 y TempMax_7. Es decir sólo activa entre estos valores++++++++
;---------------------------------------------------------------------------------------
Histerisis_7
btfss TempSigno_7,7 ;Si el último bit es un "1" Es una temperatura Negativa.
goto EsPositivo_7
goto EsNegativo_7
EsPositivo_7
movf TempSensor_7,W ;Carga el Valor (+) de la Temperatura en (W)
goto Activar_Desactivar_Salidas_7 ;Se va a Activar o Desactivar la salida
EsNegativo_7
movf GlobalNegativa_7,W ;Carga el Valor (-) de la Temperatura en (W) se encuentra en
libreria "DS1624_Modificado_0.INC"
movwf TempSensor_7 ;y ya en VALOR NEGATIVO lo llevo a TempSensor_1
;goto Activar_Desactivar_Salidas ;Se va a Activar o Desactivar la
salida
Activar_Desactivar_Salidas_7
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;-----------------------------------------------------------------
;Si la Temperatura del Sensor (TempSensor_x)está por debajo de la TempMin_X estará activa la
Salida. Y se mantendrá activa hasta
;alcanzar la TempMax_X . Nota si partimos de una temperatura del sensor comprendida entre dichos
valores No estará activa la salida
;hasta quedar por debajo de la TempMini_X.
;(La otras instrucciones que tenía la salida estaría activa siempre que la temperatura del
sensor estuviese entre los valores
; de la TempMin y la TempMax)
;-----------------------------------------------------------------
movf TempMax_7,W
subwf TempSensor_7,W
btfsc STATUS,C ;¿C=0? TempSensor_7 < (TempMax_7)
bcf PORTC,7 ;Desactiva la salida 7 de PORTC por ser Mayor o igual la
TempMax_7 que la del TempSensor_7
movf TempMin_7,W
subwf TempSensor_7,W
btfss STATUS,C ;¿C=1? (TempMin_7) >= TempSensor_7
bsf PORTC,7 ;Activa la salida 7 de PORTC por ser Mayor la TempMin_7 que
la del Sensor_7
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;-----------------------------------------------------------------------------------------------
call Tiempo_De_Muestreo_LCD_1; Esta en "TIEMPO_DE_MUESTREO.INC" por COMPARACION determina
;Si he elegido la opcion 1 ,2 ó 3 ; 10sg, 20 sg ó 1 Min
;Es valido aunque se vaya la LUZ por estar en EEPROM
;-----------------------------------------------------------------------------------------------
goto Sensor_0; ;;;;***VisualizaTermometro_LCD_0 ;***Para salir y continuar con
las siguientes instrucciones Sería AL VisualizaTermometro_LCD_2 Pero como no he puesto más
vuelvo al inicial
;PONER AQUÍ SALTO SI NO QUIERO ENVIAR AL PC
No_PC_4 ; éste es el tercer salto para no reflejar en PC
;---------------------------------
;ESTE SERÁ EL VALOR POR DEFECTO EN CASO DE NO CONFIGURAR EN EL PC.
;si no se pone al reflejar el último sensor directamente se iria a Inicio y no se vería En la LCD
;por ello poner un retraso Standar de por ej 10 sg
;;;; call Retardo_10s ;PARA REFLEJAR DURANTE 10sg los 4 últimos sensores
;-----------------------------------------------------------------------------------------------
call Tiempo_De_Muestreo_LCD_1; Está en "TIEMPO_DE_MUESTREO.INC" por COMPARACION determina
;Si he elegido la opcion 1 ,2 ó 3 ; 10sg, 20 sg ó 1 Min
;Es valido aunque se vaya la LUZ por estar en EEPROM
;-----------------------------------------------------------------------------------------------
31