;**********************************************************************
;   This file is a basic code template for assembly code generation   *
;   on the PICmicro PIC16F874. This file contains the basic code      *
;   building blocks to build upon.                                    *  
;                                                                     *
;   If interrupts are not used all code presented between the ORG     *
;   0x004 directive and the label main can be removed. In addition    *
;   the variable assignments for 'w_temp' and 'status_temp' can       *
;   be removed.                                                       *                         
;                                                                     *
;   Refer to the MPASM User's Guide for additional information on     *
;   features of the assembler (Document DS33014).                     *
;                                                                     *
;   Refer to the respective PICmicro data sheet for additional        *
;   information on the instruction set.                               *
;                                                                     *
;   Template file assembled with MPLAB V4.00 and MPASM V2.20.00.      *
;                                                                     *
;**********************************************************************
;                                                                     *
;    Filename:	    xxx.asm                                           *
;    Date:                                                            *
;    File Version:                                                    *
;                                                                     *
;    Author:                                                          *
;    Company:                                                         *
;                                                                     * 
;                                                                     *
;**********************************************************************
;                                                                     *
;    Files required:                                                  *
;                                                                     *
;                                                                     *
;                                                                     *
;**********************************************************************
;                                                                     *
;    Notes:                                                           *
;                                                                     *
;                                                                     *
;                                                                     *
;                                                                     *
;**********************************************************************


	list      p=16f876            ; list directive to define processor
	#include <p16f876.inc>        ; processor specific variable definitions
	
	__CONFIG _CP_OFF & _WDT_ON & _BODEN_OFF & _PWRTE_ON & _HS_OSC & _WRT_ENABLE_OFF & _LVP_ON & _DEBUG_OFF & _CPD_OFF 

; '__CONFIG' directive is used to embed configuration data within .asm file.
; The lables following the directive are located in the respective .inc file.
; See respective data sheet for additional information on configuration word.








;**********************************************************************
		ORG     0x000             ; processor reset vector
		clrf    PCLATH            ; ensure page bits are cleared
  		goto    main              ; go to beginning of program
;**********************************************************************
; Обрабитчик прерываний

		ORG     0x004          		  ; interrupt vector location
		movwf   w_temp          	  ; save off current W register contents
		movf	STATUS,w        	  ; move status register into W register
		movwf	status_temp    		  ; save off contents of STATUS register
		MOVF PCLATH, W 			  ; Only required if using pages 1, 2 and/or 3
		MOVWF PCLATH_TEMP	  	  ; Save PCLATH into W
		bcf	STATUS,RP0      	  ; ensure file register bank set to 0
		bcf	STATUS,RP1      	  ; ensure file register bank set to 0
;***** Протестировать флаги прерывания
	PAGESEL _TMR2			; ВЫБЕРЕМ ПЕРВУЮ СТРАНИЦУ ПРОГРАМНОЙ ПАМЯТИ

	btfsc PIR1,TMR2IF 		; Протестировать бит флага TMR2IF
	goto _TMR2

	btfsc PIR1,TMR1IF 		; Протестировать бит флага TMR2IF
	goto _TMR1


	GOTO end_int

;------------------------------------------------------------------------------------------------------------------------
_TMR2		BCF PIR1,TMR2IF			; Установить бит флага в 0 TMR2


	GOTO end_int
;------------------------------------------------------------------------------------------------------------------------
_TMR1		BCF PIR1,TMR1IF			; Установить бит флага в 0 TMR1
	MOVLW H'79'
	MOVWF TMR1L		; ЗАПИШИМ НАЧАЛЬНЫЕ ПРЕДУСТАНОВКИ ТАЙМЕРА 1
	MOVLW H'EC'
	MOVWF TMR1H		; ЗАПИШИМ НАЧАЛЬНЫЕ ПРЕДУСТАНОВКИ ТАЙМЕРА 1
	INCF TIMER,1		; УВЕЛИЧИМ СЧЕТЧИК НА 1.ТАЙМЕР РЕАЛЬНОГО ВРЕМЕНИ
;___________________
			MOVLW 7		; ПРОВЕРИМ РАВЕНСТВО ВРЕМЕНИ 15,5 С
			XORWF TEST_TIMER,0	; 
			BTFSS STATUS,Z
			GOTO NOT_
				MOVLW 150
				XORWF TIMER,0	; 
				BTFSS STATUS,Z
				GOTO NOT_
				; ВРЕМЯ ПОДОШЛО, ПОРА ВКЛЮЧАТЬ ПОРТЫ
					BSF PORTC,0		; ЗАРЯДКА ОКОНЧЕНА. ВКЛЮЧИМ ПОРТ
					BSF PORTC,1		; ЗАРЯДКА ОКОНЧЕНА. ВКЛЮЧИМ ПОРТ
					BSF PORTC,2		; ЗАРЯДКА ОКОНЧЕНА. ВКЛЮЧИМ ПОРТ
					BSF PORTC,3		; ЗАРЯДКА ОКОНЧЕНА. ВКЛЮЧИМ ПОРТ
;___________________
NOT_		MOVLW 200			; ТАЙМЕР РЕАЛЬНОГО ВРЕМЕНИ С ДИСКРЕТНОСТЬЮ 0.01 С. МАКСИМАЛЬНЫМ ЧИСЛОМ 1.99 С.
		XORWF TIMER,0
		BTFSS STATUS,Z			; ЕСЛИ ТАЙМЕР РАВЕН 2.00 С ТО СБРОСИМ ЕГО.
		GOTO end_int		
			CLRF TIMER
				INCF TEST_TIMER,1	; УВЕЛИЧИМ НА 1 ТЕСТ ТАЙМЕР
				MOVLW 8
				XORWF TEST_TIMER,0	; ПРОВЕРИМ РАВЕНСТВО ТАЙМЕРА 8, ТО ЕСТЬ 16С.
				BTFSS STATUS,Z
				GOTO NOT_1
					CLRF TEST_TIMER		; ОЧИСТИМ ТАЙМЕР
					BTFSC OFF_CHAND,0	; ПРОВЕРИМ, ОКОНЧЕНА ЛИ ЗАРЯДКА
					BSF OFF_CHAND,4		; ПОСТАВИМ ФЛАГ, ЧТО ПОРА ТЕСТИРОВАТЬ НАПРЯЖЕНИЕ ПОСЛЕ ЗАРЯДКИ
					BTFSC OFF_CHAND,1	; ПРОВЕРИМ, ОКОНЧЕНА ЛИ ЗАРЯДКА
					BSF OFF_CHAND,5		; ПОСТАВИМ ФЛАГ, ЧТО ПОРА ТЕСТИРОВАТЬ НАПРЯЖЕНИЕ ПОСЛЕ ЗАРЯДКИ
					BTFSC OFF_CHAND,2	; ПРОВЕРИМ, ОКОНЧЕНА ЛИ ЗАРЯДКА
					BSF OFF_CHAND,6		; ПОСТАВИМ ФЛАГ, ЧТО ПОРА ТЕСТИРОВАТЬ НАПРЯЖЕНИЕ ПОСЛЕ ЗАРЯДКИ
					BTFSC OFF_CHAND,3	; ПРОВЕРИМ, ОКОНЧЕНА ЛИ ЗАРЯДКА
					BSF OFF_CHAND,7		; ПОСТАВИМ ФЛАГ, ЧТО ПОРА ТЕСТИРОВАТЬ НАПРЯЖЕНИЕ ПОСЛЕ ЗАРЯДКИ
NOT_1				BTFSC CHAND,0
				INCF TIMER_0,1		;УВЕЛИЧИМ ТАЙМЕР НА 1 0-КАНАЛА
				BTFSC CHAND,1
				INCF TIMER_1,1		;УВЕЛИЧИМ ТАЙМЕР НА 1 1-КАНАЛА
				BTFSC CHAND,2
				INCF TIMER_2,1		;УВЕЛИЧИМ ТАЙМЕР НА 1 2-КАНАЛА
				BTFSC CHAND,3
				INCF TIMER_3,1		;УВЕЛИЧИМ ТАЙМЕР НА 1 3-КАНАЛА
