# Problema al compilar ASM, Errores



## kal00 (May 13, 2010)

Buen día amigos, tengo un problema que espero me puedan ayudar. Antes que nada es bueno decirles que no sé nada de microcontroladores.

Necesitaba un control de temperatura sencillo y funcional, encontré el de Pablin y me sentí satisfecho:

Termostato Electrónico con PIC y LCD

Leí varios temas del foro y a muchos ya les funcina, así que lo probé en PROTEUS con el HEX que viene en la página y funciono perfectamente, así que me decidí a comprar el PIC y a armar el circuito. El problema fue cuando quise meter el HEX directamente al PIC ya que el programador me decía que faltaban los Bits de Configuración asi que me puse a investigar y descubrí como ponerlos en MPLAB.

El punto es que cuando quiero compilar el programa, me manda dos errores que no sé que significan y como arreglarlos, se los dejo aquí.

Código en ASM:


```
; Control de temperatura con LM35 y pantalla de LCD
; Una salida se activa ante una temp. baja y se desactiva ante una alta ambas seteables
; Guarda los parámetros en la EEPROM
; Micro: PIC16F870 a 4MHz XT

LIST P=P16F870

#include <P16F870.INC>

__CONFIG      _CP_OFF & _WRT_ENABLE_ON & _XT_OSC & _CPD_OFF & _WDT_OFF & _PWRTE_OFF & _BODEN_OFF & _LVP_OFF



pcl	equ	0x02		;Contador de programa (Parte baja)
estado	equ	0x03		;Registro de estados
ptoa	equ	0x05		;Puertos de E/S
ptob	equ	0x06
ptoc	equ	0x07
intcon	equ	0x0B		;Controlador de interrupciones
eedata	equ	0x0C		;Registro de datos de la EEPROM
eeaddr	equ	0x0D		;Registro de direccion de la EEPROM
adres	equ	0x1E		;Resultado de la conversión A/D (HIGH / LOW)
adcon	equ	0x1F		;Configuración del conversor A/D
uni	equ	0x20		;Usados para manejar los datos a mostrar en display
dec	equ	0x21
cen	equ	0x22
tiempo1	equ	0x23		;Usados para temporizar
tiempo2	equ	0x24
letra	equ	0x25		;Usado para apuntar la letra a colocar en el LCD
menor	equ	0x26		;Temperatura de activación
mayor	equ	0x27		;Temperatura de desactivación
buffer	equ	0x28		;Usado como registro temporal

#define	CARRY	estado, 0	;Bit de acarreo
#define	CERO	estado, 2	;Flag indicador de resultado cero
#define	RP0	estado, 5	;Bit 0 selector de página de memoria
#define	RP1	estado, 6	;Bit 1 selector de página de memoria
#define	ADGO	adcon, 2	;Bit que inicia la conversión (1) / Indica finalización (0)
#define	EEREAD	eedata, 0	;Bit que inicia la lectura de la EEPROM
#define	EEWRITE	eedata, 1	;Bit que inicia la escritura de la EEPROM - Indica finalización
#define	EEWREN	eedata, 2	;Bit que habilita la escritura en la EEPROM
#define	EEAREA	eedata, 7	;Bit que selecciona el área de EEPROM a utilizar (0=AREA DE DATOS)
#define	MINS	ptoa, 1		;Sube el punto mínimo
#define	MINB	ptoa, 2		;Baja el punto mínimo
#define	MAXS	ptoa, 3		;Sube el punto máximo
#define	MAXB	ptoa, 4		;Baja el punto máximo
#define	BUZZER	ptoc, 3		;Salida al aviso acústico
#define	RELE	ptoc, 4		;Relé que maneja la carga (calefactor / enfriador)
#define	LCDE	ptoc, 6		;Habilitación del LCD
#define	LCDRS	ptoc, 7		;Selección de modo del LCD

	bsf	RP0		;Pasa a página 1
	bcf	RP1
	movlw	b'00011111'	;Configura puerto A
	movwf	ptoa
	clrf	ptob		;Puerto B completo como salidas (bus del LCD)
	clrf	ptoc		;Puerto B completo como salidas
	movlw	b'10001110'	;Configura los pines del Puerto A
	movwf	adcon		;AN0 como única entrada análoga
	bsf	RP1		;Pasa a página 3
	bcf	EEAREA		;Selecciona el banco de EEPROM de datos
	bcf	RP1		;Pasa a página 0
	bcf	RP0
	movlw	b'01000001'	;Enciende y configura el convertidor A/D - Selecciona AN0 como entrada
	movwf	adcon
	
	clrf	ptoa		;Apaga todo
	clrf	ptob
	clrf	ptoc
	
	bsf	RP1		;Pasa a la página 2 de memoria
	clrf	eeaddr		;Direcciona la primera posición de la EEPROM
	bsf	RP0		;Pasa a la página 3 de memoria
	bsf	EEREAD		;Inicia la lectura de la EEPROM
	bcf	RP0		;Vuelve a la página 3 de memoria
	movf	eedata, 0	;Dato Leído de la EEPROM -> W
	movwf	menor		;Guarda el dato leído de la EEPROM en MENOR (punto de activación del relé)
	incf	eeaddr		;Direcciona a la segunda posición de la EEPROM
	bsf	RP0		;Pasa a la página 3 de memoria
	bsf	EEREAD		;Inicia la lectura de la EEPROM
	bcf	RP0		;Vuelve a la página 3 de memoria
	movf	eedata, 0	;Dato Leído de la EEPROM -> W
	movwf	mayor		;Guarda el dato leído de la EEPROM en MAYOR (punto de desactivación del relé)
	bcf	RP1		;Pasa a la página 0 de memoria

	movlw	b'00111000'	;Comunicación con el LCD a ocho bits - Dos líneas de texto
	call	CONTROL
	movlw	d'2'
	call	DEMORA		;Demora 2ms
	movlw	b'00000110'	;Mensaje estático, se desplaza el cursor hacia la derecha
	call	CONTROL
	movlw	d'2'
	call	DEMORA		;Demora 2ms
	movlw	b'00001100'	;Enciende el display - Oculta el cursor - Caracter fijo
	call	CONTROL
	movlw	d'2'
	call	DEMORA		;Demora 2ms
	movlw	b'00000001'	;Limpia la pantalla y pone cursor en posición inicial
	call	CONTROL
	movlw	d'2'
	call	DEMORA		;Demora 2ms

	clrf	letra		;Coloca el título en el LCD
OTRA	movf	letra, 0	;Letra actual -> W
	call	LINEA1		;Obtiene el caracter a colocar desde la tabla
	call	DATO		;Envía el caracter al LCD
	incf	letra, 1

	movf	letra, 0	;Comprueba si ya envió los 16 caracteres del título
	sublw	d'16'
	btfss	CERO
	goto	OTRA		;Si no llego a la letra 16 sigue enviando

	movlw	0xC0		;Posiciona el cursor en la 2da. linea
	call	CONTROL
	movlw	d'1'
	call	DEMORA		;Demora 1ms

	clrf	letra		;Coloca el título en el LCD
OTRA2	movf	letra, 0	;Letra actual -> W
	call	LINEA2		;Obtiene el caracter a colocar desde la tabla
	call	DATO		;Envía el caracter al LCD
	incf	letra, 1

	movf	letra, 0	;Comprueba si ya envió los 16 caracteres del título
	sublw	d'16'
	btfss	CERO
	goto	OTRA2		;Si no llego a la letra 16 sigue enviando

	call	VERINF		;Coloca en el LCD la temp. inferior (de activación)
	call	VERSUP		;Coloca en el LCD la temp. superior (de desactivación)

CICLO	bsf	ADGO		;Inicia la conversión A/D
	btfsc	ADGO		;Espera que termine de convertir
	goto	$ -1
	
	bsf	RP0		;Pasa a página 1 (para acceder a los ocho bits bajos del resultado)
	movf	adres, 0	;Resultado de conversión -> W
	bcf	RP0		;Pasa a página 1

	movwf	buffer		;Guarda el dato obtenido de ADRESL en el buffer temporal
	bcf	CARRY		;Limpia el CARRY
	btfsc	adres, 0	;Mira el bit menos significativo de ADRESH (Bit 8)
	bsf	CARRY		;Si está en 1 pone en uno el carry
	rrf	buffer, 1	;Hace desaparecer el bit 0 de ADRESL, mete el bit 0 de ADRESH por el 7 de ADRESL

	movf	menor, 0	;Punto de activación -> W
	addlw	d'1'		;Suma 1 a W
	subwf	buffer, 0	;W = Temp. Actual - (Menor + 1)
	btfss	CARRY		;Si dio negativo es porque la temp. medida es igual o menor al punto de activación
	bsf	RELE		;Si dio negativo (si carry = 0) acciona el relé
	
	movf	mayor, 0	;Punto de desactivación -> W
	subwf	buffer, 0	;W = Temp. Actual - (Mayor)
	btfsc	CARRY		;Si dio negativo es porque aún no alcanzó la temp. de desactivación
	bcf	RELE		;Si dio positivo (si carry = 1) desactiva el relé

	movf	buffer, 0	;Dato digitalizado -> W
	call	DECIMAL		;Obtiene UNI, DEC y CEN con el agregado de 30h para la tabla ASCII
	
	movlw	0x8D		;Coloca el cursor en la posición 0Dh de la pantalla.
	call	CONTROL

	movf	cen, 0		;Coloca en el LCD las centenas
	call	DATO
	movf	dec, 0		;Coloca las decenas
	call	DATO
	movf	uni, 0		;Coloca las unidades
	call	DATO

	btfss	MINS		;Mira el pulsador de incremento en temp. de activación
	call	SUBEMIN
	btfss	MINB		;Mira el pulsador de decremento en temp. de activación
	call	BAJAMIN
	btfss	MAXS		;Mira el pulsador de incremento en temp. de desactivación
	call	SUBEMAX
	btfss	MAXB		;Mira el pulsador de decremento en temp. de desactivación
	call	BAJAMAX
	
	goto	CICLO		;Vuelve a medir y mostrar

LINEA1	addwf	pcl, 1		;Suma el contenido de W al contador de programa (para explorar la tabla)
	retlw	"T"
	retlw	"E"
	retlw	"M"
	retlw	"P"
	retlw	"E"
	retlw	"R"
	retlw	"A"
	retlw	"T"
	retlw	"U"
	retlw	"R"
	retlw	"A"
	retlw	":"
	retlw	" "
	retlw	" "
	retlw	" "
	retlw	" "

LINEA2	addwf	pcl, 1		;Suma el contenido de W al contador de programa (para explorar la tabla)
	retlw	" "
	retlw	" "
	retlw	" "
	retlw	" "
	retlw	" "
	retlw	" "
	retlw	b'01111111'	;Flecha izquierda
	retlw	"-"
	retlw	"-"
	retlw	b'01111110'	;Flecha derecha
	retlw	" "
	retlw	" "
	retlw	" "
	retlw	" "
	retlw	" "
	retlw	" "

SUBEMIN	incf	menor, 1	;Suma 1 a la temp. de activación
	call	VERINF		;Actualiza la información en el LCD
	btfss	MINS		;Espera que suelte el pulsador
	goto	$ -1
	goto	SAVEMIN		;Una vez que suelta la tecla va a guardar el parámetro
	
BAJAMIN	decf	menor, 1	;Resta 1 a la temp. de activación
	call	VERINF		;Actualiza la información en el LCD
	btfss	MINB		;Espera que suelte el pulsador
	goto	$ -1
	
SAVEMIN	bsf	RP1		;Pasa a página 2
	clrf	eeaddr		;Direcciona el primer byte de la EEPROM
	movf	menor, 0
	movwf	eedata		;Temp. Activación -> EEPROM
	call	EESAVE		;Ejecuta la rutina de grabación
	bcf	RP1		;Pasa a página 0
	goto	TIC		;Va a hacer el TIC de teclado

SUBEMAX	incf	mayor, 1	;Suma 1 a la temp. de desactivación
	call	VERSUP		;Actualiza la información en el LCD
	btfss	MAXS		;Espera que suelte el pulsador
	goto	$ -1
	goto	SAVEMAX		;Una vez que suelta la tecla va a guardar el parámetro
	
BAJAMAX	decf	mayor, 1	;Resta 1 a la temp. de desactivación
	call	VERSUP		;Actualiza la información en el LCD
	btfss	MAXB		;Espera que suelte el pulsador
	goto	$ -1
	
SAVEMAX	bsf	RP1		;Pasa a página 2
	movlw	d'1'
	movwf	eeaddr		;Direcciona el 2do. byte de la EEPROM
	movf	mayor, 0
	movwf	eedata		;Temp. Activación -> EEPROM
	call	EESAVE		;Ejecuta la rutina de grabación
	bcf	RP1		;Pasa a página 0
	goto	TIC		;Va a hacer el TIC de teclado
	
EESAVE	bsf	RP0		;Pasa a página 3
	bsf	EEWREN		;Habilita la escritura en la EEPROM
	movlw	0x55		;Secuencia de seguridad
	movwf	eeaddr
	movlw	0xAA
	movwf	eeaddr
	bsf	EEWRITE		;Inicia la grabación
	bcf	EEWREN		;Deshabilita la escritura
	btfsc	EEWRITE		;Espera que termine de grabar
	goto	$ -1
	bcf	RP0		;Pasa a página 2
	return

TIC	bsf	BUZZER		;Acciona el buzzer
	movlw	d'100'
	call	DEMORA		;Deja sonar el buzzer durante 100ms
	bcf	BUZZER
	return
	
CONTROL	bcf	LCDRS		;Pone en bajo la línea de modo del LCD (Control)
	goto	ENVIAR		;Se saltea la sig. línea
DATO	bsf	LCDRS		;Pone en alto la línea de modo del LCD (Dato)
ENVIAR	movwf	ptob		;Coloca el dato o control a enviar en el bus del LCD
	movlw	d'1'
	call	DEMORA		;Demora 1ms
	bsf	LCDE		;Habilita el LCD
	movlw	d'1'
	call	DEMORA		;Demora 1ms
	bcf	LCDE		;Deshabilita el LCD
	movlw	d'1'
	call	DEMORA		;Demora 1ms
	return

DECIMAL	movwf	uni		;Convierte el dato presente en W en UNI, DEC y CEN
	clrf	dec
	clrf	cen
	movlw	d'100'		;Determina la cant. de centenas
CENTENA	subwf	uni, 1
	btfss	CARRY
	goto	CIEN
	incf	cen, 1
	goto	CENTENA
CIEN	addwf	uni, 1
	movlw	d'10'		;Determina la cant. de decenas
DECENA	subwf	uni, 1
	btfss	CARRY
	goto	DIEZ
	incf	dec, 1
	goto	DECENA
DIEZ	addwf	uni, 1		;Uni queda con la cant. de unidades (sin decenas ni centenas)

	movlw	0x30		;Le suma 30h a los valores de UNI, DEC y CEN para que queden en ASCII
	addwf	uni, 1
	addwf	dec, 1
	addwf	cen, 1
	return
	
DEMORA	movwf	tiempo2		;Demora tantos milisegundos como valor en w
TOP2	movlw	d'110'
	movwf	tiempo1
TOP1	nop
	nop
	nop
	nop
	nop
	nop
	decfsz	tiempo1, 1
	goto	TOP1
	decfsz	tiempo2, 1
	goto	TOP2
	return

VERINF	movf	menor, 0	;Temperatura de activación -> W
	call	DECIMAL		;Obtiene UNI, DEC y CEN en formato ASCII
	movlw	0xC2		;Posiciona el cursor en el tercer caracter de la 2da. línea
	call	CONTROL		;para escribir el punto de activación
	movlw	d'1'
	call	DEMORA		;Demora 1ms
	movf	cen, 0		;Coloca en el LCD las centenas
	call	DATO
	movf	dec, 0		;Coloca las decenas
	call	DATO
	movf	uni, 0		;Coloca las unidades
	call	DATO
	return

VERSUP	movf	mayor, 0	;Temperatura de desactivación -> W
	call	DECIMAL		;Obtiene UNI, DEC y CEN en formato ASCII
	movlw	0xCB		;Posiciona el cursor en el caracter 12 de la 2da. línea
	call	CONTROL		;para escribir el punto de desactivación
	movlw	d'1'
	call	DEMORA		;Demora 1ms
	movf	cen, 0		;Coloca en el LCD las centenas
	call	DATO
	movf	dec, 0		;Coloca las decenas
	call	DATO
	movf	uni, 0		;Coloca las unidades
	call	DATO
	return
	
	org	0x2100		;Guarda los parámetros por default en la EEPROM
	data	0x28		;Punto de activación: 40 grados
	data	0x32		;Punto de desactivación: 50 grados

	end
```


