
;****************************
;*							*
;*							*
;*							*
;****************************
	;list	p=16f84a
	list	p=16f874a
	list	c=132
	title	"Cebador v1.0"
	radix	dec
	; include "p16f84a.inc"
	include "p16f874a.inc"
	ERRORLEVEL      -302    ;Bank Errors disabled, Boundary errors disabled
	;ERRORLEVEL      -302, -306    ;Bank Errors disabled, Boundary errors disabled

	;__CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF& _XT_OSC

	include "macros.asm"

	include "controlador.inc"


;****************************
;*							*
;*	Inicio					*
;*							*
;****************************
	; MAIN
	org 0
	goto	main

	; Rutina de sevicio de interrupciones
	org	4
intvec
	PUSH_MACRO

	btfsc	INTCON,	T0IF	; ¿Interrupcion de timer?
	call	ActualizaHora
	btfsc	PIR1,	ADIF	; ¿Interrupciion A/D?
	nop						; FALTA

	POP_MACRO

	retfie

;****************************
;*							*
;*	Modulos					*
;*							*
;****************************
	include "util.asm"
	include "ds1820.asm"
	include "lcd.asm"
	include "terminal.asm"

;****************************
;*							*
;*	Inicializaciones		*
;*							*
;****************************
Inicializa
	; Inicializamos los sensores como entradas
	bsf		STATUS, RP0							; register page 1

	bsf		SN1_PORT, SN1						; SN1 es entrada
	bsf		SN2_PORT, SN2						; SN1 es entrada
	bsf		SN3_PORT, SN3						; SN1 es entrada
	bsf		SN4_PORT, SN4						; SN1 es entrada

	bsf		SPH1_PORT, SPH1						; SPH1 es entrada

	bcf		STATUS, RP0							; register page 0

	; Inicializamos los actuadores como salidas
	bsf		STATUS, RP0							; register page 1

	bcf		LUCES_TRIS, LUCES_L1				; L1 es salida
	bcf		LUCES_TRIS, LUCES_L2				; L2 es salida
	bcf		LUCES_TRIS, LUCES_L3				; L3 es salida
	bcf		LUCES_TRIS, LUCES_L4				; L4 es salida

	bcf		TEMPERATURA_TRIS, TEMPERATURA_T1	; T1 es salida
	bcf		TEMPERATURA_TRIS, TEMPERATURA_T2	; T2 es salida

	bcf		PH_TRIS, PH_PH1						; PH1 es salida
	bcf		PH_TRIS, PH_PH2						; PH2 es salida

	bcf		NIVEL_TRIS, NIVEL_N1				; N1 es salida
	bcf		NIVEL_TRIS, NIVEL_N2				; N2 es salida

	bcf		OLEAJE_TRIS, OLEAJE_O1				; O1 es salida
	bcf		OLEAJE_TRIS, OLEAJE_O2				; O2 es salida
	bcf		OLEAJE_TRIS, OLEAJE_O3				; O3 es salida
	bcf		OLEAJE_TRIS, OLEAJE_O4				; O4 es salida

	bcf		CEBADOR_TRIS, CEBADOR_C1			; C1 es salida
	bcf		CEBADOR_TRIS, CEBADOR_C2			; C2 es salida

	bcf		BUZZER_TRIS, BUZZER					; BUZZER es salida

	bcf		STATUS, RP0							; register page 0

	; Recuperamos el estado de los actuadores de la EEPROM
	LEE_EEPROM_MACRO PUERTOB
	movwf	PORTB

	LEE_EEPROM_MACRO PUERTOB
	movwf	PORTC

	LEE_EEPROM_MACRO PUERTOB
	movwf	PORTD

	;****************************************
	;*										*
	;*	Inicializacion de los dispositivos	*
	;*										*
	;****************************************
	; Inicializacion del LCD	
	call	LcdInicializa

	clrf 	LCD_RESULT
	call	LcdDelay
	movlw	LCD_SET_DDRAM | LCD_ROW_0 | LCD_COL_0
	call	LcdWriteCommand

	; Inicializaciones para el timer
	movlw   MAXNTHS
	movwf   SEGUNDO_NTH

	movlw	1				; ponemos un 1 para que no empieze de cero
	movwf	TMR0

		; Preescaler a 1:16
	clrf 	INTCON
	BANKSEL	1
	movlw	0x03			; 1:16
	movwf	OPTION_REG
	BANKSEL	0

	bcf		INTCON, T0IF	; Limpiamos el flag de interrupcion del timer 0
	bsf		INTCON, T0IE	; Habilita las interrupciones del timer 0

	; Inicializaxccion del conversor A/D
	BANKSEL	1
	bcf		STATUS, RP1
	movlw	b'00000011'	; seleccion tipo puertos A/D (D D A A Vref A A A)
	movwf	ADCON1
	bsf		PIE1,	ADIE	; Habilitamos las interrupciones A/D

	BANKSEL	0
	movlw	b'10010001'	; FOSC/32 CHANNEL=2 A/D=ON
	movwf	ADCON0		;

	bcf		PIR1,	ADIF	; limpia flag de interrupcion A/D
	bsf		INTCON, PEIE	; Habilita las interrupciones de los perifericos

	; Inicializaciones del bus 1-wire

	; Hora
	movlw	0
	movwf	HORA

	movlw	0
	movwf	MINUTO

	movlw	0
	movwf	SEGUNDO

	movlw	255
	movwf	HORA_ANT
	movwf	MINUTO_ANT
	movwf	SEGUNDO_ANT

	; Inicializacion del primer dia de funcionamiento.
	; Si en LUZ1_HORA_ON tenemos un 0xff suponemos que
	; es la primera vez que enchufamos el controlador asi
	; que ponemos los valores por defecto
	LEE_EEPROM_MACRO LUZ1_HORA_ON
	subwf	0xff, W

	btfsc	STATUS, Z
	goto	inicializado

	; Ponemos los valores por defecto
	; hora
	ESCRIBE_EEPROM_MACRO HORA_EEPROM, HORA
	ESCRIBE_EEPROM_MACRO MINUTO_EEPROM, MINUTO
	ESCRIBE_EEPROM_MACRO SEGUNDO_EEPROM, SEGUNDO

	; temperatura
	movlw	25
	movwf	TMP1
	ESCRIBE_EEPROM_MACRO TEMPERATURA_MEDIA, TMP1
	movlw	1
	movwf	TMP1
	ESCRIBE_EEPROM_MACRO TEMPERATURA_MEDIA_RESTO, TMP1

	movlw	27
	movwf	TMP1
	ESCRIBE_EEPROM_MACRO MAX_TEMPERATURA, TMP1
	movlw	0
	movwf	TMP1
	ESCRIBE_EEPROM_MACRO MAX_TEMPERATURA_RESTO, TMP1
	movlw	0
	movwf	TMP1
	ESCRIBE_EEPROM_MACRO MAX_TEMPERATURA_SIGNO, TMP1

	movlw	24
	movwf	TMP1
	ESCRIBE_EEPROM_MACRO MIN_TEMPERATURA, TMP1
	movlw	0
	movwf	TMP1
	ESCRIBE_EEPROM_MACRO MIN_TEMPERATURA_RESTO, TMP1
	movlw	0
	movwf	TMP1
	ESCRIBE_EEPROM_MACRO MIN_TEMPERATURA_SIGNO, TMP1

	; ph
	movlw	62
	movwf	TMP1
	ESCRIBE_EEPROM_MACRO PH_MEDIO, TMP1
	movlw	68
	movwf	TMP1
	ESCRIBE_EEPROM_MACRO MAX_PH, TMP1
	movlw	56
	movwf	TMP1
	ESCRIBE_EEPROM_MACRO MIN_PH, TMP1

	; luces
	movlw	8
	movwf	TMP1
	ESCRIBE_EEPROM_MACRO LUZ1_HORA_ON, TMP1
	movlw	0
	movwf	TMP1
	ESCRIBE_EEPROM_MACRO LUZ1_MINUTO_ON, TMP1
	movlw	23
	movwf	TMP1
	ESCRIBE_EEPROM_MACRO LUZ1_HORA_OFF, TMP1
	movlw	0
	movwf	TMP1
	ESCRIBE_EEPROM_MACRO LUZ1_MINUTO_OFF, TMP1

	; cebadores
	movlw	22
	movwf	TMP1
	ESCRIBE_EEPROM_MACRO CEBADOR1_HORA_1, TMP1
	movlw	0
	movwf	TMP1
	ESCRIBE_EEPROM_MACRO CEBADOR1_MINUTO_1, TMP1

	; oleaje

	; Desactivamos los actuadores y grabamos en la EEPROM
	bcf		LUCES_PORT, LUCES_L1
	bcf		LUCES_PORT, LUCES_L2
	bcf		LUCES_PORT, LUCES_L3
	bcf		LUCES_PORT, LUCES_L4

	bcf		TEMPERATURA_PORT, TEMPERATURA_T1
	bcf		TEMPERATURA_PORT, TEMPERATURA_T2

	bcf		PH_PORT, PH_PH1
	bcf		PH_PORT, PH_PH2

	bcf		NIVEL_PORT, NIVEL_N1
	bcf		NIVEL_PORT, NIVEL_N2

	bcf		OLEAJE_PORT, OLEAJE_O1
	bcf		OLEAJE_PORT, OLEAJE_O2
	bcf		OLEAJE_PORT, OLEAJE_O3
	bcf		OLEAJE_PORT, OLEAJE_O4

	bcf		CEBADOR_PORT, CEBADOR_C1
	bcf		CEBADOR_PORT, CEBADOR_C2

	ESCRIBE_EEPROM_MACRO	PUERTOB, PORTB
	ESCRIBE_EEPROM_MACRO	PUERTOC, PORTC
	ESCRIBE_EEPROM_MACRO	PUERTOD, PORTD

