Пример программы для микроконтроллера PIC16F676

Нередко, бывает проще заменить неработающий логический узел с известным набором функций, но отсутствующей принципиальной схемой, на программируемый микроконтроллер. При этом программирование позволяет нам реализовать любые функции логического узла.

В данной публикации я покажу пример использования микроконтроллера PIC16F676 для замены части логической схемы в зарядном устройстве PRO-8. О подробностях ремонта PRO-8, я писал ранее. Где упоминалось о том, что для восстановления функционала устройства пришлось запрограммировать упомянутый микроконтроллер.

Далее речь пойдет о самой программе. Программа написана для  отслеживания и управления медленными процессами по трем  датчикам. Причём один канал — в данном варианте имеет два порога срабатывания: нижний порог служит для управления исполнительным устройством, а верхний порог служит для аварийного отключения устройства. В программе заложен таймер наработки устройства, который запоминает время поминутной работы включенного устройства и хранит до востребования это значение в EEPROM памяти. Одновременно сделана подпрограмма, которая  может выключить устройство после заданного времени наработки.

Прошивка может работать как с тремя каналами, так и с меньшим числом каналов, в зависимости от потребности. Пороги срабатывания на каналах можно задавать программно. Микросхема с прошивкой применялась  в сварочном аппарате для контроля  температуры силових элементов, пылевого загрязнения и контроля попадания влаги, образования конденсата. Далее эта же программа без изменений была использована в мощном зарядном устройстве – для контроля окончания заряда. Для разработчиков такая микросхема окажется полезной в  устройствах, где требуется  поддержка или регулирование нескольких параметров, а также контроль времени наработки устройства с заданием времени отключения устройства.

Текст программы FAZA.asm на ассемблере с комментариями смотри далее, а так же схемы включения микросхемы приведены ниже.


Схема стыковки датчиков с микроконтроллером

Рис 1. Схема стыковки датчиков с микроконтроллером


Программа представляет собой монитор на 4 датчика по уставкам (термин КИП-а — заданный предел измерения контролируемой величины максимум или минимум). 3 канала работают на выход ALARM общий независимо друг от друга — это ВХ 0,1,2. Также они выдают номер канала. 3Й канал не влияет на общий ALARM, он служит для регулятора по каналу 2. Уставки задаются программно, в виде строковой константы в виде точки и трех десятичных разрядов. Например, .250 СООТВЕТСТВУЕТ 2,5 вольта от соответствующего датчика.

Включение микроконтроллера в качестве счетчика наработки

Рис 2. Включение микроконтроллера в качестве счетчика наработки

Прокомментирую рис. 2. При нажатии кнопки «Пуск» происходит захват подпрограммы вывода числа импульсов, соответствующих времени наработки прибора в минутах. Подключенный счетчик импульсов высветит время наработки прибора в минутах.

После выдачи импульсов, счет останавливается, и для  того чтобы запустить счет импульсов вновь, скажем, для повтора — необходимо выключить и снова включить питание микросхемы и снова нажать кнопку «Пуск».

Рис 3. Контроль времени наработки (вкл и выкл)

Встроен «чёрный ящик» — программный счетчик наработки прибора. Емкость счетчика равна 16777216 мин (hx1000000) или 279620 ЧАСА или 34952 рабочих смен по 8 часов или 95 лет односменной работы. Хранение времени наработки производится в трех ячейках EEPROM с адресами 0,1,2. Отсчет времени ведется каждый раз, когда прибор подключают к сети питания. Показания счетчика можно вывести на внешний прибор (например, на цифровой счетчик с индикаторами). Можно по желанию ограничить время наработки (к примеру, для проведения плановых профилактических мероприятий), установив это значение в программе.

;ЗА ОСНОВУ ВЗЯТА ПРОГРАММА FAZA.ASM АВТОРА
;Заец Н.И.( saes@mail.ru)
;ПРОГРАММА ДОРАБОТАНА ДЛЯ ПРИМЕНЕНИЯ
;В РАЗЛИЧНЫХ УСТРОЙСТВАХ И УНИВЕРСАЛЬНА
;В ДАННОМ  ВАРИАНТЕ РАБОТАЕТ
;ДЛЯ ЗАЩИТЫ СХЕМЫ СИЛОВОГО ИНВЕРТОРА СВАРОЧНОГО АППАРАТА
;И РАБОТАЕТ ПО ДАТЧИКАМ РОСЫ, ПЫЛИ И ТЕМПЕРАТУРЫ
;ДОРАБОТАЛ ПРОГРАММУ  Король Л.Ю. (korol.leonid@mail.ru)
;ПРОГРАММА:  FAZA.asm
;ВЕРСИЯ: 25-10-2009
;АССЕМБЛЕР И ОТЛАДЧИК: MPLAB IDE, ВЕРСИЯ: 7.20
;
            #INCLUDE
            __CONFIG 3FF4H
;====================================================
; ИСПОЛЬЗУЕТСЯ ВНУТРЕННИЙ ГЕНЕРАТОР ЧАСТОТОЙ 4,0 MГц.
;====================================================
 
