;*PROGRAMA PARA VISUALIZAR TEMPERATURA DE 0°c A 50°c
		LIST p=16F877A
		Include p16f877A.inc
	errorlevel -302,-305,-207
__config _WDT_OFF&_LVP_OFF&_XT_OSC&_CP_OFF&_PWRTE_ON&_BODEN_OFF






#define	Txd_pin PORTC,6	;Linea de transmicion
#define Rxd_pin PORTC,7 ;Línea de recepción
#define TRANSMISION		;Incluir sólo la rutina de transmisión
;#define OSC_4MHZ 


CLKIN	equ	.4000000	;Frecuencia del oscilador expresada en ciclos/segundo
BAUDIOS	equ	.1200		;Velocidad de transferencia
Cabecera	equ	.31		;Nº de bits de cabecera a transmitir 
N_bytes		equ	.3		;Nº de bytes a transmitir en la trama
Rep_N		equ	.4		;Valor de repetición de exploración de las entradas done
						;N representa eventos de 50mS cada uno

ID			equ	0xAA	;Valor de identificación (ID)
 

RFVAR		equ	0x20	;Inicio de variables (5) para las rutinas de transmisión
Temp		equ	0x30	;Variable para temporización
CRC			equ	0x31	;Variable para el cálculo del CRC
Buffer		equ	0x32	;Inicio del buffer de transmisión









CONTA	 EQU 0x40
DATOH 	EQU 0x42
DATOH1	EQU	0x57
DATOL 		EQU 0x43
CONTA1	Equ 0x44
REG0		EQU 0X45
REG1		EQU 0X46
CONT11	    EQU	0X47
CONT12 	EQU	0X48
CTH 	EQU	0X49
CTL 	EQU	0X50
VENT		EQU	0X051
MODU	EQU	0X052
MODU2	EQU	0X053
cont1	    EQU	0X54
cont2 	EQU	0X55
	cblock	60h
	  RESIDUO		
	  COCIENTE	
	  DECIMAL	
	  CONTADOR
	endc
	CBLOCK	70H

	ENDC			
	ORG 0
	goto INICIO
;	ORG 5



		




INICIO: 	
	bsf STATUS, RP0 ;Banco 1
	bcf STATUS,RP1
	movlw b'00001110'
	movwf ADCON1	;conf 1 canaL , Vref+= VDD y Vref-= VSS
 	MOVLW	B'00000001'
	MOVWF	TRISA
	MOVLW 0X88
	MOVWF TRISC
	MOVLW	0X0f
	MOVWF	TRISB
	
	MOVLW	H'00'
	MOVWF	TRISD

	MOVLW	H'FF'	;CONFIGURA COMO PWM
	MOVWF	PR2
	bcf STATUS, RP0 ;Banco 0



			movlw	ID
			movwf	Buffer		;Almacena ID en el buffer
			movlw	0x0d
			movwf	Buffer+2	;Fin de trama


;.................
	clrf CONTADOR
	movlw b'10000001'	;Usa el canal AN1, reloj  conver. Fosc/2
	movwf ADCON0 	 	;y enciende el ADC
xx:	call PAUSA 	 	;espera 30 µseg  el tiempo de adquisición
	bsf ADCON0,2 	 	;inicia conversión
ESPERA	
	btfsc ADCON0,2
	goto ESPERA	 	
   	movf ADRESH, W 	;Carga en W el Byte alto del resultado
	movwf DATOH		;resultado en reg. DATOH
	MOVWF	DATOH1
;**************************************
;RUTINA DE CONVERSION MATEMATICA Y LCD
	call 	MATH
	call 	DISPLAY
;**************************************
;RURINA DE TRANSMISION DE DATOS DE TEMPERATURA
			MOVF	DATOH1,0
			movwf	Buffer+1
			call	CRCGEN		;Calcula CRC
			call	TxD			;Transmite trama
			movlw	Rep_N
		;	call	Delay_v


;RUTINA PARA CONTROL DEL CALEFACCION
;**************************************

	CLRF	CCPR1L
	BCF		CCP1CON,CCP1X
	BCF		CCP1CON,CCP1Y
	MOVLW	0X04
	MOVWF	T2CON
	BSF		CCP1CON,CCP1M3
	BSF		CCP1CON,CCP1M2
; EN ESTE PUNTO LA SALIDA TIENE UN CICLO DE TRABAJO CT=0
	CLRF	CTL
;ESP0
	CLRF	CTH
;ESP0	BTFSC	PORT
;	CALL	INCRE
;ESP1 BTFSC	PORT
;	CALL	DECRE
;	MOVF	CTL,W
;	MOVWF	CCPR1L
	MOVLW	H'00'
	MOVWF	MODU

	MOVF	DATOH,W

	ADDWF	MODU,1
	MOVWF	DATOH
	COMF	MODU,1
	MOVF	MODU,W
	
	MOVWF	CCPR1L