;*************************
;________________________________
	MOVLW 120
	XORWF TIMER_0,0		; СРАВНИМ ЗНАЧЕНИЕ ТАЙМЕРА С 120, ТО ЕСТЬ 4 МИН
	BTFSS STATUS,Z
	GOTO CH_1
		CLRF TIMER_0		; ОЧИСТИМ ТАЙМЕР ВРЕМЕНИ
		BTFSC FIST_CHAND,0	; ПРОВЕРИМ, ПЕРВЫЙ ЛИ ПУСК ЗАРЯДКИ
		GOTO SKIP0
		BSF FIST_CHAND,0	; ПОСТАВИМ ФЛАГ ТОГО, ЧТО ПЕРВЫЙ ПУСК ПРОШЕЛ
MEMO_0		MOVF CHANEL_0L,0
		MOVWF M_CHANEL_0L	; ЗАПОМНИМ ЗНАЧЕНИЕ НАПРЯЖЕНИЯ
		MOVF CHANEL_0H,0
		MOVWF M_CHANEL_0H	; ЗАПОМНИМ ЗНАЧЕНИЕ НАПРЯЖЕНИЯ
;		CLRF END_CH0		; ОЧИСТИМ СЧЕТЧИК
		GOTO CH_1
SKIP0				INCF END_TIMER_0,1 	;УВЕЛИЧИМ ТАЙМЕР ОТСЧЕТА ВРЕМЕНИ ОКОНЧАТЕЛЬНОЙ ЗАРЯДКИ НА 1
				MOVLW TIM
				XORWF END_TIMER_0,0	; СРАВНИМ ЗНАЧЕНИЕ ТАЙМЕРА ОКОНЧАНИЯ ЗАРЯДКИ С КОНСТАНТОЙ
				BTFSC STATUS,Z		; 
				BSF FLAG_END_TIMER,0	; ЕСЛИ ТАЙМЕРЫ РАВНЫ, ТО ПОСТАВИМ ФЛАГ "ВРЕМЯ ВЫШЛО"
				BTFSC STATUS,Z
				GOTO OFF_CH_0		; ЕСЛИ ТАЙМЕРЫ РАВНЫ, ТО ВЫКЛЮЧИМ ЗАРЯДКУ
			MOVF CHANEL_0H,0
			SUBWF M_CHANEL_0H,0	; ВЫЧТИМ ИЗ ЗАПОМНЕНОГО ЗНАЧЕНИЯ ТЕКУШЕЕ
			BTFSC STATUS,Z		; СРАВНИМ СТАРШИЕ БАЙТЫ
			GOTO MIN_L0		; СТАРШИЕ БАЙТЫ РАВНЫ, ПРОВЕРИМ МЛАДШИЕ		
			BTFSC STATUS,C		; ЕСЛИ РЕЗУЛЬТАТ ПОЛОЖИТЕЛЕН, ТО УЖЕ ДАВНО ПОРА ВЫКЛЮЧИТЬ ЗАРЯДКУ
			GOTO OFF_CH_0
		; ВСЕ НОРМАЛЬНО, ЗАРЯДКА ИДЕТ ДАЛЬШЕ
				GOTO MEMO_0		; ОБНОВИМ ЗНАЧЕНИЯ НАПРЯЖЕНИЯ
MIN_L0					MOVF CHANEL_0L,0
					SUBWF M_CHANEL_0L,0	; ВЫЧТИМ ИЗ ЗАПОМНЕНОГО ЗНАЧЕНИЯ ТЕКУШЕЕ
					BTFSC STATUS,Z		; СРАВНИМ МЛАДШИЕ БАЙТЫ
					GOTO MEMO_0		; ВСЕ НОРМАЛЬНО, ЗАРЯДКА ИДЕТ ДАЛЬШЕ.ОБНОВИМ ЗНАЧЕНИЯ НАПРЯЖЕНИЯ
					BTFSS STATUS,C		; ЕСЛИ РЕЗУЛЬТАТ ОТРИЦАТЕЛЕН ИЛИ РАВНЫ, ТО ЗАРЯДКА ИДЕТ ДАЛЬШЕ
								; ПОЛОЖИТЕЛЕН, ТО ПРЕРАТИТЬ ЗАРЯДКУ
					GOTO MEMO_0		; ОБНОВИМ ЗНАЧЕНИЯ НАПРЯЖЕНИЯ
;_____________________________________________________________________________________
; В этом месте счетчик падения напряжения на аккумуляторе.
	INCF END_CH0,1		; УВЕЛИЧИМ СЧЕТЧИК НА 1
	MOVLW 2
	XORWF END_CH0,0		; СРАВНИМ СЧЕТЧИК С 2
	BTFSC STATUS,Z
	GOTO OFF_CH_0		; ЕСЛИ СЧЕТЧИК РАВЕН ДВУМ, ТО ВЫКЛЮЧИМ ЗАРЯДКУ
		MOVF CHANEL_0L,0
		MOVWF M_CHANEL_0L	; ЗАПОМНИМ ЗНАЧЕНИЕ НАПРЯЖЕНИЯ
		MOVF CHANEL_0H,0
		MOVWF M_CHANEL_0H	; ЗАПОМНИМ ЗНАЧЕНИЕ НАПРЯЖЕНИЯ
		GOTO CH_1
;_____________________________________________________________________________________
OFF_CH_0					CLRF END_CH0		; ОЧИСТИМ СЧЕТЧИК
						BSF OFF_CHAND,0		; ПОСТАВИМ ФЛАГ ОКОНЧАНИЯ ЗАРЯДКИ
						BCF CHAND,0		; УБЕРЕМ ФЛАГ НАЛИЧИЯ ЗАРДКИ
						BCF PORTC,0		; ВЫКЛЮЧИМ ИСТОЧНИК ТОКА.
						CLRF TIMER_0		; ОЧИСТИМ ТАЙМЕР ВРЕМЕНИ
						CLRF END_TIMER_0	; ОЧИСТИМ ТАЙМЕР ОКОНЧАНИЯ ЗАРЯДКИ				
;________________________________
CH_1	MOVLW 120
	XORWF TIMER_1,0		; СРАВНИМ ЗНАЧЕНИЕ ТАЙМЕРА С 120, ТО ЕСТЬ 4 МИН
	BTFSS STATUS,Z
	GOTO CH_2
		CLRF TIMER_1		; ОЧИСТИМ ТАЙМЕР ВРЕМЕНИ
		BTFSC FIST_CHAND,1	; ПРОВЕРИМ, ПЕРВЫЙ ЛИ ПУСК ЗАРЯДКИ
		GOTO SKIP1
		BSF FIST_CHAND,1	; ПОСТАВИМ ФЛАГ ТОГО, ЧТО ПЕРВЫЙ ПУСК ПРОШЕЛ
MEMO_1		MOVF CHANEL_1L,0
		MOVWF M_CHANEL_1L	; ЗАПОМНИМ ЗНАЧЕНИЕ НАПРЯЖЕНИЯ
		MOVF CHANEL_1H,0
		MOVWF M_CHANEL_1H	; ЗАПОМНИМ ЗНАЧЕНИЕ НАПРЯЖЕНИЯ
;		CLRF END_CH1		; ОЧИСТИМ СЧЕТЧИК
		GOTO CH_2
SKIP1				INCF END_TIMER_1,1 	;УВЕЛИЧИМ ТАЙМЕР ОТСЧЕТА ВРЕМЕНИ ОКОНЧАТЕЛЬНОЙ ЗАРЯДКИ НА 1
				MOVLW TIM
				XORWF END_TIMER_1,0	; СРАВНИМ ЗНАЧЕНИЕ ТАЙМЕРА ОКОНЧАНИЯ ЗАРЯДКИ С КОНСТАНТОЙ
				BTFSC STATUS,Z		; 
				BSF FLAG_END_TIMER,1	; ЕСЛИ ТАЙМЕРЫ РАВНЫ, ТО ПОСТАВИМ ФЛАГ "ВРЕМЯ ВЫШЛО"
				BTFSC STATUS,Z
				GOTO OFF_CH_1		; ЕСЛИ ТАЙМЕРЫ РАВНЫ, ТО ВЫКЛЮЧИМ ЗАРЯДКУ
			MOVF CHANEL_1H,0
			SUBWF M_CHANEL_1H,0	; ВЫЧТИМ ИЗ ЗАПОМНЕНОГО ЗНАЧЕНИЯ ТЕКУШЕЕ
			BTFSC STATUS,Z		; СРАВНИМ СТАРШИЕ БАЙТЫ
			GOTO MIN_L1		; СТАРШИЕ БАЙТЫ РАВНЫ, ПРОВЕРИМ МЛАДШИЕ		
			BTFSC STATUS,C		; ЕСЛИ РЕЗУЛЬТАТ ПОЛОЖИТЕЛЕН, ТО УЖЕ ДАВНО ПОРА ВЫКЛЮЧИТЬ ЗАРЯДКУ
			GOTO OFF_CH_1
		; ВСЕ НОРМАЛЬНО, ЗАРЯДКА ИДЕТ ДАЛЬШЕ
				GOTO MEMO_1		; ОБНОВИМ ЗНАЧЕНИЯ НАПРЯЖЕНИЯ