Y estos son los errores:


```
Make: The target "C:\Documents and Settings\Administrador\Mis documentos\fuente.o" is out of date.
Executing: "C:\Archivos de programa\Microchip\MPASM Suite\MPASMWIN.exe" /q /p16F870 "fuente.asm" /l"fuente.lst" /e"fuente.err" /d__DEBUG=1
Warning[205] C:\DOCUMENTS AND SETTINGS\ADMINISTRADOR\MIS DOCUMENTOS\FUENTE.ASM 6 : Found directive in column 1. (LIST)
Warning[215] C:\DOCUMENTS AND SETTINGS\ADMINISTRADOR\MIS DOCUMENTOS\FUENTE.ASM 6 : Processor superseded by command line.  Verify processor symbol.
Warning[205] C:\DOCUMENTS AND SETTINGS\ADMINISTRADOR\MIS DOCUMENTOS\FUENTE.ASM 10 : Found directive in column 1. (__CONFIG)
Error[115]   C:\DOCUMENTS AND SETTINGS\ADMINISTRADOR\MIS DOCUMENTOS\FUENTE.ASM 36 : Duplicate label ("RP0" or redefining symbol that cannot be redefined)
Error[115]   C:\DOCUMENTS AND SETTINGS\ADMINISTRADOR\MIS DOCUMENTOS\FUENTE.ASM 37 : Duplicate label ("RP1" or redefining symbol that cannot be redefined)
Message[305] C:\DOCUMENTS AND SETTINGS\ADMINISTRADOR\MIS DOCUMENTOS\FUENTE.ASM 78 : Using default destination of 1 (file).
Halting build on first failure as requested.
```

Que está pasando? Espero me puedan ayudar ya que es un proyecto que tengo que entregar para mañana y sólo me falta que funcione correctamente el PIC 

Gracias a todos!


----------



## Eduardo (May 13, 2010)

> Que está pasando? Espero me puedan ayudar ya que es un proyecto que tengo que entregar para mañana y sólo me falta que funcione correctamente el PIC


 Que está pasando? Que no leés los mensajes de error 

_Error[115]   C:\DOCUMENTS AND SETTINGS\ADMINISTRADOR\MIS DOCUMENTOS\FUENTE.ASM 36 : *Duplicate label ("RP0" or redefining symbol that cannot be redefined)*
Error[115]   C:\DOCUMENTS AND SETTINGS\ADMINISTRADOR\MIS DOCUMENTOS\FUENTE.ASM 37 : *Duplicate label ("RP1" or redefining symbol that cannot be redefined)
*_

RP0 y RP1 ya está definidas con equates en P16F870.INC

Usá otros nombres para el macro y encontrarás la paz.


----------



## kal00 (May 13, 2010)

Hola* Eduardo* gracias por responder. Como ya lo había dicho, no sé nada de microcontroladores, perdona mi ignorancia con respecto a los errores. ¿Cómo cambio los nombres para el macro?

De antemano gracias por tu tiempo.


----------



## Eduardo (May 13, 2010)

> ¿Cómo cambio los nombres para el macro?


 Pos con el teclado 

Los macros RP0 y RP1 se definen en las líneas 36 y 37

```
#define    RP0    estado, 5    ;Bit 0 selector de página de memoria
#define    RP1    estado, 6    ;Bit 1 selector de página de memoria
```
Con otros nombres como RP0b y RP1b

```
#define    RP0b    estado, 5    ;Bit 0 selector de página de memoria
#define    RP1b    estado, 6    ;Bit 1 selector de página de memoria
```
y reemplazando los nombres en el resto del programa ya está.
Para que sea más fácil encontrar las líneas directamente lo compilás y el mensaje de error te va diciendo en que línea está.


Otra forma más corta es editar el archivo P16F870.INC y borrarle las dos líneas donde define RP0 y RP1


```
;----- STATUS Bits --------------------------------------------------------

IRP                          EQU     H'0007'
[B]RP1                          EQU     H'0006'
RP0                          EQU     H'0005'[/B]
NOT_TO                       EQU     H'0004'
NOT_PD                       EQU     H'0003'
Z                            EQU     H'0002'
DC                           EQU     H'0001'
C                            EQU     H'0000'
```
Pero como *no es aconsejable* andar modificando esos archivos, hacelo sobre una copia en el directorio de trabajo.
Vas a tener que declarar en la línea 8 de tu programa#include "P16F870.INC"​para que te lo lea ahí.


----------



## tecnogirl (May 14, 2010)

Hola Kal00: Prueba algo simple, inicia las lineas:

#define RP0 estado, 5 ;Bit 0 selector de página de memoria
#define RP1 estado, 6 ;Bit 1 selector de página de memoria

del programa con el caracter ";" para convertirlas en comentario y que no las tome en cuenta el compilador. Quedarian asi:

;#define RP0 estado, 5 ;Bit 0 selector de página de memoria
;#define RP1 estado, 6 ;Bit 1 selector de página de memoria

Como te explico Eduardo, RP0 y RP1 ya estan predefinidas en el archivo P16F870.INC
Constatalo tu mismo que es asi, y por eso no pueden volver a ser declaradas en el programa fuente (que es lo que esta ocurriendo). Una vez hecho el ajuste, compila el programa y dichos errores deben desaparecer.
Saludos


----------



## Eduardo (May 14, 2010)

tecnogirl dijo:


> ... RP0 y RP1 ya estan predefinidas en el archivo P16F870.INC


Pero los nombres están definidos de manera diferente. 
En el include son solamente el bit correspondiente a RPx (5 y 6), mientras que en el programa define un macro con la direccion y el bit ( 3,5 y 3,6 ).
Igual tiene que reemplazar líneas en su código.

Ej.  *bsf RP0* por *bsf estado,RP0*


----------



## kal00 (May 24, 2010)

Gracias a los dos por su tiempo y sus explicaciones. Como dijo *Eduardo*, solo era cuestión de cambiar el nombre de *RPx* por _*RPxb*_, ya compilo perfectamente. 

Gracias!!


----------



## elneroo (Jul 1, 2010)

Problema al compilar ASM, Errores
bueno este programacion me la mandaron pero me salen errores alguien me podria ayudar porfavor


