;***********************************************************************************************
; Ремонт помпы
; Автор: Андрей Сахненко, г. Одесса 
; 
; PORTA:
; RA0- xx	pin17	не подключен
; RA1- IN	pin18	контроль входного напряжения 24В
; RA2- xx	pin1	не подключен
; RA3- xx	pin2	не подключен
; RA4- IN	pin3	кнопка принудительного включения	
; RA5- MCLR	pin4	сброс 
; RA6- OUT	pin15	управлние мотором
; RA7- OUT	pin16	управление LED 

; PORTB:
; RB0- IN	pin6 bit0	енкодер 1 время работы
; RB1- IN	pin7 bit3	енкодер 1 время работы
; RB2- IN	pin8 bit1	енкодер 1 время работы
; RB3- IN	pin9 bit2	енкодер 1 время работы

; RB4- IN	pin10 bit0	енкодер 2 время паузы
; RB5- IN	pin11 bit3	енкодер 2 время паузы
; RB6- IN	pin12 bit1	енкодер 2 время паузы
; RB7- IN	pin13 bit2	енкодер 2 время паузы

            LIST	p=16F628A	; Определение типа микроконтроллера.
      	include "P16f628A.inc"	;03F18H Биты конфигурации
            __CONFIG	_MCLRE_ON & _INTRC_OSC_NOCLKOUT & _BODEN_ON & _BOREN_OFF & _CP_OFF & DATA_CP_OFF & _PWRTE_OFF & _WDT_OFF & _LVP_OFF 
   	errorlevel  -302 
	cblock  0x20

	Reg_1
	Reg_2
	Reg_3
	endc
; Регистры читаемые в любом банке
	cblock  0x70
	W_temp
	S_temp
	Timer_05sek		;  количество отсчетов по 0,5 сек
	Timer_1min		;  количество отсчетов по 1 минуте
	Timer_30min		;  количество отсчетов по 30 мин
	Flag		;
	endc

; Запись в память EEPROM  установки по умолчанию
	org        2100h 	; Разрешение записи в память директивой DE 
	DE	.120	; Timer_05sek = 120
	DE	.1	; Timer_1min  = 1		
	DE	.1	; Timer_30min = 1
	DE	.0	; Flag = 0
;===============================================================================================
	org	.0
	goto	INIT_MK 
	org	.4
;sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss
; П/П ПРЕРЫВАНИЯ
;ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss
	movwf	W_temp	
	movf	STATUS,W
	clrf	STATUS	; банк 0
	movwf	S_temp
	; Прерывание по переполнению TMR1 цикл 500ms
	bsf	PORTA,2
            clrf       T1CON	; Остановть TMR1
	movlw	0x0c	;
            movwf	TMR1H
	movlw	0xDE	;
            movwf	TMR1L
	movlw	b'00110001'; Старт TMR1, делитель 1:8, тактирование Fosc/4
            movwf       T1CON
	bcf	PORTA,2
;----------------управление светодиодом----------------------------
BLINKER
	btfsc	Flag,0	; если "пауза" то LED просто горит
	bsf	PORTA,7	; ON
	btfsc	Flag,0	; если "работа" то LED мигает
	goto	TIMER_MIN
	rlf	PORTA,W
	btfsc	STATUS,C
	bcf	PORTA,7	;OFF
	btfss	STATUS,C
	bsf	PORTA,7	; ON
;----------------------отсчет 1 минуты--------------------------
TIMER_MIN
	decfsz	Timer_05sek,F
	goto	OUT
	movlw	.120
	movwf	Timer_05sek
;----------------------отсчет единиц минут--------------------------
	decfsz	Timer_1min,F
	goto	OUT
	btfss	Flag,0	; если "работа" то 
	goto	PAUSE_INT	; переход к загрузке "паузы"
;------------------продолжение отсчета "пауза"---------------------- 
	movlw	.30
	movwf	Timer_1min
	decfsz	Timer_30min,F
	goto	OUT

WORK_INT	call	WORK	; загрузка таймера "работа"
	goto	OUT

PAUSE_INT	call	PAUSE	; загрузка таймера "пауза"
	goto	OUT

; Восстановление контекста перед выходом из прерывания.
OUT
	bcf	 PIR1,0	; Сброс флага переполнения TMR1

	movf	S_temp,W
	movwf	STATUS
	movf	W_temp,W
	retfie		; Выход.