MIN_L1					MOVF CHANEL_1L,0
					SUBWF M_CHANEL_1L,0	; ВЫЧТИМ ИЗ ЗАПОМНЕНОГО ЗНАЧЕНИЯ ТЕКУШЕЕ
					BTFSC STATUS,Z		; СРАВНИМ МЛАДШИЕ БАЙТЫ
					GOTO MEMO_1		; ВСЕ НОРМАЛЬНО, ЗАРЯДКА ИДЕТ ДАЛЬШЕ.ОБНОВИМ ЗНАЧЕНИЯ НАПРЯЖЕНИЯ
					BTFSS STATUS,C		; ЕСЛИ РЕЗУЛЬТАТ ОТРИЦАТЕЛЕН ИЛИ РАВНЫ, ТО ЗАРЯДКА ИДЕТ ДАЛЬШЕ
								; ПОЛОЖИТЕЛЕН, ТО ПРЕРАТИТЬ ЗАРЯДКУ
					GOTO MEMO_1		; ОБНОВИМ ЗНАЧЕНИЯ НАПРЯЖЕНИЯ

;_____________________________________________________________________________________
; В этом месте счетчик падения напряжения на аккумуляторе.
	INCF END_CH1,1		; УВЕЛИЧИМ СЧЕТЧИК НА 1
	MOVLW 2
	XORWF END_CH1,0		; СРАВНИМ СЧЕТЧИК С 2
	BTFSC STATUS,Z
	GOTO OFF_CH_1		; ЕСЛИ СЧЕТЧИК РАВЕН ДВУМ, ТО ВЫКЛЮЧИМ ЗАРЯДКУ
		MOVF CHANEL_1L,0
		MOVWF M_CHANEL_1L	; ЗАПОМНИМ ЗНАЧЕНИЕ НАПРЯЖЕНИЯ
		MOVF CHANEL_1H,0
		MOVWF M_CHANEL_1H	; ЗАПОМНИМ ЗНАЧЕНИЕ НАПРЯЖЕНИЯ
		GOTO CH_2
;_____________________________________________________________________________________
OFF_CH_1					CLRF END_CH1		; ОЧИСТИМ СЧЕТЧИК
						BSF OFF_CHAND,1		; ПОСТАВИМ ФЛАГ ОКОНЧАНИЯ ЗАРЯДКИ
						BCF CHAND,1		; УБЕРЕМ ФЛАГ НАЛИЧИЯ ЗАРДКИ
						BCF PORTC,1		; ВЫКЛЮЧИМ ИСТОЧНИК ТОКА.
						CLRF TIMER_1		; ОЧИСТИМ ТАЙМЕР ВРЕМЕНИ
						CLRF END_TIMER_1	; ОЧИСТИМ ТАЙМЕР ОКОНЧАНИЯ ЗАРЯДКИ
;________________________________
CH_2	MOVLW 120
	XORWF TIMER_2,0		; СРАВНИМ ЗНАЧЕНИЕ ТАЙМЕРА С 120, ТО ЕСТЬ 4 МИН
	BTFSS STATUS,Z
	GOTO CH_3
		CLRF TIMER_2		; ОЧИСТИМ ТАЙМЕР ВРЕМЕНИ
		BTFSC FIST_CHAND,2	; ПРОВЕРИМ, ПЕРВЫЙ ЛИ ПУСК ЗАРЯДКИ
		GOTO SKIP2
		BSF FIST_CHAND,2	; ПОСТАВИМ ФЛАГ ТОГО, ЧТО ПЕРВЫЙ ПУСК ПРОШЕЛ
MEMO_2		MOVF CHANEL_2L,0
		MOVWF M_CHANEL_2L	; ЗАПОМНИМ ЗНАЧЕНИЕ НАПРЯЖЕНИЯ
		MOVF CHANEL_2H,0
		MOVWF M_CHANEL_2H	; ЗАПОМНИМ ЗНАЧЕНИЕ НАПРЯЖЕНИЯ
;		CLRF END_CH2		; ОЧИСТИМ СЧЕТЧИК
		GOTO CH_3
SKIP2				INCF END_TIMER_2,1 	;УВЕЛИЧИМ ТАЙМЕР ОТСЧЕТА ВРЕМЕНИ ОКОНЧАТЕЛЬНОЙ ЗАРЯДКИ НА 1
				MOVLW TIM
				XORWF END_TIMER_2,0	; СРАВНИМ ЗНАЧЕНИЕ ТАЙМЕРА ОКОНЧАНИЯ ЗАРЯДКИ С КОНСТАНТОЙ
				BTFSC STATUS,Z		; 
				BSF FLAG_END_TIMER,2	; ЕСЛИ ТАЙМЕРЫ РАВНЫ, ТО ПОСТАВИМ ФЛАГ "ВРЕМЯ ВЫШЛО"
				BTFSC STATUS,Z
				GOTO OFF_CH_2		; ЕСЛИ ТАЙМЕРЫ РАВНЫ, ТО ВЫКЛЮЧИМ ЗАРЯДКУ
			MOVF CHANEL_2H,0
			SUBWF M_CHANEL_2H,0	; ВЫЧТИМ ИЗ ЗАПОМНЕНОГО ЗНАЧЕНИЯ ТЕКУШЕЕ
			BTFSC STATUS,Z		; СРАВНИМ СТАРШИЕ БАЙТЫ
			GOTO MIN_L2		; СТАРШИЕ БАЙТЫ РАВНЫ, ПРОВЕРИМ МЛАДШИЕ		
			BTFSC STATUS,C		; ЕСЛИ РЕЗУЛЬТАТ ПОЛОЖИТЕЛЕН, ТО УЖЕ ДАВНО ПОРА ВЫКЛЮЧИТЬ ЗАРЯДКУ
			GOTO OFF_CH_2
		; ВСЕ НОРМАЛЬНО, ЗАРЯДКА ИДЕТ ДАЛЬШЕ
				GOTO MEMO_2		; ОБНОВИМ ЗНАЧЕНИЯ НАПРЯЖЕНИЯ
MIN_L2					MOVF CHANEL_2L,0
					SUBWF M_CHANEL_2L,0	; ВЫЧТИМ ИЗ ЗАПОМНЕНОГО ЗНАЧЕНИЯ ТЕКУШЕЕ
					BTFSC STATUS,Z		; СРАВНИМ МЛАДШИЕ БАЙТЫ
					GOTO MEMO_2		; ВСЕ НОРМАЛЬНО, ЗАРЯДКА ИДЕТ ДАЛЬШЕ.ОБНОВИМ ЗНАЧЕНИЯ НАПРЯЖЕНИЯ
					BTFSS STATUS,C		; ЕСЛИ РЕЗУЛЬТАТ ОТРИЦАТЕЛЕН ИЛИ РАВНЫ, ТО ЗАРЯДКА ИДЕТ ДАЛЬШЕ
								; ПОЛОЖИТЕЛЕН, ТО ПРЕРАТИТЬ ЗАРЯДКУ
					GOTO MEMO_2		; ОБНОВИМ ЗНАЧЕНИЯ НАПРЯЖЕНИЯ
;_____________________________________________________________________________________
; В этом месте счетчик падения напряжения на аккумуляторе.
	INCF END_CH2,1		; УВЕЛИЧИМ СЧЕТЧИК НА 1
	MOVLW 2
	XORWF END_CH2,0		; СРАВНИМ СЧЕТЧИК С 2
	BTFSC STATUS,Z
	GOTO OFF_CH_2		; ЕСЛИ СЧЕТЧИК РАВЕН ДВУМ, ТО ВЫКЛЮЧИМ ЗАРЯДКУ
		MOVF CHANEL_2L,0
		MOVWF M_CHANEL_2L	; ЗАПОМНИМ ЗНАЧЕНИЕ НАПРЯЖЕНИЯ
		MOVF CHANEL_2H,0
		MOVWF M_CHANEL_2H	; ЗАПОМНИМ ЗНАЧЕНИЕ НАПРЯЖЕНИЯ
		GOTO CH_3