;=========================================
; РЕГИСТРЫ РСН.
;=========================================
INDF     EQU  00H  ;ДОСТУП К ПАМЯТИ ЧЕРЕЗ FSR.
TIMER0   EQU  01H  ;TMR0.
OPTION_REG    EQU  81H  ;OPTION (RP0=1).
PC       EQU  02H  ;СЧЕТЧИК КОМАНД.
STATUS   EQU  03H  ;РЕГИСТР СОСТОЯНИЯ АЛУ.
FSR      EQU  04H  ;РЕГИСТР КОСВЕННОЙ АДРЕСАЦИИ.
PORTA    EQU  05H  ;ПОРТ А ВВОДА/ВЫВОДА.
PORTC    EQU  07H  ;ПОРТ C ВВОДА/ВЫВОДА.
TRISA    EQU  85H  ;НАПРАВЛЕНИЯ ДАННЫХ ПОРТА А.
TRISC    EQU  87H  ;НАПРАВЛЕНИЯ ДАННЫХ ПОРТА C.
INTCON   EQU  0BH  ;РЕГИСТР ФЛАГОВ ПРЕРЫВАНИЙ.
PIR1     EQU  0CH  ;РАЗРЕШЕНИЯ ПЕРИФЕРИЙНЫХ ПРЕРЫВАНИЙ.
PIE1     EQU  8CH  ;РЕГИСТР РАЗРЕШЕНИЯ ПЕРИФЕРИЙНЫХ ПРЕРЫВАНИЙ.
TMR1L    EQU  0EH  ;МЛАДШИЙ РЕГИСТР  ТАЙМЕРА 1.
TMR1H    EQU  0FH  ;СТАРШИЙ РЕГИСТР  ТАЙМЕРА 1.
T1CON    EQU  10H  ;РЕГИСТР УПРАВЛЕНИЯ ТАЙМЕРОМ 1.
CMCON    EQU  19H  ;РЕГИСТР УПРАВЛЕНИЯ КОМПАРАТОРОМ.
VRCON    EQU  99H  ;РЕГИСТР ИСТОЧНИКА ОПОРНОГО НАПРЯЖЕНИЯ.
PCON     EQU  8EH  ;КОНТРОЛЬ НАПРЯЖЕНИЯ.
OSCCAL   EQU  90H  ;
ANSEL    EQU  91H  ;ВЫБОР АНАЛОГОВОГО ВХОДА.
WPUA     EQU  95H  ;ВКЛЮЧЕНИЯ ПОДТЯГИВАЮЩИХ РЕЗИСТОРОВ.
IOCA     EQU  96H  ;РАЗРЕШЕНИЕ ПРЕРЫВАНИЙ ПО ИЗМ. СИГН. НА ВХОДАХ А.
ADRESH   EQU  1EH  ;СТАРШИЙ РЕГИСТР АЦП.
ADRESL   EQU  9EH  ;МЛАДШИЙ РЕГИСТР АЦП.
ADCON0	 EQU  1FH  ;УПРАВЛЕНИЯ АЦП.
ADCON1	 EQU  9FH  ;ВЫБОР ТАКТИРОВАНИЯ АЦП.
EEDAT    EQU  9AH ;РЕГИСТР ОБМЕНА  ДАННЫМИ C EEPROM
EEADR    EQU  9BH  ;РЕГИСТР ЗАДАНИЯ  ЯЧЕЙКИ  АДРЕСА В  EEPROM
EECON1   EQU  9CH  ;РЕГИСТР УПРАВЛЕНИЯ EEPROM
EECON2   EQU  9DH  ;РЕГИСТР УПРАВЛЕНИЯ EEPROM
;===========================================
; ОПРЕДЕЛЕНИЕ РОН.
;=====================================================================
TEKH	EQU 20H   ;ДВОИЧНОЕ ИЗМЕРЕННОЕ ЗНАЧЕНИЕ НАПРЯЖЕНИЯ.
TEKL	EQU 21H   ;старший  и  младший  регистры.
YCTA	EQU 22H	  ;УСТАНОВЛЕННОЕ  МАКСИМАЛЬНОЕ ЗНАЧЕНИЕ ПАРАМЕТРА
YCTI	EQU 23H	  ;УСТАНОВЛЕННОЕ  МИНИМАЛЬНОЕ  ЗНАЧЕНИЕ ПАРАМЕТРА
 
RAB0	EQU 24H   ;РОСА
RAB1	EQU 25H   ;ПЫЛЬ
RAB2	EQU 26H	  ;ПРЕДЕЛЬНАЯ  ТЕМПЕРАТУРА
RAB3	EQU 27H   ;РЕГУЛЯТОР  ОХЛАЖДЕНИЯ
RAB4    EQU 28H   ;РАБОЧАЯ  ЯЧЕЙКА 1ГО  СЧ-КА
RAB5    EQU 29H   ;РАБОЧАЯ  ЯЧЕЙКА 2ГО  СЧ-КА
RAB6    EQU 2AH   ;РАБОЧАЯ  ЯЧЕЙКА МИНУТЫ
RAB7    EQU 2BH   ;РАБОЧАЯ  ЯЧЕЙКА ЧАСА
BUM0    EQU 2CH   ;БУФЕР НУЛЕВОГО БАЙТА  МИНУТ
BUM1    EQU 2DH   ;БУФЕР ПЕРВОГО  БАЙТА  МИНУТ
BUM2    EQU 2EH   ;БУФЕР ВТОРОГО  БАЙТА  МИНУТ
BUM3    EQU 2FH   ;БУФЕР ТРЕТЬЕГО БАЙТА  МИНУТ
DBUM0   EQU 30H   ;ДУБЛЬ БУФЕРА НУЛЕВОГО БАЙТА  МИНУТ ДЛЯ ВЫВОДА В ИНДИКАТОР
DBUM1   EQU 31H   ;ДУБЛЬ БУФЕРА ПЕРВОГО БАЙТА  МИНУТ ДЛЯ ВЫВОДА В ИНДИКАТОР
DBUM2   EQU 32H   ;ДУБЛЬ БУФЕРА ВТОРОГО БАЙТА  МИНУТ ДЛЯ ВЫВОДА В ИНДИКАТОР
DBUM3   EQU 33H   ;ДУБЛЬ БУФЕРА ТРЕТЬЕГО БАЙТА  МИНУТ ДЛЯ ВЫВОДА В ИНДИКАТОР
RAB8    EQU 34H   ;РАБОЧАЯ  ЯЧЕЙКА  СЧЁТЧИКА  255 (11111111) ИЛИ 0FFH
RAB9    EQU 35H   ;РАБОЧАЯ  ЯЧЕЙКА  СЧЁТЧИКА  255 (11111111) ИЛИ 0FFH
TR0     EQU 36H   ;TR0
TR1     EQU 37H   ;TR1
TR2     EQU 38H   ;TR2
TR3     EQU 39H   ;TR3
CONST1  EQU 3AH   ;FF  ДЛЯ  СЧЁТЧИКА  ПОБАЙТНОГО  ВЫВОДА
CONST2  EQU 3BH   ;FF
CONST3  EQU 3CH   ;FF
;=====================================================================
;  1.  ПУСК
;=====================================================================
         ORG   0
         GOTO       INIT
         NOP
         NOP
         NOP
         NOP
         NOP