inicializado
	; habilitamos las interrupciones
	bsf		INTCON, GIE		; habilitamos las interrupciones

	return

;****************************
;*							*
;*	MAIN					*
;*							*
;****************************
main
	call	Inicializa

	; Ponemos los separadores de la hora y la hora actual
	movlw	LCD_ROW_0
	addlw	LCD_COL_14
	iorlw   LCD_SET_DDRAM
	call    LcdWriteCommand
	movlw	':'
	call    LcdWriteData

	movlw	LCD_ROW_0
	addlw	LCD_COL_17
	iorlw   LCD_SET_DDRAM
	call    LcdWriteCommand
	movlw	':'
	call    LcdWriteData

	call	EscribeTiempoLCD

	; Pnemos la linea de temperatura
	movlw	LCD_ROW_1
	addlw	LCD_COL_0
	iorlw   LCD_SET_DDRAM
	call    LcdWriteCommand
	call	EscribeTemperatura

	; Pnemos la linea de pH
	movlw	LCD_ROW_1
	addlw	LCD_COL_14
	iorlw   LCD_SET_DDRAM
	call    LcdWriteCommand
	call	EscribePH

main_loop
	; Actualizamos la hora y la escribimos en el LCD (si es necesario)
	call	EscribeTiempoLCD		; ok (falta ajustar el desfase)

	; Comprobamos teclado
	;call	CompruebaMenu			; ok (faltan muuuuchos menus)
	;call	CompruebaTecla
	;call	SacaMenu

no_hay_teclado
	; Comprobamos temperatura
	call	CompruebaTemperatura	; ok (falta actualizar TEMPERATURA_MEDIA y TEMPERATURA_MEDIA_SIGNO en el menu)

	; Comprobamos pH
	call	CompruebaPH				; ok (falta actualizar PH_MEDIO en el menu y leer del sensor)

	; Comprobamos niveles de agua
	call	GetNiveles				; ok (falta comprobar)

	; Comprobamos la activacion/desactivacion de las luces
	call	CompruebaIluminacion	; ok (falta comprobar)

	; Comprobamos las horas de cebado
	call	CompruebaCebado			; ok (falta comprobar)

	; Comporbamos la generacion de olas
	call	CompruebaOleaje			; FALTA

	; Guardamos los valores de los actuadores
	ESCRIBE_EEPROM_MACRO	PUERTOB, PORTB
	ESCRIBE_EEPROM_MACRO	PUERTOC, PORTC
	ESCRIBE_EEPROM_MACRO	PUERTOD, PORTD

	; vuelta a empezar
	goto	main_loop

	end;