;_____________________________________________________________________________________
OFF_CH_2					CLRF END_CH2		; ОЧИСТИМ СЧЕТЧИК
						BSF OFF_CHAND,2		; ПОСТАВИМ ФЛАГ ОКОНЧАНИЯ ЗАРЯДКИ
						BCF CHAND,2		; УБЕРЕМ ФЛАГ НАЛИЧИЯ ЗАРДКИ
						BCF PORTC,2		; ВЫКЛЮЧИМ ИСТОЧНИК ТОКА.
						CLRF TIMER_2		; ОЧИСТИМ ТАЙМЕР ВРЕМЕНИ
						CLRF END_TIMER_2	; ОЧИСТИМ ТАЙМЕР ОКОНЧАНИЯ ЗАРЯДКИ
;________________________________
CH_3	MOVLW 120
	XORWF TIMER_3,0		; СРАВНИМ ЗНАЧЕНИЕ ТАЙМЕРА С 120, ТО ЕСТЬ 4 МИН
	BTFSS STATUS,Z
	GOTO CH_4
		CLRF TIMER_3		; ОЧИСТИМ ТАЙМЕР ВРЕМЕНИ
		BTFSC FIST_CHAND,3	; ПРОВЕРИМ, ПЕРВЫЙ ЛИ ПУСК ЗАРЯДКИ
		GOTO SKIP3
		BSF FIST_CHAND,3	; ПОСТАВИМ ФЛАГ ТОГО, ЧТО ПЕРВЫЙ ПУСК ПРОШЕЛ
MEMO_3		MOVF CHANEL_3L,0
		MOVWF M_CHANEL_3L	; ЗАПОМНИМ ЗНАЧЕНИЕ НАПРЯЖЕНИЯ
		MOVF CHANEL_3H,0
		MOVWF M_CHANEL_3H	; ЗАПОМНИМ ЗНАЧЕНИЕ НАПРЯЖЕНИЯ
;		CLRF END_CH3		; ОЧИСТИМ СЧЕТЧИК
		GOTO CH_4
SKIP3				INCF END_TIMER_3,1 	;УВЕЛИЧИМ ТАЙМЕР ОТСЧЕТА ВРЕМЕНИ ОКОНЧАТЕЛЬНОЙ ЗАРЯДКИ НА 1
				MOVLW TIM
				XORWF END_TIMER_3,0	; СРАВНИМ ЗНАЧЕНИЕ ТАЙМЕРА ОКОНЧАНИЯ ЗАРЯДКИ С КОНСТАНТОЙ
				BTFSC STATUS,Z		; 
				BSF FLAG_END_TIMER,3	; ЕСЛИ ТАЙМЕРЫ РАВНЫ, ТО ПОСТАВИМ ФЛАГ "ВРЕМЯ ВЫШЛО"
				BTFSC STATUS,Z
				GOTO OFF_CH_3		; ЕСЛИ ТАЙМЕРЫ РАВНЫ, ТО ВЫКЛЮЧИМ ЗАРЯДКУ
			MOVF CHANEL_3H,0
			SUBWF M_CHANEL_3H,0	; ВЫЧТИМ ИЗ ЗАПОМНЕНОГО ЗНАЧЕНИЯ ТЕКУШЕЕ
			BTFSC STATUS,Z		; СРАВНИМ СТАРШИЕ БАЙТЫ
			GOTO MIN_L3		; СТАРШИЕ БАЙТЫ РАВНЫ, ПРОВЕРИМ МЛАДШИЕ		
			BTFSC STATUS,C		; ЕСЛИ РЕЗУЛЬТАТ ПОЛОЖИТЕЛЕН, ТО УЖЕ ДАВНО ПОРА ВЫКЛЮЧИТЬ ЗАРЯДКУ
			GOTO OFF_CH_3
		; ВСЕ НОРМАЛЬНО, ЗАРЯДКА ИДЕТ ДАЛЬШЕ
				GOTO MEMO_3		; ОБНОВИМ ЗНАЧЕНИЯ НАПРЯЖЕНИЯ
MIN_L3					MOVF CHANEL_3L,0
					SUBWF M_CHANEL_3L,0	; ВЫЧТИМ ИЗ ЗАПОМНЕНОГО ЗНАЧЕНИЯ ТЕКУШЕЕ
					BTFSC STATUS,Z		; СРАВНИМ МЛАДШИЕ БАЙТЫ
					GOTO MEMO_3		; ВСЕ НОРМАЛЬНО, ЗАРЯДКА ИДЕТ ДАЛЬШЕ.ОБНОВИМ ЗНАЧЕНИЯ НАПРЯЖЕНИЯ
					BTFSS STATUS,C		; ЕСЛИ РЕЗУЛЬТАТ ОТРИЦАТЕЛЕН ИЛИ РАВНЫ, ТО ЗАРЯДКА ИДЕТ ДАЛЬШЕ
								; ПОЛОЖИТЕЛЕН, ТО ПРЕРАТИТЬ ЗАРЯДКУ
					GOTO MEMO_3		; ОБНОВИМ ЗНАЧЕНИЯ НАПРЯЖЕНИЯ

;_____________________________________________________________________________________
; В этом месте счетчик падения напряжения на аккумуляторе.
	INCF END_CH3,1		; УВЕЛИЧИМ СЧЕТЧИК НА 1
	MOVLW 2
	XORWF END_CH3,0		; СРАВНИМ СЧЕТЧИК С 2
	BTFSC STATUS,Z
	GOTO OFF_CH_3		; ЕСЛИ СЧЕТЧИК РАВЕН ДВУМ, ТО ВЫКЛЮЧИМ ЗАРЯДКУ
		MOVF CHANEL_3L,0
		MOVWF M_CHANEL_3L	; ЗАПОМНИМ ЗНАЧЕНИЕ НАПРЯЖЕНИЯ
		MOVF CHANEL_3H,0
		MOVWF M_CHANEL_3H	; ЗАПОМНИМ ЗНАЧЕНИЕ НАПРЯЖЕНИЯ
		GOTO CH_4
;_____________________________________________________________________________________
OFF_CH_3					CLRF END_CH3		; ОЧИСТИМ СЧЕТЧИК
						BSF OFF_CHAND,3		; ПОСТАВИМ ФЛАГ ОКОНЧАНИЯ ЗАРЯДКИ
						BCF CHAND,3		; УБЕРЕМ ФЛАГ НАЛИЧИЯ ЗАРДКИ
						BCF PORTC,3		; ВЫКЛЮЧИМ ИСТОЧНИК ТОКА.
						CLRF TIMER_3		; ОЧИСТИМ ТАЙМЕР ВРЕМЕНИ
						CLRF END_TIMER_3	; ОЧИСТИМ ТАЙМЕР ОКОНЧАНИЯ ЗАРЯДКИ

;*********************************
;________________________________
CH_4	BTFSC FLAG_END_TIMER,0		; ПРОВЕРИМ , СТОИТ ЛИ ФЛАГ ТАЙМ АУТА
	GOTO S_OFF_0
	BTFSS CHAND,0		; ПРОВЕРИМ, ВКЛЮЧЕНА ЛИ ЗАРЯДКА
	GOTO S_ON_0
		BTFSS PORTC,7		; ПРОВЕРИМ УСТАНОВЛЕН ИЛИ СБРОШЕН БИТ
		GOTO S_ON_0		; ПЕРЕЙДЕМ ДЛЯ УСТАНОВКИ БИТА
S_OFF_0		BCF PORTC,7		; ОЧИСТИМ 0 БИТ ПОРТА A. МЕРЦАНИЕ СВЕТОДИОДА
		GOTO S1
S_ON_0			BSF PORTC,7		; УСТАНОВИМ 0 БИТ ПОРТА A. МЕРЦАНИЕ СВЕТОДИОДА
;________________________________
S1	BTFSC FLAG_END_TIMER,1		; ПРОВЕРИМ , СТОИТ ЛИ ФЛАГ ТАЙМ АУТА
	GOTO S_OFF_1
	BTFSS CHAND,1		; ПРОВЕРИМ, ВКЛЮЧЕНА ЛИ ЗАРЯДКА
	GOTO S_ON_1
		BTFSS PORTC,6		; ПРОВЕРИМ УСТАНОВЛЕН ИЛИ СБРОШЕН БИТ
		GOTO S_ON_1		; ПЕРЕЙДЕМ ДЛЯ УСТАНОВКИ БИТА