```
ZONA DE DATOS **********************************************************************

	LIST		P=16F84A
	INCLUDE		<P16F84A.INC>
	__CONFIG	_CP_OFF &  _WDT_OFF & _PWRTE_ON & _XT_OSC

	CBLOCK	0x0C
	TemperaturaDeseada
	Registro50ms							; Guarda los incrementos cada 50 ms.
	FlagsModos								; Guarda los flags para establecer los
	ENDC									; modos de trabajo.

	ORG	0x2100								; Corresponde a la dirección 0 de la zona
											; EEPROM de datos. Aquí se va a guardar el
	DE	.24									; la temperatura deseada. En principio 24 ºC.

#DEFINE  SalidaTermostato 		PORTB,1		; Carga controlada por el termostato.
#DEFINE  Zumbador	 			PORTB,2		; Aquí se conecta el zumbador.
#DEFINE  ModoPulsador			PORTB,7		; Los pulsadores se conectan a estos
#DEFINE  IncrementarPulsador	PORTB,6		; pines del puerto B.
#DEFINE  F_Termostato_ON		FlagsModos,2	; Flags utilizados en el ajuste de la
#DEFINE  F_Termostato_Ajuste	FlagsModos,1	; temperatura del termostato.
#DEFINE  F_Termostato_OFF		FlagsModos,0

TMR0_Carga50ms	EQU	d'256'-d'195'			; Para conseguir interrupción cada 50 ms.
CARGA_2s		EQU	d'40'					; Leerá cada 2s = 40 x 50ms = 2000ms.	

; ZONA DE CÓDIGOS ********************************************************************

	ORG 	0
	goto	Inicio
	ORG	4
	goto	ServicioInterrupcion

Mensajes
	addwf	PCL,F
MensajePublicitario
	DT "calito", 0x00
MensajeTermostato_ON
	DT "Termostato: ", 0x00
MensajeTermostato_Ajuste
	DT "Temper. deseada", 0x00
MensajeGradoCentigrado
	DT "ºC  ", 0x00					; En pantalla LCD: "ºC  "

Inicio	
	call	LCD_Inicializa
	bsf		STATUS,RP0
	movlw	b'10000111'				; Prescaler de 256 para el TMR0.
	movwf	OPTION_REG
	bsf		ModoPulsador			; Se configuran como entrada.
	bsf		IncrementarPulsador
	bcf		SalidaTermostato		; Se configuran como salida.
	bcf		Zumbador
	bcf		STATUS,RP0
	call	LCD_Linea1				; Se sitúa al principio de la primera línea.
	movlw	MensajePublicitario
	call	LCD_Mensaje
	call	TEMPER.   LM35_Inicializa		; Comienza la conversión del termómetro y pone
	call	ModoTermostato_OFF		; este modo de funcionamiento.
	movlw	TMR0_Carga50ms			; Carga el TMR0 en complemento a 2.
	movwf	TMR0
	movlw	CARGA_2s					; Y el registro cuyo decremento contará los 2 s.
	movwf	Registro50ms
	clrw							; Lee la posición 0x00 de memoria EEPROM de datos
	call	EEPROM_LeeDato			; donde se guarda la temperatura deseada de la última
	movwf	TemperaturaDeseada		; vez que se ajustó.
	movlw	b'10101000'				; Activa interrupción del TMR0 (T0IE), por cambio de
	movwf	INTCON					; líneas del Puerto B (RBIE) y la general (GIE)
;
; La sección "Principal" es mantenimiento. Sólo espera las interrupciones.
; No se puede poner en modo de bajo consumo porque la instrucción "sleep" detiene el Timer 0.

Principal
	goto	Principal

; Subrutina "ServicioInterrupcion" ------------------------------------------------------
;
; Detecta qué ha producido la interrupción y ejecuta la subrutina de atención correspondiente.

ServicioInterrupcion
	btfsc	INTCON,T0IF				; Si es una interrupción producida por el Timer 0
	call	Termometro				; lee el termómetro y actualiza termostato.
	btfss	INTCON,RBIF				; Si es una interrupción RBI lee los pulsadores.
	goto	FinInterrupcion
	btfss	ModoPulsador			; ¿Está presionado el pulsador de "AJUSTE"?
	call	CambiarModo				; Sí. Ajusta la temperatura deseada en el termostato.
	btfss	IncrementarPulsador		; ¿Pulsado "INCREMENTAR"?
	call	IncrementarTempDeseada	; Sí, pasa a incrementar la temperatura deseada.
FinInterrupcion
	bcf		INTCON,RBIF				; Limpia los flags de reconocimiento.
	bcf		INTCON,T0IF
	retfie

; Subrutina "Termometro" ----------------------------------------------------------------
;
; Esta subrutina lee y visualiza el termómetro cada 2 segundos aproximadamente. Se ejecuta
; debido a la petición de interrupción del Timer 0, cada 50 ms. Para conseguir una
; temporización de 2 s, habrá que repetir 40 veces el lazo de 50 ms (40x50ms=2000ms=2s).
;
; También actúa sobre la salida del termostato posicionándola adecuadamente.

Termometro
	movlw	TMR0_Carga50ms
	movwf	TMR0					; Recarga el TMR0.
	decfsz	Registro50ms,F			; Decrementa el contador.
	goto	FinInterrupcion			; No han pasado 2 segundos, por tanto sale.
	movlw	CARGA_2s				; Repone este contador nuevamente.
	movwf	Registro50ms
	call	TEMPER.   LM35_LeeTemperatura	; Lee la temperatura.
	call	TEMPER.   LM35_Inicializa		; Comienza conversión para la siguiente lectura.
	call	Termostato				; Actúa sobre el termostato.
;	call	Visualiza				; Como esta subrutina se escribe a continuación
;	return							; se ahorra estas dos instrucciones y ahorra 
									; también espacio en la pila.
; Subrutina "Visualiza" -----------------------------------------------------------------
;
; Visualiza el termómetro en tres formatos posibles:
; A)	Con el termostato desactivado, modo "Termostato_OFF". Por ejemplo:
; 				"calito" (Primera línea)
;				"       24.5ºC   " (Segunda línea).
;		Donde en la primera línea se visualiza un mensaje publicitario y en la
;		segunda línea la temperatura medida actual.
; B)	Ajuste del termostato, modo "Termostato_Ajuste". Por ejemplo:
;	 			"Temper. deseada" (Primera línea)
;				"        25ºC     " (Segunda línea).
; 		Donde en la segunda línea visualiza la temperatura que se desea ajustar.
; C)	Con el termostato activado, modo "Termostato_ON". Por ejemplo:
; 				"Termostato: 25ºC" (Primera línea)
;				"      23.5ºC    " (Segunda línea).
; 		Donde en la primera línea se visualiza la temperatura que se desea
;		ajustar y en la segunda línea la temperatura medida actual.
Visualiza
	btfsc	F_Termostato_OFF
	goto	VisualizaTermometro
	btfsc	F_Termostato_Ajuste
	goto	VisualizaTermostato_Ajuste
	btfsc	F_Termostato_ON
	goto	VisualizaTermostato_ON
	return

; "VisualizaTermostato_ON" --------------------------------------------------------------
;
; Visualiza el valor de la temperatura deseada en la primera línea y el valor de la
; temperatura medida en la segunda línea.
; 
VisualizaTermostato_ON
	call	LCD_Linea1
	movlw	MensajeTermostato_ON
	call	LCD_Mensaje
	call	VisualizaTemperaturaDeseada
	call	VisualizaTemperaturaMedida
	return

; "VisualizaTermostatoAjuste" y "VisualizaTemperaturaDeseada" ---------------------------
;
; Visualiza en la pantalla el formato propio de este modo.
; 
; Entradas:	(TemperaturaDeseada) temperatura ajustada en la subrutina Incrementar.

VisualizaTermostato_Ajuste
	call	LCD_Linea1					; Se sitúa al principio de la primera línea.
	movlw	MensajeTermostato_Ajuste	; Visualiza mensaje en la primera línea.
	call	LCD_Mensaje
	movlw	.6							; Se coloca para centrar visualización en la 
	call	LCD_PosicionLinea2			; segunda línea.
VisualizaTemperaturaDeseada
	movf	TemperaturaDeseada,W
	call	BIN_a_BCD					; La pasa a BCD.
	call	LCD_Byte					; Visualiza, apagando los ceros no significativos.
	movlw	MensajeGradoCentigrado		; En pantalla aparece "ºC  ".
	call	LCD_Mensaje
	return

; "VisualizaTermometro" y ""VisualizaTemperaturaMedida" ---------------------------------
;
; En la primera línea se visualiza un mensaje publicitario y en la segunda línea la
; temperatura medida
;
; Entradas:
;	  -	(DS18B20_Temperatura), temperatura medida en valor absoluto.
;     -	(DS18B20_TemperaturaDecimal), parte decimal de la temperatura medida.
;     -	(DS18B20_Signo), registro con el signo de la temperatura. Si es igual a
;		b'00000000' la temperatura es positiva. Si es b'11111111' resulta que
;		la temperatura es negativa.
;
VisualizaTermometro
	call	LCD_Linea1				; Se sitúa al principio de la primera línea.
	movlw	MensajePublicitario
	call	LCD_Mensaje
VisualizaTemperaturaMedida
	movlw	.5						; Se coloca para centrar visualización en la
	call	LCD_PosicionLinea2		; segunda línea.
	btfss	TEMPER.LM35_TemperaturaSigno,7 ; ¿Temperatura negativa?
	goto	TemperaturaPositiva		; No, es positiva.
TemperaturaNegativa:
	movlw 	'-'						; Visualiza el signo "-" de temperatura negativa.
	call	LCD_Caracter
TemperaturaPositiva
	movf	TEMPER.LM35_Temperatura,W
	call	BIN_a_BCD				; La pasa a BCD.
	call	LCD_Byte				; Visualiza apagando los ceros no significativos.
	movlw	'.'						; Visualiza el punto decimal.
	call	LCD_Caracter
	movf	TEMPER.LM35_TemperaturaDecimal,W ; Visualiza la parte decimal.
	call	LCD_Nibble
	movlw	MensajeGradoCentigrado	; En pantalla LCD aparece "ºC  ".
	call	LCD_Mensaje
	return

; Subrutina "Termostato" ----------------------------------------------------------------
;
; Controla una carga en función del valor de la temperatura medida respecto de la temperatura
; deseada. Para evitar inestabilidad en la salida, tendrá un pequeño ciclo de histéresis.
; Así por ejemplo, si la temperatura deseada es 24 ºC la carga se activará cuando la
; temperatura baje o sea igual a 23,5 ºC y se apagará cuando la supere o sea igual a 25ºC.
; Si la temperatura medida está entre esos márgenes (23,5 y 25ºC), se queda en el estado
; anterior, tanto si está encendida como apagada.
;
; Para temperaturas negativas la salida se debe activar siempre.
;
; Entradas:
;		 -	(DS18B20_Temperatura), temperatura medida en valor absoluto.
;	     -	(TemperaturaDeseada), temperatura a partir de la cual se tomarán
;			decisiones sobre la salida.
;	     -	(DS18B20_Signo), registro con el signo de la temperatura medida. Si es cero
;			la temperatura es positiva y todos sus bits son "1", es negativa.
;
; Salida:    -	Su funcionamiento:
;	 	     -	Estando apagada, si la temperatura medida desciende por debajo de la
;				temperatura deseada la salida se activará.
;		     -	Estando encendida, si la temperatura medida supera la deseada la
;				salida se apagará.
;		     -	Si las temperaturas medidas y deseada son iguales se queda en estado
;				anterior, tanto si está encendida como si está apagada.
;		     -	Para temperaturas negativas la salida se debe activar siempre.
Termostato
	btfss	F_Termostato_ON			; Si el termostato no está activado salta a
	goto	ApagaCarga				; apagar la carga.
	btfsc	TEMPER.LM35_TemperaturaSigno,7	; Con temperaturas negativas pasa a activar
	goto	EnciendeCarga			; la carga.
	btfss	SalidaTermostato		; Comprueba el estado actual de la salida para
	goto	SalidaEstabaApagada		; actuar en consecuencia.
SalidaEstabaActivada				; Pasa a comprobar si tiene que apagar la carga.
	movf	TEMPER.LM35_Temperatura,W
	subwf	TemperaturaDeseada,W	; (W)=(TemperaturaDeseada)-(DS18B20_Temperatura).
	btfsc	STATUS,C				; ¿(TemperaturaDeseada)<(DS18B20_Temperatura)?	
	goto	FinTermostato			; Sí, por tanto, lo deja encendido y sale.
	call	Pitido					; Pitido cada vez que conmuta la carga.
ApagaCarga
	bcf		SalidaTermostato		; Apaga la salida y sale.
	goto	FinTermostato
SalidaEstabaApagada					; Pasa a comprobar si tiene que encender la carga
	movf	TemperaturaDeseada,W
	subwf	TEMPER.LM35_Temperatura,W	; (W)=(DS18B20_Temperatura)-(TemperaturaDeseada).
	btfsc	STATUS,C				; ¿(DS18B20_Temperatura)<(TemperaturaDeseada)?	
	goto	FinTermostato			; Sí, la deja apagada y sale.
EnciendeCarga
	call	Pitido					; Pitido cada vez que activa la carga.
	bsf		SalidaTermostato
FinTermostato
	return

; Subrutinas "CambiarModo" y "ModoTermostato_OFF" -----------------------------------------
;
; Subrutina de atención a la interrupción producida por el pulsador "MODO" que cambia el modo
; de funcionamiento. Cada vez que pulsa pasa por los modos "Termostato_Ajuste", "Termostato_ON",
; "Termostato_OFF" y vuelta repetir.
;
; El ajuste de la temperatura deseada en el termostato se logra mediante dos pulsadores: "MODO"
; e "INCREMENTAR" conectados a pines del Puerto B.

; Al principio aparecerá sólo el termómetro y el termostato estará desactivado: modo
; "Termostato_OFF"
;
; Para comprender el funcionamiento de esta subrutina, hay que saber que el registro FlagsModos
; contiene 3 flags que permiten diferenciar cada uno de los modos de funcionamiento:
; A)	Modo "Termostato_OFF", donde funciona como termómetro normal sin termostato. Se
;		reconoce por el flag F_Termostato_OFF, que es el bit 0 del registro FlagsModos.
; B)	Modo "Termostato_Ajuste", donde se ajusta la temperatura deseada cuando funcione
;		como termostato. Se reconoce por el flag F_Termostato_Ajuste, que es el bit 1 del
;		registro FlagsModos.
; C)	Modo "Termostato_ON", donde funciona como termómetro normal y, además, como termostato.
;		Se reconoce por el flag F_Termostato_ON, que es el bit 2 del registro FlagsModos.
;
; Así pues, el contenido del registro (FlagsModos) identifica los siguientes modos de
; funcionamiento:
; - (FlagsModos)=b'00000001'. Está en el modo "Termostato_OFF".
; - (FlagsModos)=b'00000010'. Está en el modo "Termostato_Ajuste".
; - (FlagsModos)=b'00000100'. Está en el modo "Termostato_ON".

; Pueden darse dos casos:
; -	Que pulse "AJUSTE" estando en el modo más alto, "Termostato_ON",
;	(FlagsModos)=b'00000100'. En este caso debe pasar al modo inicial 
;	"Termostato_OFF" poniendo (FlagsModos)=b'00000001'.
; -	Que pulse "AJUSTE" estando ya en cualquiera de los otros dos modos, en cuyo caso debe
;	pasar al siguiente modo. Esto lo hace mediante un desplazamiento a izquierdas. Así, por
;	ejemplo, si antes estaba en modo "Termostato_OFF", (FlagsModos)=b'00000001', pasará a
;	(FlagsModos)=b'00000010' que identifica al modo "Termostato_Ajuste".
;
CambiarModo
	call	Retardo_20ms			; Espera a que se estabilicen niveles de tensión.
	btfsc	ModoPulsador			; Si es un rebote, sale fuera.
	goto	FinCambiarModo
	call	PitidoCorto				; Cada vez que pulsa se oye un pitido.
	btfss	F_Termostato_ON			; Detecta si está en el último modo.
	goto	ModoSiguiente			; Si no, pasa al modo siguiente.
ModoTermostato_OFF
	call	Pitido					; Pitido cada vez que conmuta la carga.
	bcf		SalidaTermostato		; Apaga la carga.
	movlw	b'00000001'				; Actualiza el registro FlagsModos pasando al
	movwf	FlagsModos				; modo inicial "Termostato_OFF".
	goto	BorraPantalla
ModoSiguiente						; Desplaza un "1" a la izquierda del registro
	bcf		STATUS,C				; FlagsModos para ajustar secuencialmente
	rlf		FlagsModos,F			; cada uno de los modos de funcionamiento.
BorraPantalla
	call	LCD_Borra				; Borra la pantalla anterior.
FinCambiarModo
	call	Visualiza
	btfss	ModoPulsador			; Ahora espera a que deje de pulsar.
	goto	FinCambiarModo
	return

; Subrutina "IncrementarTempDeseada" ----------------------------------------------------
;
; Subrutina de atención a la interrupción por cambio de la línea RB6 a la cual se ha conectado
; el pulsador "INCREMENTAR". Estando en el modo "Termostato_Ajustar" incrementa el valor de
; la temperatura deseada entre unos valores máximo y mínimo.
;
; Al final debe guardar el valor de la temperatura deseada en memoria EEPROM de datos para
; preservar su valor en caso que desaparezca la alimentación.
;
TemperaturaMinima   EQU	.20
TemperaturaMaxima   EQU	.36

IncrementarTempDeseada
	call	Retardo_20ms			; Espera a que se estabilicen niveles de tensión.	
	btfsc	IncrementarPulsador		; Si es un rebote sale fuera.
	goto	FinIncrementar
	btfss	F_Termostato_Ajuste		; Si no está en modo "Termostato_Ajuste" sale
	goto	FinIncrementar			; fuera.
	call	PitidoCorto				; Pitido cada vez que pulsa.
	incf	TemperaturaDeseada,F	; Incrementa el valor de la temperatura deseada.
	movlw	TemperaturaMaxima		; ¿Ha llegado a la temperatura máxima de ajuste?.
	subwf	TemperaturaDeseada,W	; (W) = (TemperaturaDeseada) - TemperaturaMaxima.
	btfss	STATUS,C				; ¿(TemperaturaDeseada)>=TemperaturaMaxima?
	goto	VisualizaIncremento		; No, pasa a visualizarlo.
	movlw	TemperaturaMinima		; Sí, entonces inicializa el registro.
	movwf	TemperaturaDeseada
VisualizaIncremento
	call	Visualiza				; Visualiza mientras espera a que deje
	call	Retardo_200ms			; de pulsar.
	btfss	IncrementarPulsador		; Mientras permanezca pulsado,
	goto	IncrementarTempDeseada	; incrementa el dígito.
	clrw							; Salva el valor de la temperatura deseada en la 
	movwf	EEADR					; posición 00h de la EEPROM de datos. Se conserva
	movf	TemperaturaDeseada,W	; aunque se apague la alimentación.
	call	EEPROM_EscribeDato
FinIncrementar
	return

; Subrutina de pitidos ------------------------------------------------------------------
;
PitidoLargo
	bsf		Zumbador
	call	Retardo_500ms
Pitido
	bsf		Zumbador
	call	Retardo_200ms
PitidoCorto
	bsf		Zumbador
	call	Retardo_20ms
	bcf		Zumbador
	return
;
	INCLUDE  <LM35.INC>			; Subrutinas de control del termómetro digital.
	INCLUDE  <BUS_1LIN.INC>			; Subrutinas de control del bus de 1 línea.
	INCLUDE  <RETARDOS.INC>
	INCLUDE  <BIN_BCD.INC>
	INCLUDE  <LCD_4BIT.INC>
	INCLUDE  <LCD_MENS.INC>
	INCLUDE  <EEPROM.INC>
	END
```


estos son los errores