;=====================================================================
;  2.   ИНИЦИАЛИЗАЦИЯ .
;=====================================================================
INIT
         BSF        STATUS,5           ;БАНК1.
         CLRF       OSCCAL^0x90        ;МАКСИМАЛЬНАЯ  ЧАСТОТА.
         MOVLW      0FFH               ;СИГНХРОНИЗАЦИЯ  ОТ  RC.
         MOVWF       ADCON1            ;ТАКТ АЦП ОТ внутреннего генератора 500 кГц
         MOVLW      B'10000000'        ;К=4
         MOVWF      OPTION_REG^80H     ;РЕЗИСТОРЫ  ВЫКЛЮЧЕНЫ.
         CLRF       INTCON             ;
         CLRF       PIE1^80H           ;ЗАПРЕЩЕНЫ ВСЕ ПЕРИФЕРИЙНЫЕ ПРЕРЫВАНИЯ
         MOVLW      B'00111111'        ;ВСЕ  ВХОДЫ  *********
         MOVWF      TRISA^80H          ;
         CLRF       TRISC^80H          ;ВСЕ  ВЫХОДЫ .
         CLRF       VRCON^80H          ;ИОН ОТКЛЮЧЕН .
         CLRF       PCON^80H           ;ПРЕРЫВАНИЯ  ПО  ПИТАНИЮ   ЗАПРЕЩЕНЫ.
         CLRF       WPUA^80H           ;ПОДТЯГИВАЮЩИЕ РЕЗИСТОРЫ  ВЫКЮЧЕНЫ.
         CLRF       IOCA^80H           ;ПРЕРЫВАНИЯ  ЗАПРЕЩЕНЫ.
         MOVLW      .1                 ;
         MOVWF      ANSEL^80H          ;ВЫБРАН АНАЛОГОВЫЙ ВХОД  RA0/AN0.
         BCF        STATUS,5           ;ПЕРЕХОДИМ  В  БАНК 0.
         CLRF       PORTC              ;ВЫХОД И  СВЕТОДИОД  ВЫКЛЮЧЕНЫ.
         CLRF       T1CON              ;ТАЙМЕР 1 ОТКЛЮЧЕН.
         MOVLW      .7                 ;
         MOVWF      CMCON              ;КОМПАРАТОР  ВЫКЛЮЧЕН.
 
         CLRF       BUM0
         CLRF       BUM1
         CLRF       BUM2
         CLRF       DBUM0
         CLRF       DBUM1
         CLRF       DBUM2
 
         MOVLW      B'00111100'       ;ЗАПИШЕМ ЧИСЛО  60  В  ДВОИЧНОМ  КОДЕ
         MOVWF      RAB6              ;В ЯЧЕЙКУ  RAB6 это  ячейка делителя
                                    ;секунд для  получения  минутного  им
                                    ;пульса
         CLRF       RAB7
 
         BSF        STATUS,5
         MOVLW      00H                ;
         MOVWF      EEADR              ;ЗАДАЁМ  АДРЕС 00H ЧТЕНИЯ ИЗ EEPROM
         MOVLW      B'00000001'        ;РАЗРЕШАЕМ  ЧТЕНИЕ ИЗ EEPROM
         MOVWF      EECON1             ;
         MOVFW      EEDATA             ;читаем данные через служ. регистр EEDATA
         BCF        STATUS,5           ;БАНК 0
         MOVWF      BUM0               ;
         MOVLW      01H                ;заносим константу для правильной работы
         ADDWF      BUM0               ;программы
      ; goto      INDIC             ;ТЕХНОЛОГИЧЕСКАЯ  КОМАНДА
 
         BSF        STATUS,5
         MOVLW      01H
         MOVWF      EEADR              ; ЗАДАЁМ АДРЕС 01 ЧТЕНИЯ ИЗ EEPROM
         MOVLW      B'00000001'        ; РАЗРЕШАЕМ  ЧТЕНИЕ ИЗ EEPROM
         MOVWF      EECON1             ;
         MOVFW      EEDATA             ; ЧИТАЕМ ДАННЫЕ ЧЕРЕЗ СЛУЖ РЕГИСТР EEDATA
         BCF        STATUS,5           ; БАНК 0
         MOVWF      BUM1               ;
       ;goto      INDIC             ;ТЕХНОЛОГИЧЕСКАЯ  КОМАНДА
 
         BSF        STATUS,5
         MOVLW      02H                ;
         MOVWF      EEADR              ; ЗАДАЁМ  АДРЕС 02H ЧТЕНИЯ ИЗ EEPROM
         MOVLW      B'00000001'        ; РАЗРЕШАЕМ  ЧТЕНИЕ ИЗ EEPROM
         MOVWF      EECON1             ;
         MOVFW      EEDATA             ; ЧИТАЕМ ДАННЫЕ  ЧЕРЕЗ СЛУЖ  РЕГИСТР EEDATA
         BCF        STATUS,5           ; БАНК 0
         MOVWF      BUM2               ;
     ; goto       INDIC              ;ТЕХНОЛОГИЧЕСКАЯ  КОМАНДА
 
ADP0
         MOVLW      .250               ;МАКСИМУМ  РОСА .
         MOVWF      YCTA               ;
         MOVLW      .120               ;МИНИМУМ   РОСА .
         MOVWF      YCTI               ;