S_OFF_1		BCF PORTC,6		; ОЧИСТИМ 0 БИТ ПОРТА A. МЕРЦАНИЕ СВЕТОДИОДА
		GOTO S2
S_ON_1			BSF PORTC,6		; УСТАНОВИМ 0 БИТ ПОРТА A. МЕРЦАНИЕ СВЕТОДИОДА
;________________________________
S2	BTFSC FLAG_END_TIMER,2		; ПРОВЕРИМ , СТОИТ ЛИ ФЛАГ ТАЙМ АУТА
	GOTO S_OFF_2
	BTFSS CHAND,2		; ПРОВЕРИМ, ВКЛЮЧЕНА ЛИ ЗАРЯДКА
	GOTO S_ON_2
		BTFSS PORTC,5		; ПРОВЕРИМ УСТАНОВЛЕН ИЛИ СБРОШЕН БИТ
		GOTO S_ON_2		; ПЕРЕЙДЕМ ДЛЯ УСТАНОВКИ БИТА
S_OFF_2		BCF PORTC,5		; ОЧИСТИМ 0 БИТ ПОРТА A. МЕРЦАНИЕ СВЕТОДИОДА
		GOTO S3
S_ON_2			BSF PORTC,5		; УСТАНОВИМ 0 БИТ ПОРТА A. МЕРЦАНИЕ СВЕТОДИОДА
;________________________________
S3	BTFSC FLAG_END_TIMER,3		; ПРОВЕРИМ , СТОИТ ЛИ ФЛАГ ТАЙМ АУТА
	GOTO S_OFF_3
	BTFSS CHAND,3		; ПРОВЕРИМ, ВКЛЮЧЕНА ЛИ ЗАРЯДКА
	GOTO S_ON_3
		BTFSS PORTC,4		; ПРОВЕРИМ УСТАНОВЛЕН ИЛИ СБРОШЕН БИТ
		GOTO S_ON_3		; ПЕРЕЙДЕМ ДЛЯ УСТАНОВКИ БИТА
S_OFF_3		BCF PORTC,4		; ОЧИСТИМ 0 БИТ ПОРТА A. МЕРЦАНИЕ СВЕТОДИОДА
		GOTO S4
S_ON_3			BSF PORTC,4		; УСТАНОВИМ 0 БИТ ПОРТА A. МЕРЦАНИЕ СВЕТОДИОДА
;________________________________
S4

		GOTO end_int
;------------------------------------------------------------------------------------------------------------------------

;***** 
end_int		MOVF PCLATH_TEMP, W 		; Restore PCLATH
		MOVWF PCLATH 			; Move W into PCLATH
		movf    status_temp,w   	; retrieve copy of STATUS register
		movwf	STATUS          	; restore pre-isr STATUS register contents
		swapf   w_temp,f
		swapf   w_temp,w         	; restore pre-isr W register contents
		retfie                    	; return from interrupt

main

; ОПИСАНИЕ ПЕРЕМЕННЫХ
	CBLOCK	H'70'
	w_temp        :1        ; Переменная для обработчика прерывний 
	status_temp   :1        ; Переменная для обработчика прерывний 
	PCLATH_TEMP   :1        ; Переменная для обработчика прерывний
	ENDC

	CBLOCK	H'33'

	ADC_NACOPH		; СТАРШАЯ ПЕРЕМЕННАЯ НАКОПЛЕНИЯ ЗНАЧЕНИЙ АЦП
	ADC_NACOPM		; СРЕДНЯЯ ПЕРЕМЕННАЯ НАКОПЛЕНИЯ ЗНАЧЕНИЙ АЦП
	ADC_NACOPL		; МЛАДШАЯ ПЕРЕМЕННАЯ НАКОПЛЕНИЯ ЗНАЧЕНИЙ АЦП
	COL_ADCL		; КОЛИЧЕСТВО ВЫЧИСЛЕНИЙ  АЦП
	COL_ADCH		; КОЛИЧЕСТВО ВЫЧИСЛЕНИЙ  АЦП

	CHANEL_0L		; СРЕДНИЕ ЗНАЧЕНИЕ АЦП 0 КАНАЛА
	CHANEL_0H		; СРЕДНИЕ ЗНАЧЕНИЕ АЦП 0 КАНАЛА
	CHANEL_1L		; СРЕДНИЕ ЗНАЧЕНИЕ АЦП 1 КАНАЛА
	CHANEL_1H		; СРЕДНИЕ ЗНАЧЕНИЕ АЦП 1 КАНАЛА
	CHANEL_2L		; СРЕДНИЕ ЗНАЧЕНИЕ АЦП 2 КАНАЛА
	CHANEL_2H		; СРЕДНИЕ ЗНАЧЕНИЕ АЦП 2 КАНАЛА
	CHANEL_3L		; СРЕДНИЕ ЗНАЧЕНИЕ АЦП 3 КАНАЛА
	CHANEL_3H		; СРЕДНИЕ ЗНАЧЕНИЕ АЦП 3 КАНАЛА

	M_CHANEL_0L		; СРЕДНИЕ ЗНАЧЕНИЕ АЦП 0 КАНАЛА ЗАПОМНЕНОЕ
	M_CHANEL_0H		; СРЕДНИЕ ЗНАЧЕНИЕ АЦП 0 КАНАЛА ЗАПОМНЕНОЕ
	M_CHANEL_1L		; СРЕДНИЕ ЗНАЧЕНИЕ АЦП 1 КАНАЛА ЗАПОМНЕНОЕ
	M_CHANEL_1H		; СРЕДНИЕ ЗНАЧЕНИЕ АЦП 1 КАНАЛА ЗАПОМНЕНОЕ
	M_CHANEL_2L		; СРЕДНИЕ ЗНАЧЕНИЕ АЦП 2 КАНАЛА ЗАПОМНЕНОЕ
	M_CHANEL_2H		; СРЕДНИЕ ЗНАЧЕНИЕ АЦП 2 КАНАЛА ЗАПОМНЕНОЕ
	M_CHANEL_3L		; СРЕДНИЕ ЗНАЧЕНИЕ АЦП 3 КАНАЛА ЗАПОМНЕНОЕ
	M_CHANEL_3H		; СРЕДНИЕ ЗНАЧЕНИЕ АЦП 3 КАНАЛА ЗАПОМНЕНОЕ


	CHAND			; СТАТУС РЕГИСТР ВКЛЮЧЕНИЯ И ВЫКЛЮЧЕНИЯ ЗАРЯДКИ.
	FIST_CHAND		; СТАТУС РЕГИСТР ПЕРВОГО ПУСКА ЗАРЯДКИ
	OFF_CHAND		; ФЛАГИ ОКОНЧАНИЯ ЗАРЯДКИ ПО СПАДУ НАПРЯЖЕНИЯ
	FLAG_END_TIMER		; ФЛАГИ ОКОНЧАНИЯ ЗАРЯДКИ ПО ТАЙМАУТУ

	TIMER			; ТАЙМЕР. ИСПОЛЬЗУЕТСЯ ПРИ КОНТРОЛЕ ТЕМПЕРАТУРЫ НАГРЕВАТЕЛЬНОГО ЕЛЕМЕНТА

	TIMER_0			; ТАЙМЕР ОТСЧЕТА ВРЕМЕНИ ДЛЯ ТЕСТА ОТНОШЕНИЯ НАПРЯЖЕНИЯ КО ВРЕМЕНИ ЗАРЯДКИ ДЛЯ 0-КАНАЛА
	TIMER_1			; ТАЙМЕР ОТСЧЕТА ВРЕМЕНИ ДЛЯ ТЕСТА ОТНОШЕНИЯ НАПРЯЖЕНИЯ КО ВРЕМЕНИ ЗАРЯДКИ ДЛЯ 1-КАНАЛА
	TIMER_2			; ТАЙМЕР ОТСЧЕТА ВРЕМЕНИ ДЛЯ ТЕСТА ОТНОШЕНИЯ НАПРЯЖЕНИЯ КО ВРЕМЕНИ ЗАРЯДКИ ДЛЯ 2-КАНАЛА
	TIMER_3			; ТАЙМЕР ОТСЧЕТА ВРЕМЕНИ ДЛЯ ТЕСТА ОТНОШЕНИЯ НАПРЯЖЕНИЯ КО ВРЕМЕНИ ЗАРЯДКИ ДЛЯ 3-КАНАЛА

	END_CH0			; ТАЙМЕР ВЫКЛЮЧЕНИЯ ЗАРЯДКИ
	END_CH1			; ТАЙМЕР ВЫКЛЮЧЕНИЯ ЗАРЯДКИ
	END_CH2			; ТАЙМЕР ВЫКЛЮЧЕНИЯ ЗАРЯДКИ
	END_CH3			; ТАЙМЕР ВЫКЛЮЧЕНИЯ ЗАРЯДКИ

	END_TIMER_0		; ТАЙМЕР ОТСЧЕТА ВРЕМЕНИ ОКОНЧАНИЯ ЗАРЯДКИ 0-КАНАЛА
	END_TIMER_1		; ТАЙМЕР ОТСЧЕТА ВРЕМЕНИ ОКОНЧАНИЯ ЗАРЯДКИ 1-КАНАЛА
	END_TIMER_2		; ТАЙМЕР ОТСЧЕТА ВРЕМЕНИ ОКОНЧАНИЯ ЗАРЯДКИ 2-КАНАЛА
	END_TIMER_3		; ТАЙМЕР ОТСЧЕТА ВРЕМЕНИ ОКОНЧАНИЯ ЗАРЯДКИ 3-КАНАЛА

	CHANEL			; НОМЕР КАНАЛА АЦП
	PAUSE_ADC		; ПАУЗА ПОСЛЕ ПЕРЕКЛЮЧЕНИЯ КАНАЛА

	TEST_TIMER		;

	ENDC