```
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 95 : Symbol not previously defined (LCD_Linea1)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 97 : Symbol not previously defined (LCD_Mensaje)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 98 : Symbol not previously defined (TEMPER.)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 98 : Symbol not previously defined (LM35_Inicializa)
Error[112]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 98 : Missing operator
Warning[207] F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 104 : Found label after column 1. (clrw)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 105 : Symbol not previously defined (EEPROM_LeeDato)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 149 : Symbol not previously defined (TEMPER.)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 149 : Symbol not previously defined (LM35_LeeTemperatura)
Error[112]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 149 : Missing operator
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 150 : Symbol not previously defined (TEMPER.)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 150 : Symbol not previously defined (LM35_Inicializa)
Error[112]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 150 : Missing operator
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 187 : Symbol not previously defined (LCD_Linea1)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 189 : Symbol not previously defined (LCD_Mensaje)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 201 : Symbol not previously defined (LCD_Linea1)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 203 : Symbol not previously defined (LCD_Mensaje)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 205 : Symbol not previously defined (LCD_PosicionLinea2)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 208 : Symbol not previously defined (BIN_a_BCD)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 209 : Symbol not previously defined (LCD_Byte)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 211 : Symbol not previously defined (LCD_Mensaje)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 227 : Symbol not previously defined (LCD_Linea1)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 229 : Symbol not previously defined (LCD_Mensaje)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 232 : Symbol not previously defined (LCD_PosicionLinea2)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 233 : Symbol not previously defined (TEMPER.LM35_TemperaturaSigno)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 237 : Symbol not previously defined (LCD_Caracter)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 239 : Symbol not previously defined (TEMPER.LM35_Temperatura)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 240 : Symbol not previously defined (BIN_a_BCD)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 241 : Symbol not previously defined (LCD_Byte)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 243 : Symbol not previously defined (LCD_Caracter)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 244 : Symbol not previously defined (TEMPER.LM35_TemperaturaDecimal)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 245 : Symbol not previously defined (LCD_Nibble)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 247 : Symbol not previously defined (LCD_Mensaje)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 279 : Symbol not previously defined (TEMPER.LM35_TemperaturaSigno)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 284 : Symbol not previously defined (TEMPER.LM35_Temperatura)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 294 : Symbol not previously defined (TEMPER.LM35_Temperatura)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 341 : Symbol not previously defined (Retardo_20ms)
Warning[207] F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 355 : Found label after column 1. (rlf)
Error[122]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 355 : Illegal opcode (FlagsModos)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 357 : Symbol not previously defined (LCD_Borra)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 377 : Symbol not previously defined (Retardo_20ms)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 392 : Symbol not previously defined (Retardo_200ms)
Warning[207] F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 395 : Found label after column 1. (clrw)
Error[116]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 395 : Address label duplicated or different in second pass (clrw)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 398 : Symbol not previously defined (EEPROM_EscribeDato)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 406 : Symbol not previously defined (Retardo_500ms)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 409 : Symbol not previously defined (Retardo_200ms)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 412 : Symbol not previously defined (Retardo_20ms)
Error[105]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 416 : Cannot open file (Include File "LM35.INC" not found)
Error[105]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 417 : Cannot open file (Include File "BUS_1LIN.INC" not found)
Error[105]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 418 : Cannot open file (Include File "RETARDOS.INC" not found)
Error[105]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 419 : Cannot open file (Include File "BIN_BCD.INC" not found)
Error[105]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 420 : Cannot open file (Include File "LCD_4BIT.INC" not found)
Error[105]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 421 : Cannot open file (Include File "LCD_MENS.INC" not found)
Error[105]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 422 : Cannot open file (Include File "EEPROM.INC" not found)
```

la programacion es para un sensor lm35 les agredeseria ayudarme porfavor.......


----------



## Eduardo (Jul 1, 2010)

No te esta encontrando ninguno de estos archivos.

INCLUDE  <LM35.INC>            ; Subrutinas de control del termómetro digital.
    INCLUDE  <BUS_1LIN.INC>            ; Subrutinas de control del bus de 1 línea.
    INCLUDE  <RETARDOS.INC>
    INCLUDE  <BIN_BCD.INC>
    INCLUDE  <LCD_4BIT.INC>
    INCLUDE  <LCD_MENS.INC>
    INCLUDE  <EEPROM.INC>

Y tendrian que estar al principio, no al final.


----------



## elneroo (Jul 1, 2010)

bueno esta bien pero estas seguro.............. k va a funcionar bien no........... lo voy a compilar ahora mismo...... gracias......

me siguen saliendo estos errores me puedes aydar porfavor.........


```
Warning[230] F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 51 : __CONFIG has been deprecated for PIC18 devices.  Use directive CONFIG.
Error[126]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 51 : Argument out of range (not a valid config register address)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 93 : Symbol not previously defined (LCD_Inicializa)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 102 : Symbol not previously defined (LCD_Linea1)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 104 : Symbol not previously defined (LCD_Mensaje)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 105 : Symbol not previously defined (TEMPER.)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 105 : Symbol not previously defined (LM35_Inicializa)
Error[112]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 105 : Missing operator
Warning[207] F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 111 : Found label after column 1. (clrw)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 112 : Symbol not previously defined (EEPROM_LeeDato)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 156 : Symbol not previously defined (TEMPER.)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 156 : Symbol not previously defined (LM35_LeeTemperatura)
Error[112]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 156 : Missing operator
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 157 : Symbol not previously defined (TEMPER.)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 157 : Symbol not previously defined (LM35_Inicializa)
Error[112]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 157 : Missing operator
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 194 : Symbol not previously defined (LCD_Linea1)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 196 : Symbol not previously defined (LCD_Mensaje)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 208 : Symbol not previously defined (LCD_Linea1)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 210 : Symbol not previously defined (LCD_Mensaje)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 212 : Symbol not previously defined (LCD_PosicionLinea2)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 215 : Symbol not previously defined (BIN_a_BCD)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 216 : Symbol not previously defined (LCD_Byte)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 218 : Symbol not previously defined (LCD_Mensaje)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 234 : Symbol not previously defined (LCD_Linea1)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 236 : Symbol not previously defined (LCD_Mensaje)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 239 : Symbol not previously defined (LCD_PosicionLinea2)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 240 : Symbol not previously defined (TEMPER.LM35_TemperaturaSigno)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 244 : Symbol not previously defined (LCD_Caracter)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 246 : Symbol not previously defined (TEMPER.LM35_Temperatura)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 247 : Symbol not previously defined (BIN_a_BCD)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 248 : Symbol not previously defined (LCD_Byte)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 250 : Symbol not previously defined (LCD_Caracter)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 251 : Symbol not previously defined (TEMPER.LM35_TemperaturaDecimal)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 252 : Symbol not previously defined (LCD_Nibble)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 254 : Symbol not previously defined (LCD_Mensaje)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 286 : Symbol not previously defined (TEMPER.LM35_TemperaturaSigno)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 291 : Symbol not previously defined (TEMPER.LM35_Temperatura)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 301 : Symbol not previously defined (TEMPER.LM35_Temperatura)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 348 : Symbol not previously defined (Retardo_20ms)
Warning[207] F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 362 : Found label after column 1. (rlf)
Error[122]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 362 : Illegal opcode (FlagsModos)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 364 : Symbol not previously defined (LCD_Borra)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 384 : Symbol not previously defined (Retardo_20ms)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 399 : Symbol not previously defined (Retardo_200ms)
Warning[207] F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 402 : Found label after column 1. (clrw)
Error[116]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 402 : Address label duplicated or different in second pass (clrw)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 405 : Symbol not previously defined (EEPROM_EscribeDato)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 413 : Symbol not previously defined (Retardo_500ms)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 416 : Symbol not previously defined (Retardo_200ms)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 419 : Symbol not previously defined (Retardo_20ms)
Halting build on first failure as requested.
BUILD FAILED: Thu Jul 01 16:57:25 2010
```


```
LIST		P=16F84A
	INCLUDE		<P16F84A.INC>
             INCLUDE  <LM35.INC>			; Subrutinas de control del termómetro digital.
	INCLUDE  <BUS_1LIN.INC>			; Subrutinas de control del bus de 1 línea.
	INCLUDE  <RETARDOS.INC>
	INCLUDE  <BIN_BCD.INC>
	INCLUDE  <LCD_4BIT.INC>
	INCLUDE  <LCD_MENS.INC>
	INCLUDE  <EEPROM.INC>
	__CONFIG	_CP_OFF &  _WDT_OFF & _PWRTE_ON & _XT_OSC

	CBLOCK	0x0C
	TemperaturaDeseada
	Registro50ms							; Guarda los incrementos cada 50 ms.
	FlagsModos								; Guarda los flags para establecer los
	ENDC									; modos de trabajo.

	ORG	0x2100								; Corresponde a la dirección 0 de la zona
											; EEPROM de datos. Aquí se va a guardar el
	DE	.24									; la temperatura deseada. En principio 24 ºC.

#DEFINE  SalidaTermostato 		PORTB,1		; Carga controlada por el termostato.
#DEFINE  Zumbador	 			PORTB,2		; Aquí se conecta el zumbador.
#DEFINE  ModoPulsador			PORTB,7		; Los pulsadores se conectan a estos
#DEFINE  IncrementarPulsador	PORTB,6		; pines del puerto B.
#DEFINE  F_Termostato_ON		FlagsModos,2	; Flags utilizados en el ajuste de la
#DEFINE  F_Termostato_Ajuste	FlagsModos,1	; temperatura del termostato.
#DEFINE  F_Termostato_OFF		FlagsModos,0

TMR0_Carga50ms	EQU	d'256'-d'195'			; Para conseguir interrupción cada 50 ms.
CARGA_2s		EQU	d'40'					; Leerá cada 2s = 40 x 50ms = 2000ms.	

; ZONA DE CÓDIGOS ********************************************************************

	ORG 	0
	goto	Inicio
	ORG	4
	goto	ServicioInterrupcion

Mensajes
	addwf	PCL,F
MensajePublicitario
	DT "calito", 0x00
MensajeTermostato_ON
	DT "Termostato: ", 0x00
MensajeTermostato_Ajuste
	DT "Temper. deseada", 0x00
MensajeGradoCentigrado
	DT "ºC  ", 0x00					; En pantalla LCD: "ºC  "

Inicio	
	call	LCD_Inicializa
	bsf		STATUS,RP0
	movlw	b'10000111'				; Prescaler de 256 para el TMR0.
	movwf	OPTION_REG
	bsf		ModoPulsador			; Se configuran como entrada.
	bsf		IncrementarPulsador
	bcf		SalidaTermostato		; Se configuran como salida.
	bcf		Zumbador
	bcf		STATUS,RP0
	call	LCD_Linea1				; Se sitúa al principio de la primera línea.
	movlw	MensajePublicitario
	call	LCD_Mensaje
	call	TEMPER.   LM35_Inicializa		; Comienza la conversión del termómetro y pone
	call	ModoTermostato_OFF		; este modo de funcionamiento.
	movlw	TMR0_Carga50ms			; Carga el TMR0 en complemento a 2.
	movwf	TMR0
	movlw	CARGA_2s					; Y el registro cuyo decremento contará los 2 s.
	movwf	Registro50ms
	clrw							; Lee la posición 0x00 de memoria EEPROM de datos
	call	EEPROM_LeeDato			; donde se guarda la temperatura deseada de la última
	movwf	TemperaturaDeseada		; vez que se ajustó.
	movlw	b'10101000'				; Activa interrupción del TMR0 (T0IE), por cambio de
	movwf	INTCON					; líneas del Puerto B (RBIE) y la general (GIE)
;
; La sección "Principal" es mantenimiento. Sólo espera las interrupciones.
; No se puede poner en modo de bajo consumo porque la instrucción "sleep" detiene el Timer 0.

Principal
	goto	Principal

; Subrutina "ServicioInterrupcion" ------------------------------------------------------
;
; Detecta qué ha producido la interrupción y ejecuta la subrutina de atención correspondiente.

ServicioInterrupcion
	btfsc	INTCON,T0IF				; Si es una interrupción producida por el Timer 0
	call	Termometro				; lee el termómetro y actualiza termostato.
	btfss	INTCON,RBIF				; Si es una interrupción RBI lee los pulsadores.
	goto	FinInterrupcion
	btfss	ModoPulsador			; ¿Está presionado el pulsador de "AJUSTE"?
	call	CambiarModo				; Sí. Ajusta la temperatura deseada en el termostato.
	btfss	IncrementarPulsador		; ¿Pulsado "INCREMENTAR"?
	call	IncrementarTempDeseada	; Sí, pasa a incrementar la temperatura deseada.
FinInterrupcion
	bcf		INTCON,RBIF				; Limpia los flags de reconocimiento.
	bcf		INTCON,T0IF
	retfie

; Subrutina "Termometro" ----------------------------------------------------------------
;
; Esta subrutina lee y visualiza el termómetro cada 2 segundos aproximadamente. Se ejecuta
; debido a la petición de interrupción del Timer 0, cada 50 ms. Para conseguir una
; temporización de 2 s, habrá que repetir 40 veces el lazo de 50 ms (40x50ms=2000ms=2s).
;
; También actúa sobre la salida del termostato posicionándola adecuadamente.

Termometro
	movlw	TMR0_Carga50ms
	movwf	TMR0					; Recarga el TMR0.
	decfsz	Registro50ms,F			; Decrementa el contador.
	goto	FinInterrupcion			; No han pasado 2 segundos, por tanto sale.
	movlw	CARGA_2s				; Repone este contador nuevamente.
	movwf	Registro50ms
	call	TEMPER.   LM35_LeeTemperatura	; Lee la temperatura.
	call	TEMPER.   LM35_Inicializa		; Comienza conversión para la siguiente lectura.
	call	Termostato				; Actúa sobre el termostato.
```


----------



## Felsup (Jul 1, 2010)

Hola elneroo

Estuve viendo los errores que te aparecen, primero el ejemplo que escribiste primero si esta correcto, los INCLUDE no van al principio sino al final exceptuando el del pic16f84 que ese si va al principio, inclusive yo tengo esas librerias y siempre se ponen la final antes de END. Si dices que te pasaron el programa, al persona también tuvo que haberte pasado las librerias para que el compilador encuentre los archivo y así ya no te salgan errores. Sino te los paso ahi esta el problema. 
Tercero en el programa estas empezando con LIST P=16F84A
INCLUDE <P16F84A.INC> y deberías iniciar con  __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC y despues LIST P=16F84A INCLUDE <P16F84A.INC>, inclusive te los esta marcando en los errores.
Si te sigen saliendo errores escribelos para que te ayudemos.


----------



## elneroo (Jul 1, 2010)

esta es la programacion completa
y se lo q me dijistes pero ifgual me sale errores....... parece q no me dieron esas librerias q mencionas.....