;=====================================================================
;  3.  АЦП - ПРЕОБРАЗОВАНИЕ  (ИЗМЕРЕНИЕ ВХОДНЫХ  ВЕЛИЧИН ).
;=====================================================================
 
         MOVLW	B'10000001'	;СИНХРОНИЗАЦИЯ ОТ  RC- ГЕНЕРАТОРА--------.
 
         MOVWF	ADCON0		;ВХОД 0, ВКЛЮЧЕНИЕ АЦП (YBX)=============.
                                ;ПРАВОЕ  ВЫРАВНИВАНИЕ.
 
	 CALL	ZAD		; ЗАДЕРЖКА  100МКСЕК.
 
         BSF	ADCON1,1	;ВКЛЮЧИМ ПРЕОБРАЗОВАНИЕ******.
         BTFSC   ADCON1,1        ;ОЖИДАЕМ  ЗАВЕРШЕНИЯ.
         GOTO	$-1          	;ПРЕОБРАЗОВАНИЯ.
         MOVFW	ADRESH       	;ПЕРЕПИШЕМ РЕЗУЛЬТАТ ПРЕОБРАЗОВАНИЯ.
         MOVWF	TEKH		;В СТАРШИЙ ТЕКУЩИЙ РЕГИСТР.
         BTFSc  TEKH,1           ;ЕСЛИ 1 РАЗРЯД  РАВЕН 1 ТО  ПЕРЕПОЛНЕНИЕ.
         GOTO   ADPU0            ;ВЫКЛЮЧИТЬ  ВЫХОД .
         BSF     STATUS,5        ;ПЕРЕХОДИМ  В  БАНК 1.
 
	 MOVLW	21		;ЗАПИСЬ  В  РЕГИСТР  TEKL.
 	 MOVWF	FSR		;ПО КОСВЕННОЙ АДРЕСАЦИИ.
 	 MOVFW	ADRESL		;ЗАПИСЬ МЛ. РЕГИСТРА АЦП.
         MOVWF	INDF		;В РЕГИСТР TEKL.
	 BCF	STATUS,5	;ПЕРЕХОДИМ В БАНК 0.******
         BCF     STATUS,0        ;ОБНУЛЯЕМ  БИТ  ПЕРЕНОСА.
         RRF     TEKH,1          ;СДВИГАЕМ  ВПРАВО.
         RRF     TEKL,1          ;ЧТОБЫ  СРАВНИТЬ  8  РАЗРЯДОВ .
         MOVFW   YCTA            ;СРАВНИМ  ТЕКУЩЕЕ  ЗНАЧЕНИЕ .
         SUBWF   TEKL,0          ;НА  ПРЕВЫШЕНИЕ  ПО МАКСИМУМУ.
         BTFSC   STATUS,0        ;ЕСЛИ  ЕСТЬ  ПРЕВЫШЕНИЕ.
         GOTO    ADPU0           ;ТО ВЫКЛЮЧИМ ВЫХОД .
 
         MOVFW   YCTI            ;СРАВНИМ ТЕКУЩЕЕ ЗНАЧЕНИЕ.
         SUBWF   TEKL,0          ;НА  ПРЕВЫШЕНИЕ  ПО  МИНИМУМУ.
         BTFSS   STATUS,0        ;ЕСЛИ  МЕНЬШЕ МЕНЬШЕГО
         GOTO    ADPU0
         MOVLW   B'11111111'     ;НОРМА  ПО  ВХ 0
         MOVWF   RAB0
         BCF     PORTC,5
         GOTO    ADP1           ;ПРОВЕРКА НА  ПЫЛЬ
 
ADPU0
         BSF     PORTC,5         ;ВКЛ  ALARM ПО РОСЕ   ***************.
         BCF     PORTC,0         ;ВЫКЛЮЧИМ  ВЫХОД  общий ПО  РОСЕ.
         BSF     PORTC,1         ;ВКЛ  ALARM ОБЩИЙ   ***************.
         MOVLW   B'00000000'
         MOVWF   RAB0
         GOTO    ADP1
 
ZAD
         MOVLW	.25		;ЗАДЕРЖКА 100 МКС.
	 ADDLW	-1		;
	 BTFSS	STATUS,2	;
	 GOTO	$-2		;
	 RETURN
 
ADP1
         MOVLW      .250               ;МАКСИМУМ  ПЫЛЬ .
         MOVWF      YCTA               ;
         MOVLW      .160               ;МИНИМУМ   ПЫЛЬ .
         MOVWF      YCTI               ;