;***************************************************
	constant TIM=150	; ЭТО 10 ЧАСОВ		; КОНСТАНТА ОКОНЧАНИЯ ЗАРЯДКИ ПО ТАЙМЕРУ. ДИСКРЕТНОСТЬ ТАЙМЕРА 4МИН.
;***************************************************


; ОЧИСТИМ ОЗУ В ПЕРВОМ БАНКЕ
		BCF STATUS,IRP
		movlw H'20' 		;initialize pointer
		movwf FSR 		; to RAM
NEXT 		clrf INDF 		;clear INDF register
		incf FSR,1		;inc pointer
		btfss FSR,7 		;all done?
		goto NEXT 		;NO, clear next

; НАСТРОИМ ПОРТ А КАК АНАЛОГОВЫЕ ВХОДЫ ВЫХОДЫ
	BANKSEL ADCON1
	MOVLW B'10000000'		; УСТАНОВИМ ВСЕ ВХОДЫ ПОРТА А КАК АНАЛОГОВЫЕ, А Vref НА ШИНУ ПИТАНИЯ.
	MOVWF ADCON1			; СКОНФИГУРИРУЕМ ADCON1
		BANKSEL ADCON0
		MOVLW B'10000001'	; ВЫСТАВИМ Fosc/32 И 0 КАНАЛ АЦП
		MOVWF ADCON0		; СКОНФИГУРИРУЕМ ADCON0

; ОЧИСТИМ ПОРТЫ ВВОДА ВЫВОДА
	BANKSEL PORTA
	CLRF PORTA
	CLRF PORTB
	CLRF PORTC


; УСТАНОВКИ ТАЙМЕРА 1
	MOVLW H'79'
	MOVWF TMR1L		; ЗАПИШИМ НАЧАЛЬНЫЕ ПРЕДУСТАНОВКИ ТАЙМЕРА 1
	MOVLW H'EC'
	MOVWF TMR1H		; ЗАПИШИМ НАЧАЛЬНЫЕ ПРЕДУСТАНОВКИ ТАЙМЕРА 1
	MOVLW B'00110101'	
	MOVWF T1CON		; ЗАПИШЕМ КОНФИГУРАЦИЮ ТАЙМЕРА 1

; УСТАНОВКИ ТАЙМЕРА 2
;	CLRF TMR2
;	BANKSEL PR2
;	MOVLW 99
;	MOVWF PR2
;	BANKSEL T2CON
;	MOVLW B'01001101'		; ЗАПИШЕМ КОНФИГУРАЦИЮ ТАЙМЕРА 2
;	MOVWF T2CON


; НАСТРОИМ ПОРТЫ ВВОДА ВЫВОДА
	BANKSEL TRISC
; ПОРТ С
	MOVLW B'00000000'	; ПОРТ С ВЕСЬ НА ВЫВОД.
	MOVWF TRISC
; ПОРТ А
	MOVLW B'11111111'
	MOVWF TRISA		; ПОРТ А ВЕСЬ НА ВВОД
; ПОРТ В
	MOVLW B'11111111'
	MOVWF TRISB		; ПОРТ В ВЕСЬ НА ВВОД

; НАЧАЛЬНЫЕ ПРЕДУСТАНОВКИ
	BANKSEL PORTC
	BSF PORTC,0	
	BSF PORTC,1
	BSF PORTC,2
	BSF PORTC,3

	BANKSEL OPTION_REG

; СКОНФИГУРИРУЕМ ТАЙМЕР TMR0 И WDT
; ВКЛЮЧИМ ПОДТЯГИВАЮЩИЕ РЕЗИСТОРЫ ПОРТА В
	MOVLW B'01010111'
	MOVWF OPTION_REG



	BSF INTCON,GIE 		; РАЗРЕШИТЬ ПРЕРЫВАНИЯ
	BSF INTCON,PEIE		; РАЗРЕШИТЬ ПРЕРЫВАНИЯ ОТ ПЕРЕФЕРИИ
	BANKSEL PIE1

	BSF PIE1,TMR1IE		; РАЗРЕШИТЬ ПРЕРЫВАНИЯ ТАЙМЕРА 1
;	BSF PIE1,TMR2IE		; РАЗРЕШИТЬ ПРЕРЫВАНИЯ ТАЙМЕРА 2
		BANKSEL PORTA		; УСТАНОВИМ 0 БАНК ОЗУ
		BSF ADCON0,2		; ВКЛЮЧИМ АЦП НА ПРЕОБРАЗОВАНИЕ
;*********

RETURN_PROGRAM 

	CALL RUN_ADC			; ПОДПРОГРАММА ИЗМЕРЕНИЯ ЗНАЧЕНИЯ АЦП
	CLRWDT
	CALL RUN_CHAHD			; ПОДПРОГРАММА ОПРЕДЕЛЕНИЯ СТАРТА И СТОПА ЗАРЯДКИ
	CLRWDT

	GOTO RETURN_PROGRAM 
;------------------------------------------------------------------------------------------------------------------------
RUN_ADC			; ПОДПРОГРАММА ИЗМЕРЕНИЯ ЗНАЧЕНИЯ АЦП
	BTFSC ADCON0,2	; ПРОВЕРИМ ЗАКОНЧИЛОСЬ ЛИ ПРЕОБРАЗОВАНИЕ
	RETURN
;***********  НАКОПИМ СУММУ ИЗМЕРЕНИЙ 1024 РАЗ
			BANKSEL ADRESL
		MOVF  ADRESL,0			; ПРОЧИТАЕМ ЗНАЧЕНИЕ АЦП
			BANKSEL ADRESH
		ADDWF ADC_NACOPL,1
		BCF STATUS,Z
		BTFSC STATUS,C			; ЕСЛИ БЫЛО ПЕРЕПОЛНЕНИЕ, ТО К СТАРШЕМУ БАЙТУ ПРИБАВИМ 1
		INCF ADC_NACOPM,1
		BTFSC STATUS,Z			; ЕСЛИ БЫЛО ПЕРЕПОЛНЕНИЕ В СРЕДНЕМ БАЙТЕ, ТО К СТАРШЕМУ БАЙТУ ПРИБАВИМ 1
		INCF ADC_NACOPH,1		
			MOVF  ADRESH,0		; ПРОЧИТАЕМ ЗНАЧЕНИЕ АЦП
			ADDWF ADC_NACOPM,1
 			BTFSC STATUS,C		; ЕСЛИ БЫЛО ПЕРЕПОЛНЕНИЕ, ТО К СТАРШЕМУ БАЙТУ ПРИБАВИМ 1
			INCF ADC_NACOPH,1
			INCF COL_ADCL,1 		; УВЕЛИЧИМ СЧЕТЧИК НА 1
			BTFSC STATUS,Z		; ЕСЛИ СЧЕТЧИК ПЕРЕПОЛНИЛСА ТО УВЕЛИЧИМ СТАРШИЙ БАЙТ НА 1
			INCF COL_ADCH,1 		; УВЕЛИЧИМ СЧЕТЧИК НА 1
			
	BTFSS COL_ADCH,2			; ПРОВЕРИМ СЧЕТЧИК КОЛИЧЕСТВА ИЗМЕРЕНИЙ. ЕСЛИ БОЛЬШЕ 1024 ТО ПОСЧИТАЕМ СРЕДНЕЕ ЗНАЧЕНИЕ
	GOTO NEXT_ADC
	; ***** РАЗДЕЛИМ НАКОПЛЕННУЮ СУММУ НА 1024. ТО ЕСТЬ СДВИНИМ НАКОПЛЕННУЮ СУММУ НА 10 ПОЗИЦЫЙ В ПРАВО 
			MOVLW 10
			MOVWF COL_ADCL