```
__CONFIG	_CP_OFF &  _WDT_OFF & _PWRTE_ON & _XT_OSC

	LIST		P=16F84A
	INCLUDE		<P16F84A.INC>
   


	CBLOCK	0x0C
	TemperaturaDeseada
	Registro50ms							; Guarda los incrementos cada 50 ms.
	FlagsModos								; Guarda los flags para establecer los
	ENDC									; modos de trabajo.

	ORG	0x2100								; Corresponde a la dirección 0 de la zona
											; EEPROM de datos. Aquí se va a guardar el
	DE	.24									; la temperatura deseada. En principio 24 ºC.

#DEFINE  SalidaTermostato 		PORTB,1		; Carga controlada por el termostato.
#DEFINE  Zumbador	 			PORTB,2		; Aquí se conecta el zumbador.
#DEFINE  ModoPulsador			PORTB,7		; Los pulsadores se conectan a estos
#DEFINE  IncrementarPulsador	PORTB,6		; pines del puerto B.
#DEFINE  F_Termostato_ON		FlagsModos,2	; Flags utilizados en el ajuste de la
#DEFINE  F_Termostato_Ajuste	FlagsModos,1	; temperatura del termostato.
#DEFINE  F_Termostato_OFF		FlagsModos,0

TMR0_Carga50ms	EQU	d'256'-d'195'			; Para conseguir interrupción cada 50 ms.
CARGA_2s		EQU	d'40'					; Leerá cada 2s = 40 x 50ms = 2000ms.	

; ZONA DE CÓDIGOS ********************************************************************

	ORG 	0
	goto	Inicio
	ORG	4
	goto	ServicioInterrupcion

Mensajes
	addwf	PCL,F
MensajePublicitario
	DT "calito", 0x00
MensajeTermostato_ON
	DT "Termostato: ", 0x00
MensajeTermostato_Ajuste
	DT "Temper. deseada", 0x00
MensajeGradoCentigrado
	DT "ºC  ", 0x00					; En pantalla LCD: "ºC  "

Inicio	
	call	LCD_Inicializa
	bsf		STATUS,RP0
	movlw	b'10000111'				; Prescaler de 256 para el TMR0.
	movwf	OPTION_REG
	bsf		ModoPulsador			; Se configuran como entrada.
	bsf		IncrementarPulsador
	bcf		SalidaTermostato		; Se configuran como salida.
	bcf		Zumbador
	bcf		STATUS,RP0
	call	LCD_Linea1				; Se sitúa al principio de la primera línea.
	movlw	MensajePublicitario
	call	LCD_Mensaje
	call	LM35_Inicializa		; Comienza la conversión del termómetro y pone
	call	ModoTermostato_OFF		; este modo de funcionamiento.
	movlw	TMR0_Carga50ms			; Carga el TMR0 en complemento a 2.
	movwf	TMR0
	movlw	CARGA_2s					; Y el registro cuyo decremento contará los 2 s.
	movwf	Registro50ms
	clrw							; Lee la posición 0x00 de memoria EEPROM de datos
	call	EEPROM_LeeDato			; donde se guarda la temperatura deseada de la última
	movwf	TemperaturaDeseada		; vez que se ajustó.
	movlw	b'10101000'				; Activa interrupción del TMR0 (T0IE), por cambio de
	movwf	INTCON					; líneas del Puerto B (RBIE) y la general (GIE)
;
; La sección "Principal" es mantenimiento. Sólo espera las interrupciones.
; No se puede poner en modo de bajo consumo porque la instrucción "sleep" detiene el Timer 0.

Principal
	goto	Principal

; Subrutina "ServicioInterrupcion" ------------------------------------------------------
;
; Detecta qué ha producido la interrupción y ejecuta la subrutina de atención correspondiente.

ServicioInterrupcion
	btfsc	INTCON,T0IF				; Si es una interrupción producida por el Timer 0
	call	Termometro				; lee el termómetro y actualiza termostato.
	btfss	INTCON,RBIF				; Si es una interrupción RBI lee los pulsadores.
	goto	FinInterrupcion
	btfss	ModoPulsador			; ¿Está presionado el pulsador de "AJUSTE"?
	call	CambiarModo				; Sí. Ajusta la temperatura deseada en el termostato.
	btfss	IncrementarPulsador		; ¿Pulsado "INCREMENTAR"?
	call	IncrementarTempDeseada	; Sí, pasa a incrementar la temperatura deseada.
FinInterrupcion
	bcf		INTCON,RBIF				; Limpia los flags de reconocimiento.
	bcf		INTCON,T0IF
	retfie

; Subrutina "Termometro" ----------------------------------------------------------------
;
; Esta subrutina lee y visualiza el termómetro cada 2 segundos aproximadamente. Se ejecuta
; debido a la petición de interrupción del Timer 0, cada 50 ms. Para conseguir una
; temporización de 2 s, habrá que repetir 40 veces el lazo de 50 ms (40x50ms=2000ms=2s).
;
; También actúa sobre la salida del termostato posicionándola adecuadamente.

Termometro
	movlw	TMR0_Carga50ms
	movwf	TMR0					; Recarga el TMR0.
	decfsz	Registro50ms,F			; Decrementa el contador.
	goto	FinInterrupcion			; No han pasado 2 segundos, por tanto sale.
	movlw	CARGA_2s				; Repone este contador nuevamente.
	movwf	Registro50ms
	call	LM35_Lee temperatura	; Lee la temperatura.
	call	LM35_Inicializa		; Comienza conversión para la siguiente lectura.
	call	Termostato				; Actúa sobre el termostato.
;	call	Visualiza				; Como esta subrutina se escribe a continuación
;	return							; se ahorra estas dos instrucciones y ahorra 
									; también espacio en la pila.
; Subrutina "Visualiza" -----------------------------------------------------------------
;
; Visualiza el termómetro en tres formatos posibles:
; A)	Con el termostato desactivado, modo "Termostato_OFF". Por ejemplo:
; 				"calito" (Primera línea)
;				"       24.5ºC   " (Segunda línea).
;		Donde en la primera línea se visualiza un mensaje publicitario y en la
;		segunda línea la temperatura medida actual.
; B)	Ajuste del termostato, modo "Termostato_Ajuste". Por ejemplo:
;	 			"Temper. deseada" (Primera línea)
;				"        25ºC     " (Segunda línea).
; 		Donde en la segunda línea visualiza la temperatura que se desea ajustar.
; C)	Con el termostato activado, modo "Termostato_ON". Por ejemplo:
; 				"Termostato: 25ºC" (Primera línea)
;				"      23.5ºC    " (Segunda línea).
; 		Donde en la primera línea se visualiza la temperatura que se desea
;		ajustar y en la segunda línea la temperatura medida actual.
Visualiza
	btfsc	F_Termostato_OFF
	goto	VisualizaTermometro
	btfsc	F_Termostato_Ajuste
	goto	VisualizaTermostato_Ajuste
	btfsc	F_Termostato_ON
	goto	VisualizaTermostato_ON
	return

; "VisualizaTermostato_ON" --------------------------------------------------------------
;
; Visualiza el valor de la temperatura deseada en la primera línea y el valor de la
; temperatura medida en la segunda línea.
; 
VisualizaTermostato_ON
	call	LCD_Linea1
	movlw	MensajeTermostato_ON
	call	LCD_Mensaje
	call	VisualizaTemperaturaDeseada
	call	VisualizaTemperaturaMedida
	return

; "VisualizaTermostatoAjuste" y "VisualizaTemperaturaDeseada" ---------------------------
;
; Visualiza en la pantalla el formato propio de este modo.
; 
; Entradas:	(TemperaturaDeseada) temperatura ajustada en la subrutina Incrementar.

VisualizaTermostato_Ajuste
	call	LCD_Linea1					; Se sitúa al principio de la primera línea.
	movlw	MensajeTermostato_Ajuste	; Visualiza mensaje en la primera línea.
	call	LCD_Mensaje
	movlw	.6							; Se coloca para centrar visualización en la 
	call	LCD_PosicionLinea2			; segunda línea.
VisualizaTemperaturaDeseada
	movf	TemperaturaDeseada,W
	call	BIN_a_BCD					; La pasa a BCD.
	call	LCD_Byte					; Visualiza, apagando los ceros no significativos.
	movlw	MensajeGradoCentigrado		; En pantalla aparece "ºC  ".
	call	LCD_Mensaje
	return

; "VisualizaTermometro" y ""VisualizaTemperaturaMedida" ---------------------------------
;
; En la primera línea se visualiza un mensaje publicitario y en la segunda línea la
; temperatura medida
;
; Entradas:
;	  -	(DS18B20_Temperatura), temperatura medida en valor absoluto.
;     -	(DS18B20_TemperaturaDecimal), parte decimal de la temperatura medida.
;     -	(DS18B20_Signo), registro con el signo de la temperatura. Si es igual a
;		b'00000000' la temperatura es positiva. Si es b'11111111' resulta que
;		la temperatura es negativa.
;
VisualizaTermometro
	call	LCD_Linea1				; Se sitúa al principio de la primera línea.
	movlw	MensajePublicitario
	call	LCD_Mensaje
VisualizaTemperaturaMedida
	movlw	.5						; Se coloca para centrar visualización en la
	call	LCD_PosicionLinea2		; segunda línea.
	btfss	LM35_TemperaturaSigno,7 ; ¿Temperatura negativa?
	goto	TemperaturaPositiva		; No, es positiva.
TemperaturaNegativa:
	movlw 	'-'						; Visualiza el signo "-" de temperatura negativa.
	call	LCD_Caracter
TemperaturaPositiva
	movf	TEMPER.LM35_Temperatura,W
	call	BIN_a_BCD				; La pasa a BCD.
	call	LCD_Byte				; Visualiza apagando los ceros no significativos.
	movlw	'.'						; Visualiza el punto decimal.
	call	LCD_Caracter
	movf	LM35_TemperaturaDecimal,W ; Visualiza la parte decimal.
	call	LCD_Nibble
	movlw	MensajeGradoCentigrado	; En pantalla LCD aparece "ºC  ".
	call	LCD_Mensaje
	return

; Subrutina "Termostato" ----------------------------------------------------------------
;
; Controla una carga en función del valor de la temperatura medida respecto de la temperatura
; deseada. Para evitar inestabilidad en la salida, tendrá un pequeño ciclo de histéresis.
; Así por ejemplo, si la temperatura deseada es 24 ºC la carga se activará cuando la
; temperatura baje o sea igual a 23,5 ºC y se apagará cuando la supere o sea igual a 25ºC.
; Si la temperatura medida está entre esos márgenes (23,5 y 25ºC), se queda en el estado
; anterior, tanto si está encendida como apagada.
;
; Para temperaturas negativas la salida se debe activar siempre.
;
; Entradas:
;		 -	(DS18B20_Temperatura), temperatura medida en valor absoluto.
;	     -	(TemperaturaDeseada), temperatura a partir de la cual se tomarán
;			decisiones sobre la salida.
;	     -	(DS18B20_Signo), registro con el signo de la temperatura medida. Si es cero
;			la temperatura es positiva y todos sus bits son "1", es negativa.
;
; Salida:    -	Su funcionamiento:
;	 	     -	Estando apagada, si la temperatura medida desciende por debajo de la
;				temperatura deseada la salida se activará.
;		     -	Estando encendida, si la temperatura medida supera la deseada la
;				salida se apagará.
;		     -	Si las temperaturas medidas y deseada son iguales se queda en estado
;				anterior, tanto si está encendida como si está apagada.
;		     -	Para temperaturas negativas la salida se debe activar siempre.
Termostato
	btfss	F_Termostato_ON			; Si el termostato no está activado salta a
	goto	ApagaCarga				; apagar la carga.
	btfsc	LM35_TemperaturaSigno,7	; Con temperaturas negativas pasa a activar
	goto	EnciendeCarga			; la carga.
	btfss	SalidaTermostato		; Comprueba el estado actual de la salida para
	goto	SalidaEstabaApagada		; actuar en consecuencia.
SalidaEstabaActivada				; Pasa a comprobar si tiene que apagar la carga.
	movf	LM35_Temperatura,W
	subwf	TemperaturaDeseada,W	; (W)=(TemperaturaDeseada)-(DS18B20_Temperatura).
	btfsc	STATUS,C				; ¿(TemperaturaDeseada)<(DS18B20_Temperatura)?	
	goto	FinTermostato			; Sí, por tanto, lo deja encendido y sale.
	call	Pitido					; Pitido cada vez que conmuta la carga.
ApagaCarga
	bcf		SalidaTermostato		; Apaga la salida y sale.
	goto	FinTermostato
SalidaEstabaApagada					; Pasa a comprobar si tiene que encender la carga
	movf	TemperaturaDeseada,W
	subwf	LM35_Temperatura,W	; (W)=(DS18B20_Temperatura)-(TemperaturaDeseada).
	btfsc	STATUS,C				; ¿(DS18B20_Temperatura)<(TemperaturaDeseada)?	
	goto	FinTermostato			; Sí, la deja apagada y sale.
EnciendeCarga
	call	Pitido					; Pitido cada vez que activa la carga.
	bsf		SalidaTermostato
FinTermostato
	return

; Subrutinas "CambiarModo" y "ModoTermostato_OFF" -----------------------------------------
;
; Subrutina de atención a la interrupción producida por el pulsador "MODO" que cambia el modo
; de funcionamiento. Cada vez que pulsa pasa por los modos "Termostato_Ajuste", "Termostato_ON",
; "Termostato_OFF" y vuelta repetir.
;
; El ajuste de la temperatura deseada en el termostato se logra mediante dos pulsadores: "MODO"
; e "INCREMENTAR" conectados a pines del Puerto B.

; Al principio aparecerá sólo el termómetro y el termostato estará desactivado: modo
; "Termostato_OFF"
;
; Para comprender el funcionamiento de esta subrutina, hay que saber que el registro FlagsModos
; contiene 3 flags que permiten diferenciar cada uno de los modos de funcionamiento:
; A)	Modo "Termostato_OFF", donde funciona como termómetro normal sin termostato. Se
;		reconoce por el flag F_Termostato_OFF, que es el bit 0 del registro FlagsModos.
; B)	Modo "Termostato_Ajuste", donde se ajusta la temperatura deseada cuando funcione
;		como termostato. Se reconoce por el flag F_Termostato_Ajuste, que es el bit 1 del
;		registro FlagsModos.
; C)	Modo "Termostato_ON", donde funciona como termómetro normal y, además, como termostato.
;		Se reconoce por el flag F_Termostato_ON, que es el bit 2 del registro FlagsModos.
;
; Así pues, el contenido del registro (FlagsModos) identifica los siguientes modos de
; funcionamiento:
; - (FlagsModos)=b'00000001'. Está en el modo "Termostato_OFF".
; - (FlagsModos)=b'00000010'. Está en el modo "Termostato_Ajuste".
; - (FlagsModos)=b'00000100'. Está en el modo "Termostato_ON".

; Pueden darse dos casos:
; -	Que pulse "AJUSTE" estando en el modo más alto, "Termostato_ON",
;	(FlagsModos)=b'00000100'. En este caso debe pasar al modo inicial 
;	"Termostato_OFF" poniendo (FlagsModos)=b'00000001'.
; -	Que pulse "AJUSTE" estando ya en cualquiera de los otros dos modos, en cuyo caso debe
;	pasar al siguiente modo. Esto lo hace mediante un desplazamiento a izquierdas. Así, por
;	ejemplo, si antes estaba en modo "Termostato_OFF", (FlagsModos)=b'00000001', pasará a
;	(FlagsModos)=b'00000010' que identifica al modo "Termostato_Ajuste".
;
CambiarModo
	call	Retardo_20ms			; Espera a que se estabilicen niveles de tensión.
	btfsc	ModoPulsador			; Si es un rebote, sale fuera.
	goto	FinCambiarModo
	call	PitidoCorto				; Cada vez que pulsa se oye un pitido.
	btfss	F_Termostato_ON			; Detecta si está en el último modo.
	goto	ModoSiguiente			; Si no, pasa al modo siguiente.
ModoTermostato_OFF
	call	Pitido					; Pitido cada vez que conmuta la carga.
	bcf		SalidaTermostato		; Apaga la carga.
	movlw	b'00000001'				; Actualiza el registro FlagsModos pasando al
	movwf	FlagsModos				; modo inicial "Termostato_OFF".
	goto	BorraPantalla
ModoSiguiente						; Desplaza un "1" a la izquierda del registro
	bcf		STATUS,C				; FlagsModos para ajustar secuencialmente
	rlf		FlagsModos,F			; cada uno de los modos de funcionamiento.
BorraPantalla
	call	LCD_Borra				; Borra la pantalla anterior.
FinCambiarModo
	call	Visualiza
	btfss	ModoPulsador			; Ahora espera a que deje de pulsar.
	goto	FinCambiarModo
	return

; Subrutina "IncrementarTempDeseada" ----------------------------------------------------
;
; Subrutina de atención a la interrupción por cambio de la línea RB6 a la cual se ha conectado
; el pulsador "INCREMENTAR". Estando en el modo "Termostato_Ajustar" incrementa el valor de
; la temperatura deseada entre unos valores máximo y mínimo.
;
; Al final debe guardar el valor de la temperatura deseada en memoria EEPROM de datos para
; preservar su valor en caso que desaparezca la alimentación.
;
TemperaturaMinima   EQU	.20
TemperaturaMaxima   EQU	.36

IncrementarTempDeseada
	call	Retardo_20ms			; Espera a que se estabilicen niveles de tensión.	
	btfsc	IncrementarPulsador		; Si es un rebote sale fuera.
	goto	FinIncrementar
	btfss	F_Termostato_Ajuste		; Si no está en modo "Termostato_Ajuste" sale
	goto	FinIncrementar			; fuera.
	call	PitidoCorto				; Pitido cada vez que pulsa.
	incf	TemperaturaDeseada,F	; Incrementa el valor de la temperatura deseada.
	movlw	TemperaturaMaxima		; ¿Ha llegado a la temperatura máxima de ajuste?.
	subwf	TemperaturaDeseada,W	; (W) = (TemperaturaDeseada) - TemperaturaMaxima.
	btfss	STATUS,C				; ¿(TemperaturaDeseada)>=TemperaturaMaxima?
	goto	VisualizaIncremento		; No, pasa a visualizarlo.
	movlw	TemperaturaMinima		; Sí, entonces inicializa el registro.
	movwf	TemperaturaDeseada
VisualizaIncremento
	call	Visualiza				; Visualiza mientras espera a que deje
	call	Retardo_200ms			; de pulsar.
	btfss	IncrementarPulsador		; Mientras permanezca pulsado,
	goto	IncrementarTempDeseada	; incrementa el dígito.
	clrw							; Salva el valor de la temperatura deseada en la 
	movwf	EEADR					; posición 00h de la EEPROM de datos. Se conserva
	movf	TemperaturaDeseada,W	; aunque se apague la alimentación.
	call	EEPROM_EscribeDato
FinIncrementar
	return

; Subrutina de pitidos ------------------------------------------------------------------
;
PitidoLargo
	bsf		Zumbador
	call	Retardo_500ms
Pitido
	bsf		Zumbador
	call	Retardo_200ms
PitidoCorto
	bsf		Zumbador
	call	Retardo_20ms
	bcf		Zumbador
 	return	
    INCLUDE  <LM35.INC>			; Subrutinas de control del termómetro digital.
	INCLUDE  <BUS_1LIN.INC>			; Subrutinas de control del bus de 1 línea.
	INCLUDE  <RETARDOS.INC>
	INCLUDE  <BIN_BCD.INC>
	INCLUDE  <LCD_4BIT.INC>
	INCLUDE  <LCD_MENS.INC>
	INCLUDE  <EEPROM.INC>


	END
```