;=====================================================================
;  3.  АЦП - ПРЕОБРАЗОВАНИЕ  (ИЗМЕРЕНИЕ ВХОДНЫХ  ВЕЛИЧИН ).
;=====================================================================
 
         MOVLW	B'10000101'	;СИНХРОНИЗАЦИЯ ОТ  RC- ГЕНЕРАТОРА--------.
 
         MOVWF	ADCON0		;ВХОД 1, ВКЛЮЧЕНИЕ АЦП (YBX)=============.
                                ;ПРАВОЕ  ВЫРАВНИВАНИЕ.
 
	 CALL	ZAD		; ЗАДЕРЖКА  100МКСЕК.
 
         BSF	ADCON1,1	;ВКЛЮЧИМ ПРЕОБРАЗОВАНИЕ******.
         BTFSC   ADCON1,1        ;ОЖИДАЕМ  ЗАВЕРШЕНИЯ.
         GOTO	$-1          	;ПРЕОБРАЗОВАНИЯ.
         MOVFW	ADRESH       	;ПЕРЕПИШЕМ РЕЗУЛЬТАТ ПРЕОБРАЗОВАНИЯ.
         MOVWF	TEKH		;В СТАРШИЙ ТЕКУЩИЙ РЕГИСТР.
         BTFSc   TEKH,1          ;ЕСЛИ 1 РАЗРЯД  РАВЕН 1 ТО  ПЕРЕПОЛНЕНИЕ.
         GOTO    ADPU1           ;ВЫКЛЮЧИТЬ  ВЫХОД .
         BSF     STATUS,5        ;ПЕРЕХОДИМ  В  БАНК 1.
 
 	 MOVLW	21		;ЗАПИСЬ  В  РЕГИСТР  TEKL.
 	 MOVWF	FSR		;ПО КОСВЕННОЙ АДРЕСАЦИИ.
 	 MOVFW	ADRESL		;ЗАПИСЬ МЛ. РЕГИСТРА АЦП.
 	 MOVWF	INDF		;В РЕГИСТР TEKL.
         BCF	STATUS,5	;ПЕРЕХОДИМ В БАНК 0.
         BCF     STATUS,0        ;ОБНУЛЯЕМ  БИТ  ПЕРЕНОСА.
         RRF     TEKH,1          ;СДВИГАЕМ  ВПРАВО.
         RRF     TEKL,1          ;ЧТОБЫ  СРАВНИТЬ  8  РАЗРЯДОВ .
         MOVFW   YCTA            ;СРАВНИМ  ТЕКУЩЕЕ  ЗНАЧЕНИЕ .
         SUBWF   TEKL,0          ;НА  ПРЕВЫШЕНИЕ  ПО МАКСИМУМУ.
         BTFSC   STATUS,0        ;ЕСЛИ  ЕСТЬ  ПРЕВЫШЕНИЕ.
         GOTO    ADPU1            ;ТО ВЫКЛЮЧИМ  ВЫХОД
 
         MOVFW   YCTI            ;СРАВНИМ ТЕКУЩЕЕ ЗНАЧЕНИЕ.
         SUBWF   TEKL,0          ;НА  ПРЕВЫШЕНИЕ  ПО  МИНИМУМУ.
         BTFSS   STATUS,0        ;ЕСЛИ  МЕНЬШЕ МЕНЬШЕГО.
         GOTO    ADPU1
                                ;ТО ВЫКЛЮЧИМ ВЫХОД.
         MOVLW   B'11111111'
         MOVWF    RAB1
         BCF     PORTC,4         ;ВЫКЛ ALARM по ПЫЛИ    ************
 
         GOTO    ADP2
 
ADPU1
         BSF     PORTC,4         ;ВКЛ  ALARM ПО  ПЫЛИ  ***************.
         BCF     PORTC,0         ;ВЫКЛЮЧИМ  ВЫХОД  общий  ПО  ПЫЛИ
         BSF     PORTC,1         ;ВКЛ  ALARM ОБЩИЙ   ***************.
         MOVLW   B'00000000'
         MOVWF   RAB1
 
         GOTO    ADP2
 
ADP2
 
         MOVLW      .250               ;МАКСИМУМ  T .
         MOVWF      YCTA               ;
         MOVLW      .160               ;МИНИМУМ   T .
         MOVWF      YCTI               ;
;=====================================================================
;  3.  АЦП - ПРЕОБРАЗОВАНИЕ  (ИЗМЕРЕНИЕ ВХОДНЫХ  ВЕЛИЧИН ).
;=====================================================================
 
         MOVLW	B'10001001'	;СИНХРОНИЗАЦИЯ ОТ  RC- ГЕНЕРАТОРА--------.
 
         MOVWF	ADCON0		;ВХОД 2, ВКЛЮЧЕНИЕ АЦП (YBX)=============.
                                ;ПРАВОЕ  ВЫРАВНИВАНИЕ.
 
	 CALL	ZAD		; ЗАДЕРЖКА  100МКСЕК.
 
         BSF	ADCON1,1	;ВКЛЮЧИМ ПРЕОБРАЗОВАНИЕ******.
         BTFSC   ADCON1,1        ;ОЖИДАЕМ  ЗАВЕРШЕНИЯ.
         GOTO	$-1          	;ПРЕОБРАЗОВАНИЯ.
         MOVFW	ADRESH       	;ПЕРЕПИШЕМ РЕЗУЛЬТАТ ПРЕОБРАЗОВАНИЯ.
         MOVWF	TEKH		;В СТАРШИЙ ТЕКУЩИЙ РЕГИСТР.
         BTFSc   TEKH,1          ;ЕСЛИ 1 РАЗРЯД  РАВЕН 1 ТО  ПЕРЕПОЛНЕНИЕ.
         GOTO    ADPU2           ;ВЫКЛЮЧИТЬ  ВЫХОД .
         BSF     STATUS,5        ;ПЕРЕХОДИМ  В  БАНК 1.
 
 	 MOVLW	21		;ЗАПИСЬ  В  РЕГИСТР  TEKL.
 	 MOVWF	FSR		;ПО КОСВЕННОЙ АДРЕСАЦИИ.
         MOVFW	ADRESL		;ЗАПИСЬ МЛ. РЕГИСТРА АЦП.
 	 MOVWF	INDF		;В РЕГИСТР TEKL.
         BCF	STATUS,5	;ПЕРЕХОДИМ В БАНК 0.
         BCF     STATUS,0        ;ОБНУЛЯЕМ  БИТ  ПЕРЕНОСА.
         RRF     TEKH,1          ;СДВИГАЕМ  ВПРАВО.
         RRF     TEKL,1          ;ЧТОБЫ  СРАВНИТЬ  8  РАЗРЯДОВ .
         MOVFW   YCTA            ;СРАВНИМ  ТЕКУЩЕЕ  ЗНАЧЕНИЕ .
         SUBWF   TEKL,0          ;НА  ПРЕВЫШЕНИЕ  ПО МАКСИМУМУ.
         BTFSC   STATUS,0        ;ЕСЛИ  ЕСТЬ  ПРЕВЫШЕНИЕ.
         GOTO    ADPU2            ;ТО ВЫКЛЮЧИМ  ВЫХОД
 
         MOVFW   YCTI            ;СРАВНИМ ТЕКУЩЕЕ ЗНАЧЕНИЕ.
         SUBWF   TEKL,0          ;НА  ПРЕВЫШЕНИЕ  ПО  МИНИМУМУ.
         BTFSS   STATUS,0        ;ЕСЛИ  МЕНЬШЕ МЕНЬШЕГО.
         GOTO    ADPU2          ;ТО ВЫКЛЮЧИМ ВЫХОД
         MOVLW   B'11111111'
         MOVWF    RAB2
         BCF     PORTC,3         ;ВЫКЛ ALARM по T   ************
 
         GOTO     ADP3
 