REPIT_RRL	BCF STATUS,C
		RRF ADC_NACOPH,1
		RRF ADC_NACOPM,1
		RRF ADC_NACOPL,1
		DECF COL_ADCL,1
		BTFSS STATUS,Z
		GOTO REPIT_RRL
;**********-------------------------------------------------------------------------------------------------------
	MOVF CHANEL,0		; 0 КАНАЛ
	BTFSS STATUS,Z
	GOTO CHANEL_1
;********** ВЫСТАВИМ 1 КАНАЛ - RA1
		BSF ADCON0,3
			INCF CHANEL,1 		; УВЕЛИЧИМ СЧЕТЧИК КАНАЛА НА 1
				MOVF ADC_NACOPM,0	; ЗАПОМНИМ СРЕДНЕЕ ЗНАЧЕНИЕ АЦП ПО КАНАЛУ
				MOVWF CHANEL_0H
				MOVF ADC_NACOPL,0	; ЗАПОМНИМ СРЕДНЕЕ ЗНАЧЕНИЕ АЦП ПО КАНАЛУ
				MOVWF CHANEL_0L
;********* ВЫДЕРЖИМ ПАУЗУ 20 мкс.
				MOVLW 10
				MOVWF PAUSE_ADC	
M1				DECFSZ PAUSE_ADC,1
				GOTO M1
			GOTO NEXT_CH
;**********-------------------------------------------------------------------------------------------------------
CHANEL_1	MOVF CHANEL,0		; 1 КАНАЛ
	XORLW 1
	BTFSS STATUS,Z
	GOTO CHANEL_2
;********** ВЫСТАВИМ 2 КАНАЛ - RA2
		BCF ADCON0,3
		BSF ADCON0,4
			INCF CHANEL,1 		; УВЕЛИЧИМ СЧЕТЧИК КАНАЛА НА 1
				MOVF ADC_NACOPM,0	; ЗАПОМНИМ СРЕДНЕЕ ЗНАЧЕНИЕ АЦП ПО КАНАЛУ
				MOVWF CHANEL_1H
				MOVF ADC_NACOPL,0	; ЗАПОМНИМ СРЕДНЕЕ ЗНАЧЕНИЕ АЦП ПО КАНАЛУ
				MOVWF CHANEL_1L
;********* ВЫДЕРЖИМ ПАУЗУ 20 мкс.
				MOVLW 10
				MOVWF PAUSE_ADC	
M2				DECFSZ PAUSE_ADC,1
				GOTO M2
			GOTO NEXT_CH
;**********-------------------------------------------------------------------------------------------------------
CHANEL_2	MOVF CHANEL,0		; 2 КАНАЛ
	XORLW 2
	BTFSS STATUS,Z
	GOTO CHANEL_3
;********** ВЫСТАВИМ 3 КАНАЛ - RA5
		BCF ADCON0,3
		BCF ADCON0,4
		BSF ADCON0,5
			INCF CHANEL,1 		; УВЕЛИЧИМ СЧЕТЧИК КАНАЛА НА 1
				MOVF ADC_NACOPM,0	; ЗАПОМНИМ СРЕДНЕЕ ЗНАЧЕНИЕ АЦП ПО КАНАЛУ
				MOVWF CHANEL_2H
				MOVF ADC_NACOPL,0	; ЗАПОМНИМ СРЕДНЕЕ ЗНАЧЕНИЕ АЦП ПО КАНАЛУ
				MOVWF CHANEL_2L
;********* ВЫДЕРЖИМ ПАУЗУ 20 мкс.
				MOVLW 10
				MOVWF PAUSE_ADC	
M3				DECFSZ PAUSE_ADC,1
				GOTO M3
			GOTO NEXT_CH
;**********-------------------------------------------------------------------------------------------------------
;********** ВЫСТАВИМ 0 КАНАЛ - RA0
CHANEL_3	BCF ADCON0,3
		BCF ADCON0,4
		BCF ADCON0,5
			CLRF CHANEL		; 0 КАНАЛ
				MOVF ADC_NACOPM,0	; ЗАПОМНИМ СРЕДНЕЕ ЗНАЧЕНИЕ АЦП ПО КАНАЛУ
				MOVWF CHANEL_3H
				MOVF ADC_NACOPL,0	; ЗАПОМНИМ СРЕДНЕЕ ЗНАЧЕНИЕ АЦП ПО КАНАЛУ
				MOVWF CHANEL_3L
;********* ВЫДЕРЖИМ ПАУЗУ 20 мкс.
				MOVLW 10
				MOVWF PAUSE_ADC	
M4				DECFSZ PAUSE_ADC,1
				GOTO M4
	BSF CHAND,7			; ПОСТАВИМ ФЛАГ ТОГО, ЧТО БЫЛО СДЕЛАНО ПЕРВОЕ ИЗМЕРЕНИЕ
;**********-------------------------------------------------------------------------------------------------------
NEXT_CH		CLRF ADC_NACOPH		; ОЧИСТИМ 
		CLRF ADC_NACOPM		; ОЧИСТИМ 
		CLRF ADC_NACOPL		; ОЧИСТИМ
		CLRF COL_ADCL		; ОЧИСТИМ СЧЕТЧИК
		CLRF COL_ADCH		; ОЧИСТИМ СЧЕТЧИК
NEXT_ADC	BSF ADCON0,2 		; ВКЛЮЧИМ АЦП НА ПРЕОБРАЗОВАНИЕ
	RETURN
;------------------------------------------------------------------------------------------------------------------------
;------------------------------------------------------------------------------------------------------------------------
RUN_CHAHD		; ПОДПРОГРАММА ОПРЕДЕЛЕНИЯ СТАРТА И СТОПА ЗАРЯДКИ
	BTFSS CHAND,7	; ПРОВЕРИМ, БЫЛО ЛИ СДЕЛАНО ПЕРВОЕ ИЗМЕРЕНИЕ
	RETURN
;********************************
;******  0-КАНАЛ
	MOVLW 3
	XORWF CHANEL_0H,0
	BTFSS STATUS,Z
	GOTO ON_CH0
	; СТАРШИЙ БИТ РАЗРЯДА АЦП 3! - НОРМА. ПРОВЕРИМ МЛАДШИЙ РАЗРЯД
		MOVLW 10
		SUBWF CHANEL_0L,0
		BTFSC STATUS,C		; ЕСЛИ РЕЗУЛЬТАТ ОТРИЦАТЕЛЬНЫЙ, ТО ВКЛЮЧИМ ЗАРЯДКУ
		GOTO OFF_CH0
; ВКЛЮЧИТЬ ЗАРЯДКУ ПО 0 КАНАЛУ
ON_CH0			BTFSS OFF_CHAND,0	; ПРОВЕРИМ БИТ ОКОНЧАНИЯ ЗАРЯДКИ
			BSF CHAND,0		; ВКЛЮЧИМ ЗАРЯДКУ ПО О КАНАЛУ
			BTFSC OFF_CHAND,4
			BCF PORTC,0		; ВЫКЛЮЧИМ ПОРТ, ТАК КАК АККУМУЛЯТОРЫ ЕЩЕ НЕ ОТКЛЮЧИЛИ
			BTFSC OFF_CHAND,4
			BCF OFF_CHAND,4		; УБЕРЕМ ФЛАГ
			GOTO NEXT_1