estos son los errores q me salem..................



```
Make: The target "F:\Nueva carpeta\_Termostato 4.o" is out of date.
Executing: "C:\Archivos de programa\Microchip\MPASM Suite\MPAsmWin.exe" /q /p18F452 "_Termostato 4.asm" /l"_Termostato 4.lst" /e"_Termostato 4.err"
Warning[230] F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 43 : __CONFIG has been deprecated for PIC18 devices.  Use directive CONFIG.
Error[126]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 43 : Argument out of range (not a valid config register address)
Warning[215] F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 45 : Processor superseded by command line.  Verify processor symbol.
Message[301] C:\ARCHIVOS DE PROGRAMA\MICROCHIP\MPASM SUITE\P16F84A.INC 35 : MESSAGE: (Processor-header file mismatch.  Verify selected processor.)
Error[126]   C:\ARCHIVOS DE PROGRAMA\MICROCHIP\MPASM SUITE\P16F84A.INC 114 : Argument out of range (must be greater than or equal to 255)
Error[126]   C:\ARCHIVOS DE PROGRAMA\MICROCHIP\MPASM SUITE\P16F84A.INC 115 : Argument out of range (__MAXRAM must be used first)
Error[126]   C:\ARCHIVOS DE PROGRAMA\MICROCHIP\MPASM SUITE\P16F84A.INC 115 : Argument out of range (__MAXRAM must be used first)
Error[126]   C:\ARCHIVOS DE PROGRAMA\MICROCHIP\MPASM SUITE\P16F84A.INC 115 : Argument out of range (__MAXRAM must be used first)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 90 : Symbol not previously defined (LCD_Inicializa)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 99 : Symbol not previously defined (LCD_Linea1)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 101 : Symbol not previously defined (LCD_Mensaje)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 102 : Symbol not previously defined (LM35_Inicializa)
Warning[207] F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 108 : Found label after column 1. (clrw)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 109 : Symbol not previously defined (EEPROM_LeeDato)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 153 : Symbol not previously defined (LM35_Lee)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 153 : Symbol not previously defined (temperatura)
Error[112]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 153 : Missing operator
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 154 : Symbol not previously defined (LM35_Inicializa)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 191 : Symbol not previously defined (LCD_Linea1)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 193 : Symbol not previously defined (LCD_Mensaje)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 205 : Symbol not previously defined (LCD_Linea1)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 207 : Symbol not previously defined (LCD_Mensaje)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 209 : Symbol not previously defined (LCD_PosicionLinea2)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 212 : Symbol not previously defined (BIN_a_BCD)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 213 : Symbol not previously defined (LCD_Byte)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 215 : Symbol not previously defined (LCD_Mensaje)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 231 : Symbol not previously defined (LCD_Linea1)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 233 : Symbol not previously defined (LCD_Mensaje)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 236 : Symbol not previously defined (LCD_PosicionLinea2)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 237 : Symbol not previously defined (LM35_TemperaturaSigno)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 241 : Symbol not previously defined (LCD_Caracter)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 243 : Symbol not previously defined (TEMPER.LM35_Temperatura)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 244 : Symbol not previously defined (BIN_a_BCD)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 245 : Symbol not previously defined (LCD_Byte)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 247 : Symbol not previously defined (LCD_Caracter)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 248 : Symbol not previously defined (LM35_TemperaturaDecimal)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 249 : Symbol not previously defined (LCD_Nibble)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 251 : Symbol not previously defined (LCD_Mensaje)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 283 : Symbol not previously defined (LM35_TemperaturaSigno)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 288 : Symbol not previously defined (LM35_Temperatura)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 298 : Symbol not previously defined (LM35_Temperatura)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 345 : Symbol not previously defined (Retardo_20ms)
Warning[207] F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 359 : Found label after column 1. (rlf)
Error[122]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 359 : Illegal opcode (FlagsModos)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 361 : Symbol not previously defined (LCD_Borra)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 381 : Symbol not previously defined (Retardo_20ms)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 396 : Symbol not previously defined (Retardo_200ms)
Warning[207] F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 399 : Found label after column 1. (clrw)
Error[116]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 399 : Address label duplicated or different in second pass (clrw)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 402 : Symbol not previously defined (EEPROM_EscribeDato)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 410 : Symbol not previously defined (Retardo_500ms)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 413 : Symbol not previously defined (Retardo_200ms)
Error[113]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 416 : Symbol not previously defined (Retardo_20ms)
Error[105]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 419 : Cannot open file (Include File "LM35.INC" not found)
Error[105]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 420 : Cannot open file (Include File "BUS_1LIN.INC" not found)
Error[105]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 421 : Cannot open file (Include File "RETARDOS.INC" not found)
Error[105]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 422 : Cannot open file (Include File "BIN_BCD.INC" not found)
Error[105]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 423 : Cannot open file (Include File "LCD_4BIT.INC" not found)
Error[105]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 424 : Cannot open file (Include File "LCD_MENS.INC" not found)
Error[105]   F:\NUEVA CARPETA\_TERMOSTATO 4.ASM 425 : Cannot open file (Include File "EEPROM.INC" not found)
Halting build on first failure as requested.
BUILD FAILED: Thu Jul 01 17:54:29 2010
```


 te agredeceria bastente q me puedas ayudar porfavor............


----------



## Eduardo (Jul 1, 2010)

elneroo dijo:


> bueno esta bien pero estas seguro.............. k va a funcionar bien no........... lo voy a compilar ahora mismo...... gracias......
> 
> me siguen saliendo estos errores me puedes aydar porfavor.........


Pibe, si querés que te ayuden primero tenés que facilitar las cosas. 
Estás mostrando un código donde se perdió el indentado *(tenés que usar el atributo 
	
	




		Código:
	

) [/B]y los includes brillan por su ausencia.
Que significa? --> Que no se lo puede compilar.

Basta que[B] leas[/B] los mensajes de error para que veas que tenés una banda de símbolos que no están definidos. Y no están definidos porque la definición está en los includes y no la encontró por ningún lado. Y en el primer listado, además te decía[B] que no podía abrirlos[/B].

Cuando te dije que pongas los includes al principio, fue porque cuando estan al final, el compilador está obligado a hacer múltiples pasadas y no siempre resuelve bien las "forward references".  Claro que al principio, muchas veces no puede ser en cualquier lado :) --> La solución es obviamente conocer el contenido, justamente para poder saber [B]dónde[/B] meterlos.


Lo mejor que podes hacer es poner un link a los archivos zipeados.

*


----------



## carmant (Ene 20, 2011)

Hola a todos, En primer lugar deciros que mis conocimientos de programación son basicos pero espero poco a poco ir aprendiendo.
Tengo un problema a la hora de simular el termometro lcd con pic 16f870 con proteus, me dá este error y no me deja, podria alguien decirme que pasa?, no he tocado nada del codigo, está segun lo bajé de la pagina de pablin  http://www.pablin.com.ar/electron/circuito/mc/termost/index.htm
Adjunto captura del error y el codigo es este:



```
; Control de temperatura con LM35 y pantalla de LCD
; Una salida se activa ante una temp. baja y se desactiva ante una alta ambas seteables
; Guarda los parámetros en la EEPROM
; Micro: PIC16F870 a 4MHz XT

pcl    equ    0x02        ;Contador de programa (Parte baja)
estado    equ    0x03        ;Registro de estados
ptoa    equ    0x05        ;Puertos de E/S
ptob    equ    0x06
ptoc    equ    0x07
intcon    equ    0x0B        ;Controlador de interrupciones
eedata    equ    0x0C        ;Registro de datos de la EEPROM
eeaddr    equ    0x0D        ;Registro de direccion de la EEPROM
adres    equ    0x1E        ;Resultado de la conversión A/D (HIGH / LOW)
adcon    equ    0x1F        ;Configuración del conversor A/D
uni    equ    0x20        ;Usados para manejar los datos a mostrar en display
dec    equ    0x21
cen    equ    0x22
tiempo1    equ    0x23        ;Usados para temporizar
tiempo2    equ    0x24
letra    equ    0x25        ;Usado para apuntar la letra a colocar en el LCD
menor    equ    0x26        ;Temperatura de activación
mayor    equ    0x27        ;Temperatura de desactivación
buffer    equ    0x28        ;Usado como registro temporal

#define    CARRY    estado, 0    ;Bit de acarreo
#define    CERO    estado, 2    ;Flag indicador de resultado cero
#define    RP0    estado, 5    ;Bit 0 selector de página de memoria
#define    RP1    estado, 6    ;Bit 1 selector de página de memoria
#define    ADGO    adcon, 2    ;Bit que inicia la conversión (1) / Indica finalización (0)
#define    EEREAD    eedata, 0    ;Bit que inicia la lectura de la EEPROM
#define    EEWRITE    eedata, 1    ;Bit que inicia la escritura de la EEPROM - Indica finalización
#define    EEWREN    eedata, 2    ;Bit que habilita la escritura en la EEPROM
#define    EEAREA    eedata, 7    ;Bit que selecciona el área de EEPROM a utilizar (0=AREA DE DATOS)
#define    MINS    ptoa, 1        ;Sube el punto mínimo
#define    MINB    ptoa, 2        ;Baja el punto mínimo
#define    MAXS    ptoa, 3        ;Sube el punto máximo
#define    MAXB    ptoa, 4        ;Baja el punto máximo
#define    BUZZER    ptoc, 3        ;Salida al aviso acústico
#define    RELE    ptoc, 4        ;Relé que maneja la carga (calefactor / enfriador)
#define    LCDE    ptoc, 6        ;Habilitación del LCD
#define    LCDRS    ptoc, 7        ;Selección de modo del LCD

    bsf    RP0        ;Pasa a página 1
    bcf    RP1
    movlw    b'00011111'    ;Configura puerto A
    movwf    ptoa
    clrf    ptob        ;Puerto B completo como salidas (bus del LCD)
    clrf    ptoc        ;Puerto B completo como salidas
    movlw    b'10001110'    ;Configura los pines del Puerto A
    movwf    adcon        ;AN0 como única entrada análoga
    bsf    RP1        ;Pasa a página 3
    bcf    EEAREA        ;Selecciona el banco de EEPROM de datos
    bcf    RP1        ;Pasa a página 0
    bcf    RP0
    movlw    b'01000001'    ;Enciende y configura el convertidor A/D - Selecciona AN0 como entrada
    movwf    adcon
    
    clrf    ptoa        ;Apaga todo
    clrf    ptob
    clrf    ptoc
    
    bsf    RP1        ;Pasa a la página 2 de memoria
    clrf    eeaddr        ;Direcciona la primera posición de la EEPROM
    bsf    RP0        ;Pasa a la página 3 de memoria
    bsf    EEREAD        ;Inicia la lectura de la EEPROM
    bcf    RP0        ;Vuelve a la página 3 de memoria
    movf    eedata, 0    ;Dato Leído de la EEPROM -> W
    movwf    menor        ;Guarda el dato leído de la EEPROM en MENOR (punto de activación del relé)
    incf    eeaddr        ;Direcciona a la segunda posición de la EEPROM
    bsf    RP0        ;Pasa a la página 3 de memoria
    bsf    EEREAD        ;Inicia la lectura de la EEPROM
    bcf    RP0        ;Vuelve a la página 3 de memoria
    movf    eedata, 0    ;Dato Leído de la EEPROM -> W
    movwf    mayor        ;Guarda el dato leído de la EEPROM en MAYOR (punto de desactivación del relé)
    bcf    RP1        ;Pasa a la página 0 de memoria

    movlw    b'00111000'    ;Comunicación con el LCD a ocho bits - Dos líneas de texto
    call    CONTROL
    movlw    d'2'
    call    DEMORA        ;Demora 2ms
    movlw    b'00000110'    ;Mensaje estático, se desplaza el cursor hacia la derecha
    call    CONTROL
    movlw    d'2'
    call    DEMORA        ;Demora 2ms
    movlw    b'00001100'    ;Enciende el display - Oculta el cursor - Caracter fijo
    call    CONTROL
    movlw    d'2'
    call    DEMORA        ;Demora 2ms
    movlw    b'00000001'    ;Limpia la pantalla y pone cursor en posición inicial
    call    CONTROL
    movlw    d'2'
    call    DEMORA        ;Demora 2ms

    clrf    letra        ;Coloca el título en el LCD
OTRA    movf    letra, 0    ;Letra actual -> W
    call    LINEA1        ;Obtiene el caracter a colocar desde la tabla
    call    DATO        ;Envía el caracter al LCD
    incf    letra, 1

    movf    letra, 0    ;Comprueba si ya envió los 16 caracteres del título
    sublw    d'16'
    btfss    CERO
    goto    OTRA        ;Si no llego a la letra 16 sigue enviando

    movlw    0xC0        ;Posiciona el cursor en la 2da. linea
    call    CONTROL
    movlw    d'1'
    call    DEMORA        ;Demora 1ms

    clrf    letra        ;Coloca el título en el LCD
OTRA2    movf    letra, 0    ;Letra actual -> W
    call    LINEA2        ;Obtiene el caracter a colocar desde la tabla
    call    DATO        ;Envía el caracter al LCD
    incf    letra, 1

    movf    letra, 0    ;Comprueba si ya envió los 16 caracteres del título
    sublw    d'16'
    btfss    CERO
    goto    OTRA2        ;Si no llego a la letra 16 sigue enviando

    call    VERINF        ;Coloca en el LCD la temp. inferior (de activación)
    call    VERSUP        ;Coloca en el LCD la temp. superior (de desactivación)

CICLO    bsf    ADGO        ;Inicia la conversión A/D
    btfsc    ADGO        ;Espera que termine de convertir
    goto    $ -1
    
    bsf    RP0        ;Pasa a página 1 (para acceder a los ocho bits bajos del resultado)
    movf    adres, 0    ;Resultado de conversión -> W
    bcf    RP0        ;Pasa a página 1

    movwf    buffer        ;Guarda el dato obtenido de ADRESL en el buffer temporal
    bcf    CARRY        ;Limpia el CARRY
    btfsc    adres, 0    ;Mira el bit menos significativo de ADRESH (Bit 8)
    bsf    CARRY        ;Si está en 1 pone en uno el carry
    rrf    buffer, 1    ;Hace desaparecer el bit 0 de ADRESL, mete el bit 0 de ADRESH por el 7 de ADRESL

    movf    menor, 0    ;Punto de activación -> W
    addlw    d'1'        ;Suma 1 a W
    subwf    buffer, 0    ;W = Temp. Actual - (Menor + 1)
    btfss    CARRY        ;Si dio negativo es porque la temp. medida es igual o menor al punto de activación
    bsf    RELE        ;Si dio negativo (si carry = 0) acciona el relé
    
    movf    mayor, 0    ;Punto de desactivación -> W
    subwf    buffer, 0    ;W = Temp. Actual - (Mayor)
    btfsc    CARRY        ;Si dio negativo es porque aún no alcanzó la temp. de desactivación
    bcf    RELE        ;Si dio positivo (si carry = 1) desactiva el relé

    movf    buffer, 0    ;Dato digitalizado -> W
    call    DECIMAL        ;Obtiene UNI, DEC y CEN con el agregado de 30h para la tabla ASCII
    
    movlw    0x8D        ;Coloca el cursor en la posición 0Dh de la pantalla.
    call    CONTROL

    movf    cen, 0        ;Coloca en el LCD las centenas
    call    DATO
    movf    dec, 0        ;Coloca las decenas
    call    DATO
    movf    uni, 0        ;Coloca las unidades
    call    DATO

    btfss    MINS        ;Mira el pulsador de incremento en temp. de activación
    call    SUBEMIN
    btfss    MINB        ;Mira el pulsador de decremento en temp. de activación
    call    BAJAMIN
    btfss    MAXS        ;Mira el pulsador de incremento en temp. de desactivación
    call    SUBEMAX
    btfss    MAXB        ;Mira el pulsador de decremento en temp. de desactivación
    call    BAJAMAX
    
    goto    CICLO        ;Vuelve a medir y mostrar

LINEA1    addwf    pcl, 1        ;Suma el contenido de W al contador de programa (para explorar la tabla)
    retlw    "T"
    retlw    "E"
    retlw    "M"
    retlw    "P"
    retlw    "E"
    retlw    "R"
    retlw    "A"
    retlw    "T"
    retlw    "U"
    retlw    "R"
    retlw    "A"
    retlw    ":"
    retlw    " "
    retlw    " "
    retlw    " "
    retlw    " "

LINEA2    addwf    pcl, 1        ;Suma el contenido de W al contador de programa (para explorar la tabla)
    retlw    " "
    retlw    " "
    retlw    " "
    retlw    " "
    retlw    " "
    retlw    " "
    retlw    b'01111111'    ;Flecha izquierda
    retlw    "-"
    retlw    "-"
    retlw    b'01111110'    ;Flecha derecha
    retlw    " "
    retlw    " "
    retlw    " "
    retlw    " "
    retlw    " "
    retlw    " "

SUBEMIN    incf    menor, 1    ;Suma 1 a la temp. de activación
    call    VERINF        ;Actualiza la información en el LCD
    btfss    MINS        ;Espera que suelte el pulsador
    goto    $ -1
    goto    SAVEMIN        ;Una vez que suelta la tecla va a guardar el parámetro
    
BAJAMIN    decf    menor, 1    ;Resta 1 a la temp. de activación
    call    VERINF        ;Actualiza la información en el LCD
    btfss    MINB        ;Espera que suelte el pulsador
    goto    $ -1
    
SAVEMIN    bsf    RP1        ;Pasa a página 2
    clrf    eeaddr        ;Direcciona el primer byte de la EEPROM
    movf    menor, 0
    movwf    eedata        ;Temp. Activación -> EEPROM
    call    EESAVE        ;Ejecuta la rutina de grabación
    bcf    RP1        ;Pasa a página 0
    goto    TIC        ;Va a hacer el TIC de teclado

SUBEMAX    incf    mayor, 1    ;Suma 1 a la temp. de desactivación
    call    VERSUP        ;Actualiza la información en el LCD
    btfss    MAXS        ;Espera que suelte el pulsador
    goto    $ -1
    goto    SAVEMAX        ;Una vez que suelta la tecla va a guardar el parámetro
    
BAJAMAX    decf    mayor, 1    ;Resta 1 a la temp. de desactivación
    call    VERSUP        ;Actualiza la información en el LCD
    btfss    MAXB        ;Espera que suelte el pulsador
    goto    $ -1
    
SAVEMAX    bsf    RP1        ;Pasa a página 2
    movlw    d'1'
    movwf    eeaddr        ;Direcciona el 2do. byte de la EEPROM
    movf    mayor, 0
    movwf    eedata        ;Temp. Activación -> EEPROM
    call    EESAVE        ;Ejecuta la rutina de grabación
    bcf    RP1        ;Pasa a página 0
    goto    TIC        ;Va a hacer el TIC de teclado
    
EESAVE    bsf    RP0        ;Pasa a página 3
    bsf    EEWREN        ;Habilita la escritura en la EEPROM
    movlw    0x55        ;Secuencia de seguridad
    movwf    eeaddr
    movlw    0xAA
    movwf    eeaddr
    bsf    EEWRITE        ;Inicia la grabación
    bcf    EEWREN        ;Deshabilita la escritura
    btfsc    EEWRITE        ;Espera que termine de grabar
    goto    $ -1
    bcf    RP0        ;Pasa a página 2
    return

TIC    bsf    BUZZER        ;Acciona el buzzer
    movlw    d'100'
    call    DEMORA        ;Deja sonar el buzzer durante 100ms
    bcf    BUZZER
    return
    
CONTROL    bcf    LCDRS        ;Pone en bajo la línea de modo del LCD (Control)
    goto    ENVIAR        ;Se saltea la sig. línea
DATO    bsf    LCDRS        ;Pone en alto la línea de modo del LCD (Dato)
ENVIAR    movwf    ptob        ;Coloca el dato o control a enviar en el bus del LCD
    movlw    d'1'
    call    DEMORA        ;Demora 1ms
    bsf    LCDE        ;Habilita el LCD
    movlw    d'1'
    call    DEMORA        ;Demora 1ms
    bcf    LCDE        ;Deshabilita el LCD
    movlw    d'1'
    call    DEMORA        ;Demora 1ms
    return

DECIMAL    movwf    uni        ;Convierte el dato presente en W en UNI, DEC y CEN
    clrf    dec
    clrf    cen
    movlw    d'100'        ;Determina la cant. de centenas
CENTENA    subwf    uni, 1
    btfss    CARRY
    goto    CIEN
    incf    cen, 1
    goto    CENTENA
CIEN    addwf    uni, 1
    movlw    d'10'        ;Determina la cant. de decenas
DECENA    subwf    uni, 1
    btfss    CARRY
    goto    DIEZ
    incf    dec, 1
    goto    DECENA
DIEZ    addwf    uni, 1        ;Uni queda con la cant. de unidades (sin decenas ni centenas)

    movlw    0x30        ;Le suma 30h a los valores de UNI, DEC y CEN para que queden en ASCII
    addwf    uni, 1
    addwf    dec, 1
    addwf    cen, 1
    return
    
DEMORA    movwf    tiempo2        ;Demora tantos milisegundos como valor en w
TOP2    movlw    d'110'
    movwf    tiempo1
TOP1    nop
    nop
    nop
    nop
    nop
    nop
    decfsz    tiempo1, 1
    goto    TOP1
    decfsz    tiempo2, 1
    goto    TOP2
    return

VERINF    movf    menor, 0    ;Temperatura de activación -> W
    call    DECIMAL        ;Obtiene UNI, DEC y CEN en formato ASCII
    movlw    0xC2        ;Posiciona el cursor en el tercer caracter de la 2da. línea
    call    CONTROL        ;para escribir el punto de activación
    movlw    d'1'
    call    DEMORA        ;Demora 1ms
    movf    cen, 0        ;Coloca en el LCD las centenas
    call    DATO
    movf    dec, 0        ;Coloca las decenas
    call    DATO
    movf    uni, 0        ;Coloca las unidades
    call    DATO
    return

VERSUP    movf    mayor, 0    ;Temperatura de desactivación -> W
    call    DECIMAL        ;Obtiene UNI, DEC y CEN en formato ASCII
    movlw    0xCB        ;Posiciona el cursor en el caracter 12 de la 2da. línea
    call    CONTROL        ;para escribir el punto de desactivación
    movlw    d'1'
    call    DEMORA        ;Demora 1ms
    movf    cen, 0        ;Coloca en el LCD las centenas
    call    DATO
    movf    dec, 0        ;Coloca las decenas
    call    DATO
    movf    uni, 0        ;Coloca las unidades
    call    DATO
    return
    
    org    0x2100        ;Guarda los parámetros por default en la EEPROM
    data    0x28        ;Punto de activación: 40 grados
    data    0x32        ;Punto de desactivación: 50 grados

    end
```

espero que me puedan ayudar, gracias


----------



## carmant (Ene 22, 2011)

Hola amigos, resulta que he armado el termostato con lcd de pablin y funciona corecto pero lo necesito para enfriar y lo he montado con relé normalmente abierto y uno de doble contacto no me cabe en la placa, Mi pregunta es si alguien me puede decir como cambiar algo en el codigo para que la patilla 15 RC4 en lugar de salir 1 salga 0, mis conocimientos en programación son casi nulos, Os lo agradeceria, gracias.
El codigo es el mismo que está ya posteado anteriormente.
P.D.: Si alguien necesita dibujo pcb me lo decis y lo posteo.


----------



## santiago26 (Mar 30, 2011)

kal00 dijo:


> Buen día amigos, tengo un problema que espero me puedan ayudar. Antes que nada es bueno decirles que no sé nada de microcontroladores.
> 
> Necesitaba un control de temperatura sencillo y funcional, encontré el de Pablin y me sentí satisfecho:
> 
> ...




Hola que tal? disculpa podes subir el archivo de simulacion del proteus? tengo unas dudas. muchas gracias!


----------



## ByAxel (Mar 30, 2011)