ADPU2
         BSF     PORTC,3         ;ВКЛ  ALARM ПО  T  ***************.
         BCF     PORTC,0         ;ВЫКЛЮЧИМ  ВЫХОД  общий  ПО T
         BSF     PORTC,1         ;ВКЛ  ALARM ОБЩИЙ   ***************.
         MOVLW   B'00000000'
         MOVWF   RAB2
 
         GOTO    ADP3 
 
         BCF      STATUS,5
 
ADP3
         MOVLW      .220               ;МАКСИМУМ  TREG .
         MOVWF      YCTA               ;
         MOVLW      .170               ;МИНИМУМ   TREG .
         MOVWF      YCTI               ;
;=====================================================================
;  3.  АЦП - ПРЕОБРАЗОВАНИЕ  (ИЗМЕРЕНИЕ ВХОДНЫХ  ВЕЛИЧИН ).
;=====================================================================
 
         MOVLW	B'10001001'	;СИНХРОНИЗАЦИЯ ОТ  RC- ГЕНЕРАТОРА--------.
 
         MOVWF	ADCON0		;ВХОД 2, ВКЛЮЧЕНИЕ АЦП (YBX)=============.
                                ;ПРАВОЕ  ВЫРАВНИВАНИЕ.
 
	 CALL	ZAD		; ЗАДЕРЖКА  100МКСЕК.
 
         BSF	ADCON1,1	;ВКЛЮЧИМ ПРЕОБРАЗОВАНИЕ******.
         BTFSC   ADCON1,1        ;ОЖИДАЕМ  ЗАВЕРШЕНИЯ.
         GOTO	$-1          	;ПРЕОБРАЗОВАНИЯ.
         MOVFW	ADRESH       	;ПЕРЕПИШЕМ РЕЗУЛЬТАТ ПРЕОБРАЗОВАНИЯ.
         MOVWF	TEKH		;В СТАРШИЙ ТЕКУЩИЙ РЕГИСТР.
         BTFSc   TEKH,1          ;ЕСЛИ 1 РАЗРЯД  РАВЕН 1 ТО  ПЕРЕПОЛНЕНИЕ.
         GOTO    ADPU3           ;ВЫКЛЮЧИТЬ  ВЫХОД .
         BSF     STATUS,5        ;ПЕРЕХОДИМ  В  БАНК 1.
 
         MOVLW	21		;ЗАПИСЬ  В  РЕГИСТР  TEKL.
	 MOVWF	FSR		;ПО КОСВЕННОЙ АДРЕСАЦИИ.
         MOVFW	ADRESL		;ЗАПИСЬ МЛ. РЕГИСТРА АЦП.
 	 MOVWF	INDF		;В РЕГИСТР TEKL.
         BCF	STATUS,5	;ПЕРЕХОДИМ В БАНК 0.
         BCF     STATUS,0        ;ОБНУЛЯЕМ  БИТ  ПЕРЕНОСА.
         RRF     TEKH,1          ;СДВИГАЕМ  ВПРАВО.
         RRF     TEKL,1          ;ЧТОБЫ  СРАВНИТЬ  8  РАЗРЯДОВ .
         MOVFW   YCTA            ;СРАВНИМ  ТЕКУЩЕЕ  ЗНАЧЕНИЕ .
         SUBWF   TEKL,0          ;НА  ПРЕВЫШЕНИЕ  ПО МАКСИМУМУ.
         BTFSC   STATUS,0        ;ЕСЛИ  ЕСТЬ  ПРЕВЫШЕНИЕ.
         GOTO    ADPU3           ;ТО ВЫКЛЮЧИМ  ВЫХОД
 
         MOVFW   YCTI            ;СРАВНИМ ТЕКУЩЕЕ ЗНАЧЕНИЕ.
         SUBWF   TEKL,0          ;НА  ПРЕВЫШЕНИЕ  ПО  МИНИМУМУ.
         BTFSS   STATUS,0        ;ЕСЛИ  МЕНЬШЕ МЕНЬШЕГО.
         GOTO    ADPU3          ;ТО ВЫКЛЮЧИМ ВЫХОД
         MOVLW   B'11111111'
         MOVWF    RAB3
         BCF     PORTC,2         ;ВЫКЛ ВЫХ REG по T   ************
 
         GOTO     PROV
 
ADPU3
         BSF     PORTC,2         ;ВКЛ  ВЫХ  REG ПО  T  ***************.
         MOVLW   B'00000000'
         MOVWF   RAB3
 
         GOTO    PROV 
 
         BCF      STATUS,5
 
PROV
         BTFSS   PORTA,5        ;ПРОВЕРКА  СОСТОЯНИЯ  ВХОДА ПОРТА А(5)
         GOTO    INDIC         ;(НАЖАТИЕ  КНОПКИ A(5)=0) )ДЛЯ   ПРОВЕРКИ СЧЁТЧИКА
                               ;НАРАБОТКИ
 
        ;GOTO    PROV1        ;ТЕХНОЛОГИЧЕСКАЯ  КОМАНДА
 
        ;GOTO     $            ;мигание  светодиода portc2 с
        ;BSF      PORTC,2      ;частотой 1герц
         CALL     PAUSE        ;
         CALL     PAUSE        ;мигание  убирается после отладки
        ;BCF      PORTC,2      ; программы
         CALL     PAUSE        ;
         CALL     PAUSE        ;
         CALL     PAUSE        ;
 
         DECF     RAB6,1       ;ПОЛУЧЕНИЕ МИНУТЫ  В  КРУГОВОМ ЦИКЛЕ
         BTFSS    STATUS,2     ;
         GOTO     PROV1
 
         INCF     BUM0,1       ;ЗДЕСЬ НАЧИНАЕТСЯ  ПОДСЧЁТ  МИНУТ НАРАБОТКИ
         BTFSS    STATUS,2     ;В  ДВОИЧНОМ  ВИДЕ
         GOTO     WR3BYTE      ;
 
         INCF     BUM1,1       ;
         BTFSS    STATUS,2     ;
         GOTO     WR3BYTE      ;
 
         INCF     BUM2,1       ;
         BTFSS    STATUS,2     ;
         GOTO     WR3BYTE      ;
 
         GOTO     PROV1        ;НА  ПРОВЕРКУ  ЗАДАННОГО ВРЕМЕНИ НАРАБОТКИ