OFF_CH0				BCF CHAND,0		; ВЫКЛЮЧИМ ЗАРЯДКУ ПО О КАНАЛУ
				CLRF TIMER_0		; ОЧИСТИМ ТАЙМЕР ТЕСТА
				CLRF END_TIMER_0	; ОЧИСТИМ ТАЙМЕР ОКНОЧАНИЯ ЗАРЯДКИ ПО ТАУМАУТУ
				BCF FIST_CHAND,0	; ОЧИСТИМ ФЛАГ ПЕРВОГО ПУСКА ЗАРЯДКИ
				BTFSS OFF_CHAND,4
				GOTO NEXT_1
					BCF OFF_CHAND,4 	; УБЕРЕМ ФЛАГ
					BCF FLAG_END_TIMER,0	; УБЕРЕМ ФЛАГ ТАЙМЕРА ВЫКЛЮЧЕНИЯ ЗАРЯДКИ
					BCF OFF_CHAND,0		; УБЕРЕМ ФЛАГ ОКОНЧАНИЯ ЗАРЯДКИ				
;********************************
NEXT_1	;******  1-КАНАЛ
	MOVLW 3
	XORWF CHANEL_1H,0
	BTFSS STATUS,Z
	GOTO ON_CH1
	; СТАРШИЙ БИТ РАЗРЯДА АЦП 3! - НОРМА. ПРОВЕРИМ МЛАДШИЙ РАЗРЯД
		MOVLW 10
		SUBWF CHANEL_1L,0
		BTFSC STATUS,C		; ЕСЛИ РЕЗУЛЬТАТ ОТРИЦАТЕЛЬНЫЙ, ТО ВКЛЮЧИМ ЗАРЯДКУ
		GOTO OFF_CH1
; ВКЛЮЧИТЬ ЗАРЯДКУ ПО 0 КАНАЛУ
ON_CH1			BTFSS OFF_CHAND,1	; ПРОВЕРИМ БИТ ОКОНЧАНИЯ ЗАРЯДКИ
			BSF CHAND,1		; ВКЛЮЧИМ ЗАРЯДКУ ПО О КАНАЛУ
			BTFSC OFF_CHAND,5
			BCF PORTC,1		; ВЫКЛЮЧИМ ПОРТ, ТАК КАК АККУМУЛЯТОРЫ ЕЩЕ НЕ ОТКЛЮЧИЛИ
			BTFSC OFF_CHAND,5
			BCF OFF_CHAND,5		; УБЕРЕМ ФЛАГ
			GOTO NEXT_2
OFF_CH1				BCF CHAND,1		; ВЫКЛЮЧИМ ЗАРЯДКУ ПО 1 КАНАЛУ
				CLRF TIMER_1		; ОЧИСТИМ ТАЙМЕР ТЕСТА
				CLRF END_TIMER_1	; ОЧИСТИМ ТАЙМЕР ОКНОЧАНИЯ ЗАРЯДКИ ПО ТАУМАУТУ
				BCF FIST_CHAND,1	; ОЧИСТИМ ФЛАГ ПЕРВОГО ПУСКА ЗАРЯДКИ
				BTFSS OFF_CHAND,5
				GOTO NEXT_2
					BCF OFF_CHAND,5 	; УБЕРЕМ ФЛАГ
					BCF FLAG_END_TIMER,1	; УБЕРЕМ ФЛАГ ТАЙМЕРА ВЫКЛЮЧЕНИЯ ЗАРЯДКИ
					BCF OFF_CHAND,1		; УБЕРЕМ ФЛАГ ОКОНЧАНИЯ ЗАРЯДКИ
;********************************
NEXT_2	;******  2-КАНАЛ
	MOVLW 3
	XORWF CHANEL_2H,0
	BTFSS STATUS,Z
	GOTO ON_CH2
	; СТАРШИЙ БИТ РАЗРЯДА АЦП 3! - НОРМА. ПРОВЕРИМ МЛАДШИЙ РАЗРЯД
		MOVLW 10
		SUBWF CHANEL_2L,0
		BTFSC STATUS,C		; ЕСЛИ РЕЗУЛЬТАТ ОТРИЦАТЕЛЬНЫЙ, ТО ВКЛЮЧИМ ЗАРЯДКУ
		GOTO OFF_CH2
; ВКЛЮЧИТЬ ЗАРЯДКУ ПО 0 КАНАЛУ
ON_CH2			BTFSS OFF_CHAND,2	; ПРОВЕРИМ БИТ ОКОНЧАНИЯ ЗАРЯДКИ
			BSF CHAND,2		; ВКЛЮЧИМ ЗАРЯДКУ ПО О КАНАЛУ
			BTFSC OFF_CHAND,6
			BCF PORTC,2		; ВЫКЛЮЧИМ ПОРТ, ТАК КАК АККУМУЛЯТОРЫ ЕЩЕ НЕ ОТКЛЮЧИЛИ
			BTFSC OFF_CHAND,6
			BCF OFF_CHAND,6		; УБЕРЕМ ФЛАГ
			GOTO NEXT_3
OFF_CH2				BCF CHAND,2		; ВЫКЛЮЧИМ ЗАРЯДКУ ПО 2 КАНАЛУ
				CLRF TIMER_2		; ОЧИСТИМ ТАЙМЕР ТЕСТА
				CLRF END_TIMER_2	; ОЧИСТИМ ТАЙМЕР ОКНОЧАНИЯ ЗАРЯДКИ ПО ТАУМАУТУ
				BCF FIST_CHAND,2	; ОЧИСТИМ ФЛАГ ПЕРВОГО ПУСКА ЗАРЯДКИ
				BTFSS OFF_CHAND,6
				GOTO NEXT_3
					BCF OFF_CHAND,6 	; УБЕРЕМ ФЛАГ
					BCF FLAG_END_TIMER,2	; УБЕРЕМ ФЛАГ ТАЙМЕРА ВЫКЛЮЧЕНИЯ ЗАРЯДКИ
					BCF OFF_CHAND,2		; УБЕРЕМ ФЛАГ ОКОНЧАНИЯ ЗАРЯДКИ
;********************************
NEXT_3	;******  3-КАНАЛ
	MOVLW 3
	XORWF CHANEL_3H,0
	BTFSS STATUS,Z
	GOTO ON_CH3
	; СТАРШИЙ БИТ РАЗРЯДА АЦП 3! - НОРМА. ПРОВЕРИМ МЛАДШИЙ РАЗРЯД
		MOVLW 10
		SUBWF CHANEL_3L,0
		BTFSC STATUS,C		; ЕСЛИ РЕЗУЛЬТАТ ОТРИЦАТЕЛЬНЫЙ, ТО ВКЛЮЧИМ ЗАРЯДКУ
		GOTO OFF_CH3
; ВКЛЮЧИТЬ ЗАРЯДКУ ПО 0 КАНАЛУ
ON_CH3			BTFSS OFF_CHAND,3	; ПРОВЕРИМ БИТ ОКОНЧАНИЯ ЗАРЯДКИ
			BSF CHAND,3		; ВКЛЮЧИМ ЗАРЯДКУ ПО О КАНАЛУ
			BTFSC OFF_CHAND,7
			BCF PORTC,3		; ВЫКЛЮЧИМ ПОРТ, ТАК КАК АККУМУЛЯТОРЫ ЕЩЕ НЕ ОТКЛЮЧИЛИ
			BTFSC OFF_CHAND,7
			BCF OFF_CHAND,7		; УБЕРЕМ ФЛАГ
			RETURN
OFF_CH3				BCF CHAND,3		; ВЫКЛЮЧИМ ЗАРЯДКУ ПО 3 КАНАЛУ
				CLRF TIMER_3		; ОЧИСТИМ ТАЙМЕР ТЕСТА
				CLRF END_TIMER_3	; ОЧИСТИМ ТАЙМЕР ОКНОЧАНИЯ ЗАРЯДКИ ПО ТАУМАУТУ
				BCF FIST_CHAND,3	; ОЧИСТИМ ФЛАГ ПЕРВОГО ПУСКА ЗАРЯДКИ
				BTFSS OFF_CHAND,7
				RETURN
					BCF OFF_CHAND,7 	; УБЕРЕМ ФЛАГ
					BCF FLAG_END_TIMER,3	; УБЕРЕМ ФЛАГ ТАЙМЕРА ВЫКЛЮЧЕНИЯ ЗАРЯДКИ
					BCF OFF_CHAND,3		; УБЕРЕМ ФЛАГ ОКОНЧАНИЯ ЗАРЯДКИ
		RETURN
;------------------------------------------------------------------------------------------------------------------------
;------------------------------------------------------------------------------------------------------------------------

;------------------------------------------------------------------------------------------------------------------------
;------------------------------------------------------------------------------------------------------------------------
		END                       ; directive 'end of program'