;---------------дешифратор времени--"работы"---------или-------"паузы"--------------
TAB_ENC	addwf	PCL,F	; шаг 1 мин		шаг 30 мин
	retlw	.15	; 
	retlw	.14	; 
	retlw	.7	; 
	retlw	.6	; 
	retlw	.13	; 
	retlw	.12	; 
	retlw	.5	; 
	retlw	.4	; 
	retlw	.11	; 
	retlw	.10	; 
	retlw	.3	;
	retlw	.2	;
	retlw	.9	;
	retlw	.8	;
	retlw	.1	; 
	retlw	.0	; 


;-----------------------------------------------------------------
INIT_MK
       	bcf         STATUS,RP0  ; Подтверждение установки
            bcf         STATUS,RP1  ; "0"-го банка.
            clrf	PORTA       ; 
            clrf        PORTB       ; -/-

            bsf	STATUS,RP0  ; Переход в 1-й банк.
            movlw	b'00110010' ; RA5,RA4, RA1 работает "на вход",
            movwf	TRISA       ; остальные на выход.
            movlw       B'11111111'
            movwf       TRISB       ;  вход 
            movlw	b'00001011' ; делитeль перед WDT 1:8
            movwf	OPTION_REG     ; подтягивающие резисторы порта В включены.
	movlw	b'00000001'
	movwf	PIE1	; Разрешение прерывания по переполнению TMR1

            bcf	STATUS,RP0  ; Переход в 0-й банк.
            movlw	.07         ; Отключение компараторов.
            movwf	CMCON       ; --------"--------
	movlw	b'00110001'	;  TMR1 включен, делитель 1:8, тактирование Fosc/4
            movwf       T1CON
;-------------------очистка регистров общего назначения с 0х20 по 0х7F---------------
	movlw	0x20	;initialize pointer
	movwf	FSR	;to RAM
NEXT
	clrf	INDF	;clear INDF register
	incf	FSR,F	;inc pointer
	btfss	FSR,7	;all done?
	goto	NEXT	;NO, clear next
;-------------стартовая загруза регистров таймеров-------------------
            bsf	STATUS,RP0  ; Переход в 1-й банк.
	clrf	EEADR
	bsf 	EECON1,RD 	;EE Read
	movf 	EEDATA,W 	;Move data to W
	movwf	Timer_05sek

	incf	EEADR,F
	bsf 	EECON1,RD 	;EE Read
	movf 	EEDATA,W 	;Move data to W
	movwf	Timer_1min

	incf	EEADR,F
	bsf 	EECON1,RD 	;EE Read
	movf 	EEDATA,W 	;Move data to W
	movwf	Timer_30min

	incf	EEADR,F
	bsf 	EECON1,RD 	;EE Read
	movf 	EEDATA,W 	;Move data to W
	movwf	Flag
            bcf	STATUS,RP0  ; Переход в 0-й банк.	

	btfsc	Flag,0	;какой режим был перед выключением?
	goto	MAIN	; режим "пауза"
	bsf	PORTA,6	; "работа" включить двигатель


;===========================================================
MAIN
            movlw       B'11000000'	; Разрешить прерывания
            movwf       INTCON

;--------------проверка питания 24В--------------------------

	btfsc	PORTA,1	
	goto	U_NORM
;	goto	U_OFF


;----------напряжение питания низкое, или отключено------------
U_OFF			; включаем энергосберегающий режим работы
	bcf	T1CON,0	; остановить TMR1
	clrf	INTCON	; запретить прерывания
	bcf	PORTA,6	; отключаем двигатель
	bsf	OPTION_REG,7 ; отключить PULLUP
	bcf	PORTA,7	; отключить светодиод

; сохранить значения счетчиков паузы и работы в EEPROM 
            bsf	STATUS,RP0  ; Переход в 1-й банк.
	clrf	EEADR
WRITE_05
	movf	Timer_05sek,W
	movwf	EEDATA
	call	EEWRITE
	movf	Timer_05sek,W
	bsf 	EECON1,RD 	;EE Read
	subwf	EEDATA,W
	btfss	STATUS,Z
	goto	WRITE_05


	incf	EEADR,F