;ACTUALIZANDO LA PARTE ALTA DE CT REAL

	MOVLW	H'CF'
	ANDWF	CCP1CON,1
	SWAPF	CTH,W

	IORWF	CCP1CON,1
; QUEDA ACTUALIZADA LA PARTE ALTA DE CT REAL
;	CALL PAU
		

;	GOTO	ESP0
;***************************************
;INCRE	INCF	CTL,1
;	BTFSS	STATUS,Z
;	RETURN
;	INCF	CTH,1
;	RETURN
;DECRE DECF	CTL,1
;	COMF	CTL,W
;	BTFSS	STATUS,Z
;	RETURN
;	DECF	CTH,1
;	RETURN
;**PAUSA DE 50 MILISEGUNDOSAPROX.

;RUTINA PARA LOS VENTILADORES
	MOVLW	D'194'
	MOVWF	VENT
	MOVF	DATOH,W
	SUBWF	VENT,1
	BTFSC	STATUS,Z
	BTFSS	STATUS,C
	BTFSS	STATUS,C
	GOTO	RA
	BCF	PORTC,1
	GOTO	PA
RA	BSF		PORTC,1

PA	MOVWF	DATOH




;NIVEL DE LIQUIDOS
;***************************************	

	
;ir	BTFSC PORTC,7
;	GOTO  VA
;	CALL d20ms
;	BTFSC PORTC,3
;	GOTO VAMOS
;	CALL d20ms
;	BTFSc PORTC,3
;	GOTO ir
;	BSF	PORTC,4
;	BCF	PORTC,0
;	GOTO yu
;VA	
;	CALL d20ms
;	btfss	PORTC,7		
;	goto ir
;	BCF	  PORTC,4
;	BSF	  PORTC,0
;	GOTO	yu
;	VAMOS
;	CALL d20ms
;	btfss PORTC,3
;	goto	ir	
 ;   BCF	  PORTC,4
;	BCF	  PORTC,0
;yu


;***************************************	

;***************************************************
;TER 
	
;	call 	MATH
;	call 	DISPLAY
	goto 	xx			;repite

;****************************************************
MATH:
		                                ;Multiplicar el valor obtenido  en ADRESH x05
	movf ADRESH,W
;	MOVLW	H'200'
	;MOVF	DATOH1,0
	movwf ACCaHI		;....Cargar multiplicador(05)
	movlw 0x05
	movwf ACCaLO
			;Llamar funcion multiplicacion(mpy_S)
	call mpy_S 	;..Dividir el valor obtenido ACCbHI y ACCbLO entre FFh	          
	movlw 0x00			;carga denominador=FFh
	movwf ACCaHI
	movlw 0xFF
	movwf ACCaLO
	call D_divS 		; llamar funcion dividir
	movf ACCbLO,w
	movwf COCIENTE 	;guarda cociente
	movf ACCcLO,w
	movwf RESIDUO		;...multiplicar residuo por 10
	movf RESIDUO,w
	movwf ACCaHI 		;mulitplicando
	movlw d'10'
	movwf ACCaLO 		;multiplicador
	call mpy_S
				;Retorna result en ACCbHI y ACCbLO
				;dividir REsiduo x10 entre 255
	movlw 0x00
	movwf ACCaHI
	movlw 0xFF
	movwf ACCaLO
	call D_divS
	movf ACCbLO,w
	movwf DECIMAL
	return
DISPLAY:
	CALL	LCD_Inicializa
;	call	LCD_DosEspaciosBlancos
	CALL	LCD_Linea1

	call	LCD_DosEspaciosBlancos
	MOVLW	'M'
	CALL	LCD_Caracter

	MOVLW	'O'
	CALL	LCD_Caracter
	MOVLW	'N'
	CALL	LCD_Caracter
	MOVLW	'I'
	CALL	LCD_Caracter
	MOVLW	'T'
	CALL	LCD_Caracter
	MOVLW	'O'
	CALL	LCD_Caracter
	MOVLW	'R'
	CALL	LCD_Caracter
	MOVLW	'E'
	CALL	LCD_Caracter
	MOVLW	'O'
	CALL	LCD_Caracter
	CALL	LCD_UnEspacioBlanco
	MOVLW	'U'
	CALL	LCD_Caracter
	MOVLW	'A'
	CALL	LCD_Caracter
	MOVLW	'P'
	CALL	LCD_Caracter





	CALL 	LCD_Linea2
	movf	COCIENTE,W
	call	TABLA
	CALL	LCD_Caracter
	movf	DECIMAL,W
	call	TABLA
	CALL	LCD_Caracter
	MOVLW	'C'
	CALL	LCD_Caracter
	MOVLW	'º'
	CALL	LCD_Caracter
	CALL	LCD_UnEspacioBlanco
	MOVLW	'T'
	CALL	LCD_Caracter
	MOVLW	'E'
	CALL	LCD_Caracter
	MOVLW	'M'
	CALL	LCD_Caracter
	MOVLW	'P'
	CALL	LCD_Caracter
	MOVLW	'E'
	CALL	LCD_Caracter
	MOVLW	'R'
	CALL	LCD_Caracter
	MOVLW	'A'
	CALL	LCD_Caracter
	MOVLW	'T'
	CALL	LCD_Caracter
	MOVLW	'U'
	CALL	LCD_Caracter
	MOVLW	'R'
	CALL	LCD_Caracter
	MOVLW	'A'
	CALL	LCD_Caracter	
	RETURN
	