hola.
sucede que has definido (RP0, RP1), estos ya se encuentran definidos en el archivo "P16F870.INC" y por lo tanto no es necesario volverlos a escribir.

un saludo


----------



## carmant (Abr 5, 2011)

A ver si te sirve, yo lo he montado para un amigo y funciona muy bien.he cambiado algunas cosillas en el codigo para personalizarlo un poco.
Y de camino si alguien puede ayudarme, resulta que he montado este:http://s-o.webnode.cz/rvtg/ es termostato e higrometro que tambien funciona muy bien y es ideal para incubadoras pero en la pagina no entiendo muy bien como se completa el fichero asm. http://files.s-o.webnode.cz/200000058-238cc24864/ASMrvtg.txt?hash=080720081854 que solo contiene el encabezado, el hex si está completo y funcionando pero el texto que da el lcd creo que es está en checoslovaco, si me podeis tirar un cable de como se completa para yo intentar traducirlo, no se casi nada de programación, si lo suficiente para modificar algunas cosillas.
Mi incubadora lo necesita con urgencia que ya empieza la temporada de los pollitos.
Y si alguien le gusta y lo quiere armar tengo los pcb dibujados con pcwizard, ademas de montado y probado, os aseguro que va de maravilla, el mejor que he encontrado hasta ahora.
espero impaciente, gracias de antemano.
se me olvidaba este no he conseguido simularlo con proteus, solo me indica en el lcd el simbolo $ , si lguien lo simula por favor que me diga si le va bien.


----------



## humanides (Jun 16, 2012)

Buen día carmant (o cualquiera que me quiera dar una mano! )

estuve simulando el termostato de pablin (http://www.pablin.com.ar/electron/circuito/mc/termost/index.htm )
y no tuve problemas al ingresarle directamente el *.hex

Sin embargo cuadno le quise hacer algunas modificaciones básicas como lo que publicaste en:
https://www.forosdeelectronica.com/f24/problema-al-compilar-asm-errores-36643/

se me hizo imposible ensamblarlo, después decubrí que tampoco podía ensamblar el código fuente original que publica pablin y que es casi idéntico al tuyo (el tuyo tampoco lo puedo ensamblar).. aunque si he podido ensamblar otros códigos..

no se si me falta algún #INCLUDE o algo relacionado a las instrucciones del PIC (aunque tu *.asm no presenta nada así)... conozco de programación en muchos lenguajes pero no en asembler jeje

estoy usando el tasm y me tira el siguiente error al querer ensamblar (el tuyo)

c:\tasmx2\tasm\BIN>tasm /l /zi termo
Turbo Assembler  Version 4.1  Copyright (c) 1988, 1996 Borland International


```
Assembling file:   termo.ASM
*Warning* termo.ASM(17) Reserved word used as symbol: DEC
**Error** termo.ASM(26) Unknown character
**Error** termo.ASM(27) Unknown character
**Error** termo.ASM(28) Unknown character
**Error** termo.ASM(29) Unknown character
**Error** termo.ASM(30) Unknown character
**Error** termo.ASM(31) Unknown character
**Error** termo.ASM(32) Unknown character
**Error** termo.ASM(33) Unknown character
**Error** termo.ASM(34) Unknown character
**Error** termo.ASM(35) Unknown character
**Error** termo.ASM(36) Unknown character
**Error** termo.ASM(37) Unknown character
**Error** termo.ASM(38) Unknown character
**Error** termo.ASM(39) Unknown character
**Error** termo.ASM(40) Unknown character
**Error** termo.ASM(41) Unknown character
**Error** termo.ASM(42) Unknown character
**Error** termo.ASM(44) Illegal instruction for currently selected processor(s)
**Error** termo.ASM(45) Illegal instruction
**Error** termo.ASM(46) Illegal instruction
**Error** termo.ASM(47) Illegal instruction
**Error** termo.ASM(48) Illegal instruction
**Error** termo.ASM(49) Illegal instruction
**Error** termo.ASM(50) Illegal instruction
**Error** termo.ASM(51) Illegal instruction
**Error** termo.ASM(52) Illegal instruction for currently selected processor(s)
**Error** termo.ASM(53) Illegal instruction
**Error** termo.ASM(54) Illegal instruction
**Error** termo.ASM(55) Illegal instruction
**Error** termo.ASM(56) Illegal instruction
**Error** termo.ASM(57) Illegal instruction
**Error** termo.ASM(59) Illegal instruction
**Error** termo.ASM(60) Illegal instruction
**Error** termo.ASM(61) Illegal instruction
**Error** termo.ASM(63) Illegal instruction for currently selected processor(s)
**Error** termo.ASM(64) Illegal instruction
**Error** termo.ASM(65) Illegal instruction for currently selected processor(s)
**Error** termo.ASM(66) Illegal instruction for currently selected processor(s)
**Error** termo.ASM(67) Illegal instruction
**Error** termo.ASM(68) Illegal instruction
**Error** termo.ASM(69) Illegal instruction
**Error** termo.ASM(70) Illegal instruction
**Error** termo.ASM(71) Illegal instruction for currently selected processor(s)
**Error** termo.ASM(72) Illegal instruction for currently selected processor(s)
**Error** termo.ASM(73) Illegal instruction
**Error** termo.ASM(74) Illegal instruction
**Error** termo.ASM(75) Illegal instruction
**Error** termo.ASM(76) Illegal instruction
**Error** termo.ASM(78) Illegal instruction
**Error** termo.ASM(79) Undefined symbol: CONTROL
**Error** termo.ASM(80) Illegal instruction
**Error** termo.ASM(81) Undefined symbol: DEMORA
**Error** termo.ASM(82) Illegal instruction
**Error** termo.ASM(83) Undefined symbol: CONTROL
**Error** termo.ASM(84) Illegal instruction
**Error** termo.ASM(85) Undefined symbol: DEMORA
**Error** termo.ASM(86) Illegal instruction
**Error** termo.ASM(87) Undefined symbol: CONTROL
**Error** termo.ASM(88) Illegal instruction
**Error** termo.ASM(89) Undefined symbol: DEMORA
**Error** termo.ASM(90) Illegal instruction
**Error** termo.ASM(91) Undefined symbol: CONTROL
**Error** termo.ASM(92) Illegal instruction
**Error** termo.ASM(93) Undefined symbol: DEMORA
**Error** termo.ASM(95) Illegal instruction
**Error** termo.ASM(96) Illegal instruction
**Error** termo.ASM(97) Undefined symbol: LINEA1
**Error** termo.ASM(98) Undefined symbol: DATO
**Error** termo.ASM(99) Illegal instruction
**Error** termo.ASM(101) Illegal instruction
**Error** termo.ASM(102) Illegal instruction
**Error** termo.ASM(103) Illegal instruction
**Error** termo.ASM(104) Can't use this outside macro
**Error** termo.ASM(106) Illegal instruction
**Error** termo.ASM(107) Undefined symbol: CONTROL
**Error** termo.ASM(108) Illegal instruction
**Error** termo.ASM(109) Undefined symbol: DEMORA
**Error** termo.ASM(111) Illegal instruction
**Error** termo.ASM(112) Illegal instruction
**Error** termo.ASM(113) Undefined symbol: LINEA2
**Error** termo.ASM(114) Undefined symbol: DATO
**Error** termo.ASM(115) Illegal instruction
**Error** termo.ASM(117) Illegal instruction
**Error** termo.ASM(118) Illegal instruction
**Error** termo.ASM(119) Illegal instruction
**Error** termo.ASM(120) Can't use this outside macro
**Error** termo.ASM(122) Undefined symbol: VERINF
**Error** termo.ASM(123) Undefined symbol: VERSUP
**Error** termo.ASM(125) Illegal instruction
**Error** termo.ASM(126) Illegal instruction
**Error** termo.ASM(127) Extra characters on line
**Error** termo.ASM(129) Illegal instruction for currently selected processor(s)

**Error** termo.ASM(130) Illegal instruction
**Error** termo.ASM(131) Illegal instruction
**Error** termo.ASM(133) Illegal instruction
**Error** termo.ASM(134) Illegal instruction
**Error** termo.ASM(135) Illegal instruction
**Error** termo.ASM(136) Illegal instruction for currently selected processor(s)

**Error** termo.ASM(137) Illegal instruction
**Error** termo.ASM(139) Illegal instruction
**Error** termo.ASM(140) Too many errors or warnings
Error messages:    101
Warning messages:  1
Passes:            1
Remaining memory:  380k
```
muchas gracias por tu tiempo!


----------



## Eduardo (Jun 16, 2012)

humanides dijo:


> ...se me hizo imposible ensamblarlo, después decubrí que tampoco podía ensamblar el código fuente original que publica pablin y que es casi idéntico al tuyo (el tuyo tampoco lo puedo ensamblar).. aunque si he podido ensamblar otros códigos..
> no se si me falta algún #INCLUDE o algo relacionado a las instrucciones del PIC (aunque tu *.asm no presenta nada así)... conozco de programación en muchos lenguajes pero no en asembler jeje
> 
> estoy usando el tasm y me tira el siguiente error al querer ensamblar (el tuyo)
> ...



 El Turbo Assembler es para procesadores de la familia x86 no para PICs --> Bajate el MPLAB.


----------



## humanides (Jun 17, 2012)

Muchas gracias Eduardo!!
Era exactamente eso, no se porque me habían recomendado el tasm (cuando había aclarado que era para programar un PIC).. jeje

De cualquier manera gracias!
Saludos!


----------



## voltio (Ago 27, 2013)

carmant dijo:


> A ver si te sirve, yo lo he montado para un amigo y funciona muy bien.he cambiado algunas cosillas en el codigo para personalizarlo un poco.
> Y de camino si alguien puede ayudarme, resulta que he montado este:http://s-o.webnode.cz/rvtg/ es termostato e higrometro que tambien funciona muy bien y es ideal para incubadoras pero en la pagina no entiendo muy bien como se completa el fichero asm. http://files.s-o.webnode.cz/200000058-238cc24864/ASMrvtg.txt?hash=080720081854 que solo contiene el encabezado, el hex si está completo y funcionando pero el texto que da el lcd creo que es está en checoslovaco, si me podeis tirar un cable de como se completa para yo intentar traducirlo, no se casi nada de programación, si lo suficiente para modificar algunas cosillas.
> Mi incubadora lo necesita con urgencia que ya empieza la temporada de los pollitos.
> Y si alguien le gusta y lo quiere armar tengo los pcb dibujados con pcwizard, ademas de montado y probado, os aseguro que va de maravilla, el mejor que he encontrado hasta ahora.
> ...



Hola amigos, yo tambien he montado este circuito pero quisiera hacer un par de modificaciones al visor LCD , estas son que muestre al fina xxºC y que tire al inicio y de vez en cuando por ejemplo algun mensaje lo primero es lo mas importante.
SAludos a todos


----------



## carmant (Ago 27, 2013)

Hola, pues buscaré lo que tengo y lo revisaré.
A lo que te refieres es que en lugar de ºC te da un simbolo diferente?. eso creo que lo corregí en su momento y  traducido al castellano completamente.
El problema es que ya hace bastante tiempo de esto y no tenga placa donde probarlo pues en el simulador de proteus no conseguí que lo hiciera, si tu si puedes simularlo dime  como lo haces para probartelo y así asegurarme de que funciona y te lo envio.
Saludos.



voltio dijo:


> Hola amigos, yo tambien he montado este circuito pero quisiera hacer un par de modificaciones al visor LCD , estas son que muestre al fina xxºC y que tire al inicio y de vez en cuando por ejemplo algun mensaje lo primero es lo mas importante.
> SAludos a todos


----------



## voltio (Ago 27, 2013)

carmant dijo:


> Hola, pues buscaré lo que tengo y lo revisaré.
> A lo que te refieres es que en lugar de ºC te da un simbolo diferente?. eso creo que lo corregí en su momento y  traducido al castellano completamente.
> El problema es que ya hace bastante tiempo de esto y no tenga placa donde probarlo pues en el simulador de proteus no conseguí que lo hiciera, si tu si puedes simularlo dime  como lo haces para probartelo y así asegurarme de que funciona y te lo envio.
> Saludos.



hola amigo, lo quiero es que diga la temperatura con el signo por ej : 20ºC me explico ? lo tengo simulando en proteus 
gracias


----------



## carmant (Ago 27, 2013)

Perdona, entendí que el que habias montado era este http://s-o.webnode.cz/rthg-termostat/ y este tenia un problemilla de que no indicaba ºC que ya corregí hace tiempo y traduciendolo al Español. en el de pablin no puedo ayudarte, sería complicado.
Te sujiero que si puedes montes el checo que si que probé, es muy, muy bueno y me inspiró al diseño del mio propio escrito en C y que ya se está comercializando.
Saludos.




voltio dijo:


> hola amigo, lo quiero es que diga la temperatura con el signo por ej : 20ºC me explico ? lo tengo simulando en proteus
> gracias


----------



## D@rkbytes (Ago 27, 2013)

voltio dijo:


> lo que quiero es que diga la temperatura con el signo por ej : 20ºC me explico ? lo tengo simulando en proteus
> gracias


Lo que tienes que hacer para que muestre °C es lo siguiente ...
En esta línea de código se cambia la posición del cursor de la línea 1 donde se mostrará la temperatura...
movlw    0x8D        ;Coloca el cursor en la posición 8Dh de la pantalla.
Las posiciones de la línea 1 van desde 0x80 hasta 0x8F, así que asignas la posición donde quieras.

Para que se muestre la temperatura con °C tienes que modificar esta parte del código...

```
retlw    "T"
    retlw    "E"
    retlw    "M"
    retlw    "P"
    retlw    "E"
    retlw    "R"
    retlw    "A"
    retlw    "T"
    retlw    "U"
    retlw    "R"
    retlw    "A"
    retlw    ":"
    retlw    " "
    retlw    " "
    retlw    " "
    retlw    " "
```
Como TEMPERATURA: 020°C ocupa 18 espacios, tendrás que recortar la palabra por algo así...

```
retlw    "T"
    retlw    "E"
    retlw    "M"
    retlw    "P"
    retlw    ":"
    retlw    " "
    retlw    " "
    retlw    " "
    retlw    " "
    retlw    0xDF
    retlw    "C"
```
Y cambiar la posición del valor de la temperatura a la posición 7, por ejemplo así...
movlw    0x86        ;Coloca el cursor en la posición 86h de la pantalla.
Dónde 0F será el que mostrará el símbolo de °

Espero que con estos datos puedas realizar los cambios.

Suerte.


----------