WRITE_1	movf	Timer_1min,W
	movwf	EEDATA
	call	EEWRITE
	movf	Timer_1min,W
	bsf 	EECON1,RD 	;EE Read
	subwf	EEDATA,W
	btfss	STATUS,Z
	goto	WRITE_1


	incf	EEADR,F
WRITE_30	movf	Timer_30min,W
	movwf	EEDATA
	call	EEWRITE
	movf	Timer_30min,W
	bsf 	EECON1,RD 	;EE Read
	subwf	EEDATA,W
	btfss	STATUS,Z
	goto	WRITE_30

	incf	EEADR,F
WRITE_FL	movf	Flag,W
	movwf	EEDATA
	call	EEWRITE
	movf	Flag,W
	bsf 	EECON1,RD 	;EE Read
	subwf	EEDATA,W
	btfss	STATUS,Z
	goto	WRITE_FL

            bcf	STATUS,RP0  ; Переход в 0-й банк.

; пауза 50сек (за это время питание МК должно полностью сесть на 0)
loop
	decfsz      Reg_1,F
            goto        loop
            decfsz      Reg_2,F
            goto        loop
	rlf	PORTA,W
	btfsc	STATUS,C
	bcf	PORTA,7	;OFF
	btfss	STATUS,C
	bsf	PORTA,7	; ON
            decfsz      Reg_3,F
            goto        loop

	goto	INIT_MK	; перегружаем МК

;-------------------напряжение питания в норме-----------------
U_NORM
	; антидребезговая задержка опроса кнопки
	decfsz	Reg_1,F
	goto	MAIN
;-------------------проверка кнопки---------------------------
	btfss	PORTA,4	; Кнопка нажата?
	goto	KNPKA_OTP	; кнпка опущена возврат на круги своя
	; кнопка нажата, берем значения енкодера
	btfsc	Flag,1	; Кнопка была нажата?
	goto	OUT_KN	; нажатие уже обработано
	; кнопка нажата впервые
	clrf	INTCON	; запретить прерывания
            clrf       T1CON	; Остановть TMR1
	movlw	0x0E	;
            movwf	TMR1H
	movlw	0x00	;
            movwf	TMR1L

 	btfsc	Flag,0	;Какая операция следующая?
	goto	WORK_KN
;	goto	PAUSE_KN
PAUSE_KN
	call	PAUSE	; операция "ПАУЗА" 
	goto	OUT_KN
WORK_KN
	call	WORK	; операция "РАБОТА"
	goto	OUT_KN

KNPKA_OTP
	bcf	Flag,1	; Кнопка отпущена
	goto	MAIN
OUT_KN	
	movlw	b'00110001'; Старт TMR1, делитель 1:8, тактирование Fosc/4
            movwf       T1CON
	bsf	Flag,1	; Кнопка нажата
	goto	MAIN

;------------------------------------------------------------
; Запись значения EEDATA в память EEPROM, по адресу "00".
EEWRITE
	bsf 	EECON1,WREN ; Enable write
	movlw 	55h 	; Unlock write
	movwf 	EECON2 	;
	movlw 	0AAh 	;
	movwf 	EECON2 	;
	bsf 	EECON1,WR 	; Start the write
	bcf 	STATUS,RP0 	; Bank 0
M1	btfss	PIR1,7
	goto	M1
	bcf	PIR1,7
	bsf	STATUS,RP0	; Bank 1
	bcf 	EECON1,WREN ; запретить случайную запись 
	retlw	0
;---------------------операция "РАБОТА"------------------
WORK	
	bsf	PORTA,6	; включить двигатель
	bcf	Flag,0	; выполняетсяя операция "РАБОТА"
	movlw	.120
	movwf	Timer_05sek
	movf	PORTB,W
	andlw	b'00001111'
	call	TAB_ENC
	movwf	Timer_1min
	incf	Timer_1min,F
	retlw	0
;---------------------операция "ПАУЗА"-------------------
PAUSE
	bcf	PORTA,6	; выключить двигатель
	bsf	Flag,0	; выполняетсяя операция "ПАУЗА"
	swapf	PORTB,W
	andlw	b'00001111'
	call	TAB_ENC
	movwf	Timer_30min
	incf	Timer_30min,F
	movlw	.30
	movwf	Timer_1min
	retlw	0

	end