;********************************************
;******************************************************************************
;CRCGEN Calcula el byte de CRC o checksum del contenido del buffer. La suma de 
;todos los bytes de ese buffer, incluído el propio CRC, debe dar 0x00 como
;resultado
;******************************************************************************

CRCGEN		clrf	CRC
			movlw	N_bytes-1
			movwf	Cont2		;Nº de bytes a chequear
			movlw	Buffer
			movwf	FSR			;Inicio del buffer
			movlw	0x00
CRCGEN_1	addwf	INDF,W		;Suma byte
			incf	FSR,F		;Siguiente byte
			decfsz	Cont2,F		;Ultimo byte
			goto	CRCGEN_1	;No
			subwf	CRC,W
			movwf	INDF
			retlw	0

;*****************************************************************************
;Bucle de temporización variable. A una frecuencia de trabajo de 4MHz,
;con un preescaler de 256, el TMR0 se carga con 195 (su complemento) por lo
;que desborda y pasa a 0 al de 50mS (195*256*1=20000uS). Esto se repite tantas
;veces como se indique en la variable Temp
;******************************************************************************
		
Delay_v		movwf	Temp
Delay_0		movlw	~.195
			movwf	TMR0		;El TMR0 se carga con 195	
Delay_1		movf	TMR0,W		
			btfss	STATUS,Z	;Desborda al de 50mS
			goto	Delay_1
			decfsz	Temp,F		;Se repite n veces
			goto	Delay_0
			retlw	0



				







;	movlw d'60'
;	movwf CONTA
;NEW: 
	
;	movf DECIMAL,W
;	call TABLA
;	movwf PORTB		;activacion de segmentos =unidades
;	bcf PORTC,6	;activacion de display
;	call DELAY
;	BSF	PORTC,5
;	BSF	PORTC,6
;	BSF	PORTC,7
;	movf COCIENTE,W
;	call TABLA
;	movwf PORTB		; activacion de decenas
;	bcf PORTC,7		; activacion de display
;	call DELAY
;	BSF	PORTC,5
;	BSF	PORTC,6
;	BSF	PORTC,7
;	movLW	0X9C
;	movwf PORTB		;activacion de centenas
;	bcf PORTC,5		;activacion de display
;	call DELAY
;	BSF	PORTC,5
;	BSF	PORTC,6
;	BSF	PORTC,7
;	decfsz CONTA,1
;	goto NEW
;	RETURN
DELAY1
	movlw 0xf1
	movwf REG0
X2	movlw 0xA
	movwf REG1
X1	decfsz REG1,1
	goto X1
	decfsz REG0,1
	goto X2
	return
;***************************************
PAUSA	movlw 0xFA
		movwf CONTA1
REP		decfsz CONTA1,1
		goto REP
		return 
PAU	CLRF	CONT12
	CLRF	CONT11
P1	DECFSZ	CONT11,1
	GOTO	P1
	DECFSZ	CONT12,1
	GOTO	P1
	RETURN
d20ms 	MOVLW d'5';(1) Carga dato N
	MOVWF cont1 ;(1) inicializa contador1 ciclo externo
rep1 MOVLW d'20' ;(1) Carga dato M
	MOVWF cont2 ;(1) inicializa contador2 ciclo interno
rep2 DECFSZ cont2,1 ;(1,2)Decrementa contador2 y escapa si cero
	GOTO rep2 ;(2) si no es cero, repite ciclo interno
	DECFSZ cont1,1 ;(1,2)Decrementa contador1 y escapa si cero
	GOTO rep1 ;(2) si no es cero repite ciclo externo
 RETURN ;(2) regresa de esta subrutina

;*************************

;**********************************************
TABLA	addwf PCL,1
	DT '0','1','2','3','4','5','6','7','8','9'
	INCLUDE pm_math.asm
	include	<RETARDOS.INC>
	INCLUDE	<LCD_4BIT16F877A.INC>
	INCLUDE 	"MANCHESTER.INC"	;Incluir rutinas de Transmisión/Recepción por RF
	end