WR3BYTE
         BSF      STATUS,5     ; БАНК 1
         MOVLW    00H          ; ЗАДАТЬ АДРЕС  EEPROM
         MOVWF    EEADR        ; ЧЕРЕЗ  РЕГИСТР EEADR
         BCF      STATUS,5     ; БАНК 0
         MOVFW    BUM0         ; ЗАДАТЬ ДАННЫЕ EEPROM
         BSF      STATUS,5     ; БАНК 1
         MOVWF    EEDATA       ; ЧЕРЕЗ  РЕГИСТР EEDATA
         CALL     EEWR         ; ЗАПИСЬ
 
        ;GOTO     PROV1       ;ТЕХНОЛОГИЧЕСКАЯ  КОМАНДА
 
         BsF      STATUS,5     ; БАНК 1
         MOVLW    01H          ; ЗАДАТЬ АДРЕС  EEPROM
         MOVWF    EEADR        ; ЧЕРЕЗ  РЕГИСТР EEADR
         BCF      STATUS,5     ; БАНК 0
         MOVFW    BUM1         ; ЗАДАТЬ ДАННЫЕ EEPROM
         BsF      STATUS,5     ; БАНК 1
         MOVWF    EEDATA       ; ЧЕРЕЗ  РЕГИСТР EEDATA
         CALL     EEWR         ; ЗАПИСЬ
 
         BsF      STATUS,5     ; БАНК 1
         MOVLW    02H          ; ЗАДАТЬ АДРЕС  EEPROM
         MOVWF    EEADR        ; ЧЕРЕЗ  РЕГИСТР EEADR
         BCF      STATUS,5     ; БАНК 0
         MOVFW    BUM2         ; ЗАДАТЬ ДАННЫЕ EEPROM
         BsF      STATUS,5     ; БАНК 1
         MOVWF    EEDATA       ; ЧЕРЕЗ  РЕГИСТР EEDATA
         CALL     EEWR         ; ЗАПИСЬ
 
         MOVLW    B'00111100'  ;ВОССТАНОВИМ ЧИСЛО  60  В СЧЕТЧИКЕ  RAB6
         MOVWF    RAB6         ;
 
         GOTO     PROV1        ;НА  ПРОВЕРКУ  ЗАДАННОГО ВРЕМЕНИ НАРАБОТКИ
 
EEWR
         BSF      STATUS,5     ;БАНК 1
         BCF      INTCON,7     ;ЗАПРЕТ  ВСЕХ ПРЕРЫВАНИЙ
         BSF      EECON1,WREN  ;РАЗРЕЩЕНИЕ ЗАПИСИ
         MOVLW    55H          ;СТРОГО
         MOVWF    EECON2^80H   ;  ЗАДАННАЯ
         MOVLW    0AAH         ;    ПОСЛЕДОВАТЕЛЬНОСТЬ
         MOVWF    EECON2^80H   ;      КОМАНД
         BSF      EECON1^80H,WR;НАЧИНАЕМ   ЗАПИСЬ
         BTFSC    EECON1^80H,WR;ЗАПИСЬ ЗАВЕРШЕНА ?
         GOTO     $-1          ;НЕТ
         BCF      EECON1,WREN  ;ЗАПРЕТ   ЗАПИСИ
         BSF      INTCON,7     ;РАЗРЕШАЕМ ПРЕРЫВАНИЯ
         BCF      STATUS,5     ;БАНК 0
 
         RETURN
 
          GOTO    PROV1
 
INDIC
         BCF      PORTC,0    ;ВЫКЛЮЧИТЬ АППАРАТ
         BCF      STATUS,5   ;БАНК 0
         MOVFW    BUM0       ;СОЗДАЁМ ДУБЛЬ БУФЕРА
         MOVWF    DBUM0      ;МИНУТ НУЛЕВОГО БАЙТА
 
         BCF      STATUS,5   ;БАНК 0
         MOVFW    BUM1       ;СОЗДАЁМ ДУБЛЬ БУФЕРА
         MOVWF    DBUM1      ;МИНУТ ПЕРВОГО  БАЙТА
 
         BCF      STATUS,5   ;БАНК 0
         MOVFW    BUM2       ;СОЗДАЁМ ДУБЛЬ БУФЕРА
         MOVWF    DBUM2      ;МИНУТ ВТОРОГО  БАЙТА
 
M0     CALL    BYBOD    ;ВЫВОД НУЛЕВОГО (МЛАДШЕГО БАЙТА СЧЁТЧИКА НАРАБОТКИ МИНУТ)
         DECF   DBUM0     ;В  PORTC,1
         BTFSS  STATUS,2  ;
         GOTO     M0      ;
 
         MOVF    DBUM1,1  ;ПРОВЕРЯЕМ  СОДЕРЖИМОЕ DBUM1 НА НОЛЬ
         BTFSC  STATUS,2  ;ЕСЛИ  НЕ РАВНО НУЛЮ,ТО УХОДИМ
         GOTO   M2        ;НА СЛОЖНЫЙ  ЦИКЛ  ВЫВОДА ,ИНАЧЕ  УХОДИМ
                            ;НА  АНАЛИЗ    M2
 
         MOVLW   000H      ;ПОДГОТОВКА ЦИКЛА  ВЫВОДА ПЕРВОГО БАЙТА
         MOVWF   CONST1    ;
 
M1     CALL    BYBOD     ;СЛОЖНЫЙ  ЦИКЛ ВЫВОДА ПЕРВОГО БАЙТА
         DECF    CONST1    ;
         BTFSS   STATUS,2  ;
         GOTO    M1        ;
         DECFSZ  DBUM1     ;
         GOTO    M1        ;
 
M2
         MOVF    DBUM2,1  ;ПРОВЕРЯЕМ  СОДЕРЖИМОЕ DBUM2 НА НОЛЬ
         BTFSC  STATUS,2  ;ЕСЛИ  НЕ РАВНО НУЛЮ,ТО УХОДИМ
         GOTO   M3        ;НА СЛОЖНЫЙ  ЦИКЛ  ВЫВОДА ,ИНАЧЕ  УХОДИМ
                            ;НА  АНАЛИЗ    M3
 
         MOVLW  000H      ;ПОДГОТОВКА К  ВЫВОДУ
         MOVWF  CONST2    ;
         MOVLW  000H      ;
         MOVWF  CONST3    ;
 
M4
         CALL   BYBOD     ;ВЫВОД
         DECF   CONST2    ;ВНУТРЕННИЙ  ЦИКЛ ПРОИЗВОДИТ  УМНОЖЕНИЕ
         BTFSS  STATUS,2  ;256*256 ,ЕСЛИ ПОСТАВИТЬ  CONST2 И CONST3
         GOTO   M4        ;РАВНЫМИ  0FFH,  ТО  БУДЕТ 255*255
         MOVLW  000H      ;
         MOVWF  CONST2    ;
         DECF   CONST3    ;
         BTFSS  STATUS,2  ;
         GOTO   M4        ;
         DECFSZ DBUM2     ;
         GOTO   M4        ;
 
M3
         GOTO     $         ;ТЕХНОЛОГИЧЕСКАЯ КОМАНДА
 
BYBOD
         BCF      STATUS,5
         BSF      PORTC,1
         CALL     PAUSE2
         BCF      PORTC,1
         CALL     PAUSE2
         RETURN
 
PAUSE
         MOVLW   0FFH  ; ПРИМЕРНО РАВНА  0,2 СЕК
         MOVWF   RAB4
         MOVLW   0FFH
         MOVWF   RAB5
LOOP
         DECFSZ  RAB4,1
         GOTO    LOOP
         DECFSZ  RAB5,1
         GOTO    LOOP
         RETURN
 
PAUSE2
         MOVLW   0AH  ; ПРИМЕРНО РАВНА  0,01 СЕК
         MOVWF   RAB4
         MOVLW   0AH
         MOVWF   RAB5
 
LOOP2
         DECFSZ  RAB4,1
         GOTO    LOOP2
         DECFSZ  RAB5,1
         GOTO    LOOP2
         RETURN
 
PROV1                                ;ПРОВЕРКА ЗАДАННОГО ВРЕМЕНИ НАРАБОТКИ
 
         GOTO        PROV2              ;ТЕХНОЛОГИЧЕСКАЯ  КОМАНДА
         MOVLW       0FFH               ;==        ЗАДАТЬ ВРЕМЯ  НАРАБОТКИ
         MOVWF       TR0                ;        В  МИНУТАХ  В  ШЕСТНАДЦАТЕРИЧНОМ
                                     ;        КОДЕ, ПОБАЙТНО
 
         MOVLW       0FFH               ;==
         MOVWF       TR1                ;
 
         MOVLW       0FFH               ;==
         MOVWF       TR2                ;
 
         MOVFW       TR0                ;СРАВНЕНИЕ  ЗАДАННОГО  ВРЕМЕНИ
         SUBWF       BUM0,0             ;НАРАБОТКИ  С ТЕКУЩИМ ЗНАЧЕНИЕМ
         BTFSS       STATUS,0           ;СЧЁТЧИКА НАРАБОТКИ
         GOTO        PROV2              ;
 
         MOVFW       TR1                ;
         SUBWF       BUM1,0             ;
         BTFSS       STATUS,0           ;
         GOTO        PROV2              ;
 
         MOVFW       TR2                ;
         SUBWF       BUM2,0             ;
         BTFSS       STATUS,0           ;
         GOTO        PROV2              ;  
 
         MOVLW       B'11111110'        ; ЗАПРЕТ РАБОТЫ АППАРАТА , МИГАНИЕ
         MOVWF       PORTC              ; ВСЕХ   СВЕТОДИОДОВ
         CALL        PAUSE              ;
         CALL        PAUSE              ;
         CLRF        PORTC              ;
         CALL        PAUSE              ;
         CALL        PAUSE
         GOTO        $-7
 
PROV2
         MOVFW   RAB0
         ANDWF   RAB1,0          ;УСЛОВИЕ RAB0^RAB1^RAB2=1,z=0
         ANDWF   RAB2,0
         BTFSC   STATUS,2        ;RAB0 = RAB1 = RAB2=1, если нет пыли, росы И ПЕРЕГРЕВА
         GOTO    ADP0
 
         BSF     PORTC,0         ;ВКЛ  "РАБОТА"
         BCF     PORTC,4         ;ВЫКЛ  ALARM  ПО   ПЫЛИ
         BCF     PORTC,3         ;ВЫКЛ  ALARM  ПО    T
         BCF     PORTC,1         ;ВЫКЛ  ALARM  ОВЩИЙ
         BCF     PORTC,5         ;ВЫКЛ  ALARM  ПО   РОСЕ
         MOVLW   B'00000000'
         MOVWF   RAB0
         MOVWF   RAB1
         MOVWF   RAB2
         GOTO    ADP0
 
         NOP
         NOP
         NOP
         END

Добавить комментарий