|
D0/S0
|
D1/S1
|
D2/S2
|
D3/S3
|
S4
|
S5
|
S6
|
S7
|
S8
|
S9
|
Индикатор 0
|
К0
|
S0
|
SG
|
SF
|
SE
|
SD
|
SC
|
SB
|
SA
|
S4
|
Индикатор 1
|
S1
|
К1
|
SG
|
SF
|
SE
|
SD
|
SC
|
SB
|
SA
|
S5
|
Индикатор 2
|
SG
|
SF
|
К2
|
S2
|
SE
|
SD
|
SC
|
SB
|
SA
|
S6
|
Индикатор 3
|
SG
|
SF
|
S3
|
К3
|
SE
|
SD
|
SC
|
SB
|
SA
|
S7
|
Примечание: К1 - К3 - катоды
индикаторов; SA - SG - сегменты индикаторов; S0 - S7 - аноды отдельных светодиодов.
Рисунок 8 - Цоколевка
драйвера MAX6958
В качестве индикаторов HG1 - HG4 применены
светодиодные индикаторы с общим катодом типа АЛС321А.
У индикаторов HG2 и HG3 задействованы
децимальные точки. Точка в индикаторе HG2
предназначена для разделения разрядов минут и часов. Она подключена к выходу D0/S0 (отдельный светодиод S0). Программно реализовано мигание точки с частотой 0,5Гц. Точка в
индикаторе HG3 разделяет целую и дробную части величины отображаемой
температуры. Она подключена к выводу D3/S3 (отдельный светодиод S2).
1.2.7 Разработка схемы
пульта управления (клавиатуры)
Пульт управления
микропроцессорной системой изображен на рисунке 9. Он включает в себя следующие
кнопки:
1. SB2 - «Установка поддерживаемой температуры»;
2. SB3 - «Установка часов»;
3. SB4 - «Установка минут»;
4. SB5 - «Установка времени включения»;
5. SB6 - «Установка времени выключения»;
6. SB7 - «Установка текущего времени»;
7. SB8 - «Управление отображением времени / температуры»;
8. SB9 - «+1»;
9. SB10 - «-1»;
На диодах VD3 - VD7 типа КД521А и
резисторе R9 выполнена схема «ИЛИ». Нажатие одной из кнопок SB2, SB5 - SB8 приводит к появлению
низкого уровня на входе INT контроллера, что вызывает прерывание программы контроллера.
Кнопки SB3, SB4, SB9, SB10 подключены к входам RB4 - RB7. Их нажатие также приводит к прерыванию. Прерывания от кнопок SB3, SB4, SB9, SB10 разрешены только в
том случае, если предварительно была нажата одна из кнопок SB2, SB5 - SB8. Повторное нажатие той
же кнопки из SB2, SB5 - SB8 запрещает прерывания от кнопок SB3, SB4, SB9, SB10.
Рисунок 9 - Схема пульта
управления
1.2.8 Организация
последовательного интерфейса
В проектируемой системе
управления для связи с внешним устройством используется последовательный
интерфейс RS449. Роль приемопередатчика используется встроенный в
микроконтроллер модуль USART.
Для формирования уровней сигналов соответствующих интерфейсу RS449 используется мультистандартный преобразователь уровней MXL1543. Схема его включения приведена на рисунке 10.
Рисунок 10 - Схема
включения преобразователя уровней MXL1543
Подключение к внешнему
устройству осуществляется через 37-штырьковый разъем DB-37.
1.2.9 Синхронизация
контроллера
Для формирования тактового сигнала
микроконтроллера предусмотрен внутренний генератор. Тактовый сигнал необходим
для выполнения инструкций микроконтроллера и работы периферийных модулей.
Внутренний машинный цикл микроконтроллера состоит из четырех периодов тактового
сигнала.
Тактовый генератор микроконтроллера
может работать в одном из восьми режимов. Существуют два режима внутреннего RC генератора,
отличающихся между собой режимом работы вывода микроконтроллера. Режим работы
тактового генератора определяется битами в слове конфигурации, расположенными в
энергонезависимой памяти. Настроить биты конфигурации можно только при
программировании микроконтроллера.
В данной системе управления в
микроконтроллере используется режим XT, который используется для приложений со средней частотой
тактового генератора. Данный режим предполагает использование внешнего
кварцевого резонатора.
Чтобы обеспечить заданную частоту
был выбран кварцевый резонатор с параллельным резонансом типа CDA4.00MG, который имеет частоту
основной гармоники 4МГц.
Чем больше ёмкость конденсаторов С1
и С2, тем стабильнее генератор, но с повышением ёмкости увеличивается время
запуска генератора, т.е. выхода колебаний на главную последовательность.
Для ожидания запуска генератора
используется специальный таймер запуска генератора (OST - Oscillator Startup Timer), который обеспечивает
задержку в 1024 такта генератора (вход OSC1).
Рекомендуемые значения емкостей
конденсаторов C1 и C2 для режима XT и частоты резонатора 4МГц находятся в диапазоне 15…68пФ.
Поскольку важна стабильность генератора, то значения емкостей C1 и C2 будут равны 68 пФ.
Для формирования секундных импульсов
используется таймер TMR1 с отдельным генератором. Генератор работает в низкочастотном
режиме LP. К выводам генератора подключен кварцевый резонатор ZQ2 типа C-001 R32.768K-A работающий на частоте 32,768 кГц.
Для данной частоты рекомендуется емкость конденсаторов C3 и C4 33пФ.
Схема подключения кварцевых
резонаторов к микроконтроллеру PIC16F873 приведена на рисунке 11.
Рисунок 11 - Схема
подключения кварцевых резонаторов к микроконтроллеру PIC16F873
.2.10 Сброс контроллера
Схема сброса контроллера
приведена на рисунке 12. При нажатии на кнопку SB1
на вывод MCLR микроконтроллера подается низкий уровень, что приводит к сбросу
микроконтроллера.
Рисунок 12 - Схема
сброса микроконтроллера
2. Разработка
программного обеспечения
.1 Алгоритм работы
микропроцессорной системы управления
Блок-схема алгоритма
работы системы управления представлена на рисунке 13.
Рисунок 13 - Блок-схема
алгоритма работы микропроцессорной системы управления
На рисунке 14 приведена
блок-схема алгоритма обработки прерываний. В данной микропроцессорной системе
возможны 5 видов прерываний: прерывание от модуля CCP1,
прерывание от таймера TMR2,
внешнее прерывание по входу INT,
прерывание по изменению уровня на входах <RB4:RB7> и прерывание от приемника USART.
Рисунок 14 - Блок-схема
алгоритма обработки прерываний
Рисунок 14 - Блок-схема
алгоритма обработки прерываний (продолжение)
Рисунок 14 - Блок-схема
алгоритма обработки прерываний (продолжение)
Рисунок 14 - Блок-схема
алгоритма обработки прерываний (продолжение)
Рисунок 14 - Блок-схема
алгоритма обработки прерываний (продолжение)
Рисунок 14 - Блок-схема
алгоритма обработки прерываний (продолжение)
Рисунок 14 - Блок-схема
алгоритма обработки прерываний (продолжение)
Рисунок 14 - Блок-схема
алгоритма обработки прерываний (окончание)
.2 Инициализация
микроконтроллера
При запуске
микроконтроллера необходимо проинициализировать следующие модули:
1. Порты ввода / вывода;
2. Модуль АЦП;
. Модуль CCP1;
. Таймер TMR1;
. Таймер TMR2;
. Модуль USART;
. Модуль MSSP;
Необходимо настроить прерывания от
приемника USART, модуля CCP1, таймера TMR2, прерывания по заднему фронту сигнала на входе INT и прерывания по
изменению уровня на входах <RB4:RB7>.
Листинг подпрограммы инициализации
приведен ниже.
;-
; ИНИЦИАЛИЗАЦИЯ ПОРТОВ ВВОДА/ВЫВОДА INTCON,
GIE ; ЗАПРЕТИТЬ ПРЕРЫВАНИЯ PORTA ; ОЧИСТКА ПОРТОВ PORTB PORTC
B'00111111' ; ЛИНИИ RA0-RA5
НА ВВОД TRISA B'11110011' ; ЛИНИИ RB2, RB3 НА ВЫВОД
; ОСТАЛЬНЫЕ НА ВВОД TRISB TRISC
;-
; ИНИЦИАЛИЗАЦИЯ МОДУЛЯ USART B'10010000' ;
ВКЛЮЧИТЬ МОДУЛЬ USART
; РАЗРЕШИТЬ ПРИЕМ
; УСТАНОВИТЬ 8-РАЗРЯДНЫЙ ПРИЕМ RCSTA B'00000100' ;
УСТАНОВИТЬ 8-РАЗРЯДНУЮ ПЕРЕДАЧУ
; АСИНХРОННЫЙ НИЗКОСКОРОСТНОЙ РЕЖИМ
ПЕРЕДАЧИ TXSTA D'129' ; СКОРОСТЬ ОБМЕНА 9600
бит/с SPBRG
;-
; ИНИЦИАЛИЗАЦИЯ МОДУЛЯ MSSP B'00001000' ;
ВЕДУЩИЙ РЕЖИМ I2C SSPCON B'10000000' ; УПРАВЛЕНИЕ ДЛИТЕЛЬНОСТЬЮ
ФРОНТА ВЫКЛЮЧЕНО
; ВЫХ. УРОВНИ СООТВЕТСТВУЮТ
СПЕЦИФИКАЦИИ I2C SSPSTAT 0x09 ; ТАКТОВАЯ ЧАСТОТА 100 кГц SSPADD SSPCON2
;-
; ИНИЦИАЛИЗАЦИЯ МОДУЛЯ АЦП B'10001110' ;
ПРАВОЕ ВЫРАВНИВАНИЕ
; КАНАЛ AN0 - АНАЛОГОВЫЙ ВХОД,
ОСТАЛЬНЫЕ ЦИФРОВЫЕ ADCON1 B'10000001' ; МОДУЛЬ АЦП ВКЛЮЧЕН
; ТАКТОВАЯ ЧАСТОТА Fosc/32
; ВЫБРАН КАНАЛ 0 ADCON0
;-
; ИНИЦИАЛИЗАЦИЯ МОДУЛЯ CCP B'00001011' ;
РЕЖИМ СРАВНЕНИЯ
; ТРИГГЕР СПЕЦИАЛЬНЫХ ФУНКЦИЙ CCP1CON 0x80 ;
ЗАГРУЗИТЬ 8000h В РЕГИСТРЫ CCPR1H И CCPR1L CCPR1H CCPR1L
;-
; ИНИЦИАЛИЗАЦИЯ ТАЙМЕРА TMR1 B'00000010' ;
КОЭФФИЦИЕНТ ДЕЛЕНИЯ ПРЕДДЕЛИТЕЛЯ 1:1
; СИНХРОНИЗАЦИЯ ВКЛЮЧЕНА
; ВНЕШНИЙ ИСТОЧНИК ТАКТОВЫХ
ИМПУЛЬСОВ T1CON TMR1L ; ОЧИСТКА РЕГИСТРОВ TMR1L И
TMR1H TMR1H
;-
; ИНИЦИАЛИЗАЦИЯ ТАЙМЕРА TMR2 B'01111010' ;
ПРЕДДЕЛИТЕЛЬ 1/16, ВЫХОДНОЙ ДЕЛИТЕЛЬ 1/16
MOVWF T2CON 0xFF PR2
;- OPTION_REG ; ПОДКЛЮЧИТЬ
ПОДТЯГИВАЮЩИЕ РЕЗИСТОРЫ
; К ВЫВОДАМ PORTB
; АКТИВНЫЙ ЗАДНИЙ ФРОНТ ИМПУЛЬСА НА
ВХОДЕ INT
;-
; ИНИЦИАЛИЗАЦИЯ ПРЕРЫВАНИЙ B'01011000' ;
РАЗРЕШИТЬ ПРЕРЫВАНИЯ ОТ ПЕРИФЕРИЙНЫХ МОДУЛЕЙ
; И ПРЕРЫВАНИЯ ПО ВХОДАМ INT И
<RB4:RB7> INTCON B'00100110' ; РАЗРЕШИТЬ ПРЕРЫВАНИЯ ОТ
ПРИЕМНИКА USART,
; МОДУЛЯ CCP1 И ТАЙМЕРА TMR2 PIR1 PIE1
;-
; ИНИЦИАЛИЗАЦИЯ РЕГИСТРОВ ОБЩЕГО
НАЗНАЧЕНИЯ EEADR ; ОЧИСТИТЬ РЕГИСТР АДРЕСА EECON1, EEPGD ;
УСТАНОВИТЬ ЧТЕНИЕ ИЗ EEPROM EECON1, RD ; НАЧАТЬ ЧТЕНИЕ EEDATA, W ;
ПРОЧИТАТЬ РЕГИСТР ДАННЫХ MAX_TL ; ПОМЕСТИТЬ СОДЕРЖИМОЕ ТЕКУЩЕЙ
ЯЧЕЙКИ ПАМЯТИ
; В РЕГИСТР MAX_TL EEADR, F ;
УВЕЛИЧИТЬ АДРЕС ТЕКУЩЕЙ ЯЧЕЙКИ ПАМЯТИ НА 1 EEDATA, W ; ПРОЧИТАТЬ
РЕГИСТР ДАННЫХ MAX_TH ; ПОМЕСТИТЬ СОДЕРЖИМОЕ ТЕКУЩЕЙ ЯЧЕЙКИ
ПАМЯТИ
; В РЕГИСТР MAX_TH EEADR, F ;
УВЕЛИЧИТЬ АДРЕС ТЕКУЩЕЙ ЯЧЕЙКИ ПАМЯТИ НА 1 EEDATA, W ; ПРОЧИТАТЬ РЕГИСТР
ДАННЫХ START_ML ; ПОМЕСТИТЬ СОДЕРЖИМОЕ ТЕКУЩЕЙ ЯЧЕЙКИ ПАМЯТИ
; В РЕГИСТР START_ML EEADR, F ;
УВЕЛИЧИТЬ АДРЕС ТЕКУЩЕЙ ЯЧЕЙКИ ПАМЯТИ НА 1 EEDATA, W ; ПРОЧИТАТЬ
РЕГИСТР ДАННЫХ START_MH ; ПОМЕСТИТЬ СОДЕРЖИМОЕ ТЕКУЩЕЙ ЯЧЕЙКИ
ПАМЯТИ
; В РЕГИСТР START_MH EEADR, F ;
УВЕЛИЧИТЬ АДРЕС ТЕКУЩЕЙ ЯЧЕЙКИ ПАМЯТИ НА 1 EEDATA, W ; ПРОЧИТАТЬ
РЕГИСТР ДАННЫХ START_HL ; ПОМЕСТИТЬ СОДЕРЖИМОЕ ТЕКУЩЕЙ ЯЧЕЙКИ
ПАМЯТИ
; В РЕГИСТР START_HL EEADR, F ;
УВЕЛИЧИТЬ АДРЕС ТЕКУЩЕЙ ЯЧЕЙКИ ПАМЯТИ НА 1 EEDATA, W ; ПРОЧИТАТЬ
РЕГИСТР ДАННЫХ START_HH ; ПОМЕСТИТЬ СОДЕРЖИМОЕ ТЕКУЩЕЙ ЯЧЕЙКИ
ПАМЯТИ
; В РЕГИСТР START_HH EEADR, F ;
УВЕЛИЧИТЬ АДРЕС ТЕКУЩЕЙ ЯЧЕЙКИ ПАМЯТИ НА 1 EEDATA, W ; ПРОЧИТАТЬ
РЕГИСТР ДАННЫХ STOP_ML ; ПОМЕСТИТЬ СОДЕРЖИМОЕ ТЕКУЩЕЙ ЯЧЕЙКИ ПАМЯТИ
; В РЕГИСТР STOP_ML EEADR, F ;
УВЕЛИЧИТЬ АДРЕС ТЕКУЩЕЙ ЯЧЕЙКИ ПАМЯТИ НА 1 EEDATA, W ; ПРОЧИТАТЬ
РЕГИСТР ДАННЫХ STOP_MH ; ПОМЕСТИТЬ СОДЕРЖИМОЕ ТЕКУЩЕЙ ЯЧЕЙКИ ПАМЯТИ
; В РЕГИСТР STOP_MH EEADR, F ;
УВЕЛИЧИТЬ АДРЕС ТЕКУЩЕЙ ЯЧЕЙКИ ПАМЯТИ НА 1 EEDATA, W ; ПРОЧИТАТЬ
РЕГИСТР ДАННЫХ STOP_HL ; ПОМЕСТИТЬ СОДЕРЖИМОЕ ТЕКУЩЕЙ ЯЧЕЙКИ ПАМЯТИ
; В РЕГИСТР STOP_HL EEADR, F ;
УВЕЛИЧИТЬ АДРЕС ТЕКУЩЕЙ ЯЧЕЙКИ ПАМЯТИ НА 1 EEDATA, W ; ПРОЧИТАТЬ
РЕГИСТР ДАННЫХ STOP_HH ; ПОМЕСТИТЬ СОДЕРЖИМОЕ ТЕКУЩЕЙ ЯЧЕЙКИ ПАМЯТИ
; В РЕГИСТР STOP_HH
B'0100000' ; ВКЛЮЧИТЬ
РЕЖИМ ОТОБРАЖЕНИЯ ТЕКУЩЕГО ВРЕМЕНИ FLAG_R FLAG_R1 ; ВЫКЛЮЧИТЬ
РЕЖИМ ПОДДЕРЖАНИЯ ТЕМПЕРАТУРЫ
IND_0 ;
ОБНУЛИТЬ РЕГИСТРЫ ИНДИКАЦИИ IND_1
CLRF IND_2 IND_3
SEC_L ;
ОБНУЛИТЬ СЧЕТЧИКИ SEC_H MIN_L MIN_H HOUR_L
CLRF HOUR_H
B'00000010' ; ВКЛЮЧИТЬ
ДЕЦИМАЛЬНУЮ ТОЧКУ ВО 2-М РАЗРЯДЕ POINT
;-
; ИНИЦИАЛИЗАЦИЯ ДРАЙВЕРА LCD SSPCON,
SSPEN ; ВКЛЮЧИТЬ МОДУЛЬ MSSP SSPCON2, SEN ; СГЕНЕРИРОВАТЬ БИТ START SSPCON2,
SEN ; ОЖИДАТЬ ОКОНЧАНИЯ ГЕНЕРАЦИИ БИТА START $-1 0x38 ;
ПЕРЕДАТЬ АДРЕС ДРАЙВЕРА SSPBUF SSPCON2, ACKSTAT ; ОЖИДАТЬ ФОРМИРОВАНИЕ
БИТА ПОДТВЕРЖДЕНИЯ $-1 0x01 ; ПРЕРЕДАТЬ АДРЕС РЕГИСТРА
УПРАВЛЕНИЯ ДЕКОДИРОВАНИЕМ SSPBUF SSPCON2, ACKSTAT ; ОЖИДАТЬ
ФОРМИРОВАНИЕ БИТА ПОДТВЕРЖДЕНИЯ $-1 0x0F ; ВКЛЮЧИТЬ
ДВОИЧНО-ДЕСЯТИЧНОЕ ДЕКОДИРОВАНИЕ ДЛЯ ВСЕХ
; РАЗРЯДОВ SSPBUF SSPSTAT,
BF ; ОЖИДАТЬ ОКОНЧАНИЕ ПЕРЕДАЧИ $-1 0x07 ;
УСТАНОВИТЬ ЯРКОСТЬ СВЕЧЕНИЯ ИНДИКАТОРОВ SSPBUF SSPCON2, ACKSTAT ;
ОЖИДАТЬ ФОРМИРОВАНИЕ БИТА ПОДТВЕРЖДЕНИЯ $-1 SSPCON2, PEN ; СФОРМИРОВАТЬ
БИТ STOP
INTCON, GIE ;
РАЗРЕШИТЬ ПРЕРЫВАНИЯ
;-
2.3 Преобразование
напряжения от датчика температуры
Ниже приведена часть программы,
осуществляющая преобразование напряжения от датчика температуры. При изменении
температуры от 0 до 1000С напряжение на входе АЦП изменяется в
пределах 0…4,88 В. При этом результат преобразования в регистрах ADRESL и ADRESH будет изменяться в
пределах 0…1000d, что позволяет легко преобразовать результат в десятичный формат.
;- TIME1 ;
СФОРМИРОВАТЬ ЗАДЕРЖКУ 20 мкс
MOVWF TIMER1 TIMER1,
F $+1
;-_START ;
ПОДПРОГРАММА ИЗМЕРЕНИЯ ТЕМПЕРАТУРЫ ADCON0, GO ; НАЧАТЬ ПРЕОБРАЗОВАНИЕ ADCON0,
GO ; ОЖИДАТЬ ОКОНЧАНИЯ ПРЕОБРАЗОВАНИЯ $-1
;-
Для осуществления временных
задержек, необходимых для заряда внутреннего конденсатора модуля АЦП реализован
программный счетчик на основе регистра TIMER1, определенного по
адресу 26h. Счетчик формирует временную задержку 20 мкс. Рассчитаем
константу TIME1.
;
где Tз - время задержки, Fosc
- тактовая частота; n - количество машинных
циклов в одном цикле работы счетчика. Так как счетчик включает в себя команду DECFSZ, выполняемую за 1 МЦ (если результат не равен 0) и команду GOTO, выполняемую за 2 МЦ, то n
= 3. Таким образом
.
2.4 Подпрограмма
управления выводом температуры на индикацию
Данная часть программы
определяет, разрешено ли отображение температуры на индикаторах. Если
отображение разрешено, подпрограмма включает точку в первом разряде индикации,
помещает содержимое регистров ADRESL
и ADRESH во временные регистры TEMP_TL и TEMP_TH и производит вызов подпрограммы двоично-десятичной
коррекции.
;-
; ПОДПРОГРАММА
УПРАВЛЕНИЯ ВЫВОДОМ ТЕМПЕРАТУРЫ НА ИНДИКАЦИЮ FLAG_R, 7 ; ОТОБРАЖЕНИЕ
ТЕМПЕРАТУРЫ ВКЛЮЧЕНО ST_NAGREV ; НЕТ - ПЕРЕХОД К ПОДПРОГРАММЕ
УПРАВЛЕНИЯ НАГРЕВОМ B'00000100' ; ДА - ВКЛЮЧИТЬ ТОЧКУ В ПЕРВОМ РАЗРЯДЕ POINT ADRESL,
W ; ПОМЕСТИТЬ РЕЗУЛЬТАТ ПРЕОБРАЗОВАНИЯ ВО ВРЕМЕННЫЕ
;
РЕГИСТРЫ
MOVWF TEMP_TL ADRESH,
W
MOVWF TEMP_TH BIN_DEC ;
ВЫЗОВ ПОДПРОГРАММЫ ДВОИЧНО-ДЕСЯТИЧНОЙ
; КОРРЕКЦИИ
;-
2.5 Подпрограмма
управления нагревателем
Данная подпрограмма
осуществляет контроль состояния датчика снижения уровня воды и проверяет
включение режима поддержания температуры. Если уровень воды в норме и включен
режим поддержания температуры (бит 0 в регистре FLAG_R1 установлен в 1), то происходит включение нагревателя. Если
уровень воды уменьшается ниже нормы, нагреватель выключается и включается
индикатор «Снижение уровня воды».
;-_NAGREV ;
ПОДПРОГРАММА УПРАВЛЕНИЯ НАГРЕВАТЕЛЕМ FLAG_R1,0 ; РЕЖИМ
ПОДДЕРЖАНИЯ ТЕМПЕРАТУРЫ ВЫКЛЮЧЕН $+3 PORTB, 2 ; ДА -
ВЫКЛЮЧИТЬ НАГРЕВ
GOTO OUT_LED PORTA,
1 ; УРОВЕНЬ В НОРМЕ
GOTO $+4 PORTB,
3 ; НЕТ - ВКЛЮЧИТЬ ИНДИКАТОР «СНИЖЕНИЕ УРОВНЯ
; ВОДЫ»
BCF PORTB, 2 ; ВЫКЛЮЧИТЬ НАГРЕВ
GOTO OUT_LED PORTB, 3 ; ВЫКЛЮЧИТЬ ИНДИКАТОР «СНИЖЕНИЕ УРОВНЯ ВОДЫ»
;-
2.6 Подпрограмма
вычисления нижнего предела температуры
Данная подпрограмма
вычисляет нижний предел температуры, который принимается на 50С ниже
заданного (верхнего).
Рассчитаем константу DELT_T, соответствующую разности температур в 50С:
;
где Nmax - значение регистров ADRESL и ADRESH, соответствующее
температуре Tmax.
.
;-
; ПОДПРОГРАММА
ВЫЧИСЛЕНИЯ НИЖНЕГО ПРЕДЕЛА ТЕМПЕРАТУРЫ MIN_TH ; ОЧИСТКА РЕГИСТРА
MIN_TH MAX_TL, W DELT_T ; ВЫЧЕСТЬ ИЗ СОДЕРЖИМОГО MAX_TL
РАЗНОСТЬ ТЕМПЕРАТУР MIN_TL ; ПОМЕСТИТЬ РЕЗУЛЬТАТ В MIN_TL MIN_TH, W ;
ЕСЛИ БЫЛ ЗАЕМ MAX_TH, W ; УМЕНЬШИТЬ ЗНАЧЕНИЕ РЕГИСТРА MAX_TH НА 1 MIN_TH ;
ПОМЕСТИТЬ РЕЗУЛЬТАТ В РЕГИСТР MIN_TH STATUS, C ; ЕСЛИ БЫЛ ЗАЕМ $+4 MIN_TL ;
ОЧИСТИТЬ РЕГИСТРЫ MIN_TL И MIN_TH MIN_TH STATUS, C ; И
СБРОСИТЬ ФЛАГ ПЕРЕНОСА
;-
2.7 Подпрограмма
контроля температуры
Данная подпрограмма
осуществляет контроль температуры воды и при ее уменьшении ниже значения,
записанного в регистрах MIN_TH и MIN_TL включает нагреватель, а при увеличении выше значения, записанного
в регистрах MAX_TH и MAX_TL выключает его.
;-
; ПОДПРОГРАММА ПРОВЕРКИ
СНИЖЕНИЯ ТЕМПЕРАТУРЫ НИЖЕ НОРМЫ
BCF STATUS,
Z ADRESH, W MIN_TH, W STATUS, Z M1 ADRESH,
W STATUS, C MIN_TH, W STATUS, C
BSF PORTB, 2 ;
ВКЛЮЧЕНИЕ НАГРЕВАТЕЛЯ
STATUS, Z
MOVF ADRESL,
W MIN_TL, W
BTFSC STATUS, C PORTB,
2 ; ВКЛЮЧЕНИЕ НАГРЕВАТЕЛЯ
;-
; ПРОВЕРКА ПРЕВЫШЕНИЯ
НОРМЫ
BANC1
MOVF ADRESH, W
XORWF MAX_TH,
W STATUS, Z M2 ADRESH, W MAX_TH, W STATUS, C PORTB,
2 ; ВЫКЛЮЧЕНИЕ НАГРЕВАТЕЛЯ
M2 STATUS,
Z
MOVF ADRESL,
W MAX_TH, W
BTFSC STATUS,
C
BCF PORTB, 2 ;
ВЫКЛЮЧЕНИЕ НАГРЕВАТЕЛЯ
;-
2.8 Подпрограмма вывода
на индикацию
Данная подпрограмма
осуществляет передачу значений буферных регистров индикации IND_0, IND_1, IND_2, IND_3 и регистра
управления децимальной точкой POINT
во внутренние регистры драйвера LCD.
Драйвер MAX6958 поддерживает автоинкрементирование адреса при записи значений
в регистры. Поэтому при передаче данных достаточно указать начальный адрес
(0х20), а затем последовательно передавать данные без предварительной передачи
адреса следующего регистра. Адрес драйвера на шине I2C 0x38.
Ниже приведен листинг
программы, осуществляющей вывод на индикацию.
;-_LED
; ПОДПРОГРАММА ВЫВОДА НА
ИНДИКАЦИЮ SSPCON2, SEN ; СГЕНЕРИРОВАТЬ БИТ START SSPCON2, SEN ;
ОЖИДАТЬ ОКОНЧАНИЯ ГЕНЕРАЦИИ БИТА START $-1 0x38 ;
ПЕРЕДАТЬ АДРЕС ДРАЙВЕРА SSPBUF SSPCON2, ACKSTAT ; ОЖИДАТЬ
ФОРМИРОВАНИЕ БИТА ПОДТВЕРЖДЕНИЯ $-1 0x20 ; ПРЕРЕДАТЬ
АДРЕС ПЕРВОГО РЕГИСТРА ДАННЫХ SSPBUF SSPCON2, ACKSTAT ; ОЖИДАТЬ
ФОРМИРОВАНИЕ БИТА ПОДТВЕРЖДЕНИЯ $-1 IND_3, W ; ПЕРЕДАТЬ
СОДЕРЖИМОЕ 3-ГО РАЗРЯДА ИНДИКАЦИИ
BANC1 SSPBUF SSPSTAT,
BF
GOTO $-1 IND_2,
W ; ПЕРЕДАТЬ СОДЕРЖИМОЕ 2-ГО РАЗРЯДА ИНДИКАЦИИ
BANC1 SSPBUF SSPSTAT,
BF
GOTO $-1 IND_1,
W ; ПЕРЕДАТЬ СОДЕРЖИМОЕ 1-ГО РАЗРЯДА ИНДИКАЦИИ
BANC1 SSPBUF SSPSTAT,
BF
GOTO $-1 IND_0,
W ; ПЕРЕДАТЬ СОДЕРЖИМОЕ 0-ГО РАЗРЯДА ИНДИКАЦИИ
BANC1 SSPBUF SSPSTAT,
BF
GOTO $-1 POINT,
W ; ПЕРЕДАТЬ СОСТОЯНИЕ ДЕЦИМАЛЬНОЙ ТОЧКИ SSPCON2, ACKSTAT $-1 SSPCON2,
PEN ; СГЕНЕРИРОВАТЬ БИТ STOP END_INT ; ПЕРЕХОД
НА НАЧАЛО ПРОГРАММЫ
;-
2.9 Подпрограмма
двоично-десятичной коррекции
Данная подпрограмма
осуществляет конвертирование двоичного кода, предварительно записанного в
буферных регистрах TEMP_TL TEMP_TH в двоично-десятичный код, записываемый в регистры индикации IND_0, IND_1, IND_2, IND_3.
Листинг подпрограммы
приведен ниже.
;-_DEC ;
ПОДПРОГРАММА ДВОИЧНО-ДЕСЯТИЧНОЙ КОРРЕКЦИИ
;-
; РАСПРЕДЕЛЕНИЕ ТЕТРАД
РЕГИСТРОВ TEMP_TL И TEMP_TH ПО РЕГИСТРАМ IND_0 - IND_3
MOVF TEMP_TL,
W 0x0F
MOVWF IND_0 ;
ПОМЕСТИТЬ МЛАДШУЮ ТЕТРАДУ TEMP_TL В IND_0
SWAPF TEMP_TL,
W 0x0F
MOVWF IND_1 ;
ПОМЕСТИТЬ СТАРШУЮ ТЕТРАДУ TEMP_TL В IND_1
MOVF TEMP_TH,
W 0x0F
MOVWF IND_2 ;
ПОМЕСТИТЬ МЛАДШУЮ ТЕТРАДУ TEMP_TH В IND_2
SWAPF TEMP_TH,
W 0x0F
MOVWF IND_3 ;
ПОМЕСТИТЬ СТАРШУЮ ТЕТРАДУ TEMP_TH В IND_3
;-
; КОРРЕКЦИЯ РЕЗУЛЬТАТА STATUS,
Z STATUS, C
MOVLW 0x0A IND_0,
W STATUS, C
GOTO $+5 STATUS,
Z ; ЕСЛИ ЗНАЧЕНИЕ IND_0 НЕ МЕНЬШЕ 0x0A $+3 IND_0 ;
В РЕГИСТР IND_0 ЗАПИСАТЬ РАЗНОСТЬ ЕГО СОДЕРЖИМОГО И
; 0x0A IND_1, F ;
И УВЕЛИЧИТЬ НА 1 СОДЕРЖИМОЕ IND_1
BCF STATUS,
Z STATUS, C
MOVLW 0x0A ;
ИНАЧЕ ЗНАЧЕНИЯ РЕГИСТРОВ ОСТАВИТЬ БЕЗ ИЗМЕНЕНИЯ
SUBWF IND_1,
W STATUS, C
GOTO $+5 STATUS,
Z ; ЕСЛИ ЗНАЧЕНИЕ IND_1 НЕ МЕНЬШЕ 0x0A $+3 IND_1 ;
В РЕГИСТР IND_1 ЗАПИСАТЬ РАЗНОСТЬ ЕГО СОДЕРЖИМОГО И
; 0x0A IND_2, F ;
И УВЕЛИЧИТЬ НА 1 СОДЕРЖИМОЕ IND_2
BCF STATUS,
Z STATUS, C
MOVLW 0x0A ;
ИНАЧЕ ЗНАЧЕНИЯ РЕГИСТРОВ ОСТАВИТЬ БЕЗ ИЗМЕНЕНИЯ
SUBWF IND_2,
W STATUS, C
GOTO $+5 STATUS,
Z ; ЕСЛИ ЗНАЧЕНИЕ IND_2 НЕ МЕНЬШЕ 0x0A $+3 IND_2 ;
В РЕГИСТР IND_2 ЗАПИСАТЬ РАЗНОСТЬ ЕГО СОДЕРЖИМОГО И
; 0x0A IND_3, F ;
И УВЕЛИЧИТЬ НА 1 СОДЕРЖИМОЕ IND_3
;-
2.10 Обработка
прерываний
Вектор прерываний
находится по адресу 0х04.
Обработчик прерываний
включает в себя следующие подпрограммы:
1. Подпрограмма сохранения
контекста.
2. Подпрограмма определения
источника прерывания.
. Подпрограмма часов.
. Подпрограмма обработки
прерываний от таймера TMR2.
. Подпрограмма обработки
прерываний по входу INT.
. Подпрограмма обработки
прерываний по входам <RB4: RB7>.
. Подпрограмма приема /
передачи данных через USART.
. Подпрограмма восстановления
контекста.
Подпрограмма сохранения контекста
При переходе на обработку прерываний
необходимо сохранять текущее содержимое аккумулятора и регистра STATUS, чтобы при возврате из
прерывания программа могла продолжать нормальную работу.
Ниже приведен листинг подпрограммы,
осуществляющей сохранение контекста во временные регистры W_TEMP и STATUS_TEMP. Регистр STATUS_TEMP определен в 0-м банке
по адресу 0х39, а регистр W_TEMP - в 0-м банке по адресу 0х3А и в 1-м банке по адресу 0хВА.
;-
; СОХРАНЕНИЕ АККУМУЛЯТОРА И РЕГИСТРА
STATUS STATUS, RP0 ; ОПРЕДЕЛЕНИЕ ТЕКУЩЕГО БАНКА RP0_CLR STATUS,
RP0 ; УСТАНОВИТЬ БАНК 0 W_TEMP ; СОХРАНИТЬ
АККУМУЛЯТОР STATUS, W STATUS_TEMP ; СОХРАНИТЬ РЕГИСТР
STATUS STATUS_TEMP, 5 ; ВОССТАНОВИТЬ ЗНАЧЕНИЕ БИТА RP0 $+4_CLR W_TEMP ;
СОХРАНИТЬ АККУМУЛЯТОР
SWAPF STATUS, W STATUS_TEMP ; СОХРАНИТЬ РЕГИСТР STATUS
;-
Подпрограмма определения
источника прерывания
Данная подпрограмма по состоянию
флагов прерываний в регистрах PIR1 и INTCON определяет источник прерывания и осуществляет вызов
соответствующей подпрограммы обработки.
Листинг подпрограммы приведен ниже.
;-
; ОПРЕДЕЛЕНИЕ ИСТОЧНИКА ПРЕРЫВАНИЯ
INT_SOURCE STATUS ;
ОЧИСТИТЬ РЕГИСТР STATUS
BTFSC PIR1, CCP1IF ; ЕСЛИ
ПРЕРЫВАНИЕ ОТ МОДУЛЯ CCP1 CLOCK ; ПЕРЕХОД НА ПОДПРОГРАММУ
ЧАСОВ
PIR1, TMR2IF ; ЕСЛИ
ПРЕРЫВАНИЕ ОТ ТАЙМЕРА TMR2 INT_TMR2 ; ПЕРЕХОД НА ПОДПРОГРАММУ ОБРАБОТЧИКА
ПРЕРЫВАНИЙ ОТ
; TMR2
INTCON, INTF ; ЕСЛИ
ПРЕРЫВАНИЕ ПО ВХОДУ INT INT_INT ; ПЕРЕХОД НА ПОДПРОГРАММУ
ОБРАБОТЧИКА ПРЕРЫВАНИЙ ПО
; INT
INTCON, RBIF ; ЕСЛИ
ПРЕРЫВАНИЕ ПО ВХОДАМ <RB4:RB7> INT_RB ; ПЕРЕХОД НА ПОДПРОГРАММУ
ОБРАБОТЧИКА ПРЕРЫВАНИЙ ПО
; ВХОДАМ <RB4:RB7> PIR1,
RCIF ; ЕСЛИ ПРЕРЫВАНИЕ ОТ ПРИЕМНИКА USART SERIAL_PRT ; ПЕРЕХОД НА
ПОДПРОГРАММУ ПРИЕМА/ПЕРЕДАЧИ
; ДАННЫХ ЧЕРЕЗ USART END_INT ;
ИНАЧЕ ПЕРЕХОД НА ПОДПРОГРАММУ ВОССТАНОВЛЕНИЯ
; КОНТЕКСТА
;-
Подпрограмма часов
Данная подпрограмма осуществляет
счет и вывод на индикацию (в случае включения режима отображения текущего
времени) текущего времени. Кроме того подпрограмма проверяет совпадение
текущего времени с временем начала и поддержания температуры. В случае их
совпадения подпрограмма включает либо выключает режим поддержания температуры.
Для счета используется 6 регистров-счетчиков:
SEC_L - счетчик единиц секунд;
SEC_H - счетчик десятков секунд;
MIN_L - счетчик единиц минут;
MIN_H - счетчик десятков минут;
HOUR_L - счетчик единиц часов;
HOUR_H - счетчик десятков часов.
Счетчики SEC_L, MIN_L, HOUR_L инкрементируются от 0х00 до 0х0А.
При достижении 0х0А счетчики сбрасываются. Счетчики SEC_H и MIN_H инкрементируются от 0х00 до 0х06.
При достижении 0х06 счетчики сбрасываются. Счетчик HOUR_H инкрементируется от 0х00 до 0х02.
Счетчик сбрасывается, когда в нем записано значение 0х02, а счетчик HOUR_L досчитал до 0х04.
Листинг подпрограммы часов приведен
ниже.
;- ;
ПОДПРОГРАММА ТАЙМЕРА PIR1, CCP1IF ; СБРОСИТЬ ФЛАГ ПРЕРЫВАНИЯ ОТ МОДУЛЯ
CCP1
;-
; СЧЕТЧИК ЕДИНИЦ СЕКУНД SEC_L,
F ; ИНКРЕМЕНТИРОВАТЬ МЛАДШИЙ СЧЕТЧИК СЕКУНД SEC_L, W ; СЧЕТЧИК ДОСЧИТАЛ ДО
10 0x0A STATUS, Z CURR_TIME ; НЕТ - ПЕРЕХОД НА
ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ
; ТЕКУЩЕГО ВРЕМЕНИ НА ИНДИКАЦИЮ SEC_L ;
ДА - ОЧИСТИТЬ МЛАДШИЙ СЧЕТЧИК СЕКУНД
;-
; СЧЕТЧИК ДЕСЯТКОВ СЕКУНД SEC_H,
F ; ИНКРЕМЕНТИРОВАТЬ СТАРШИЙ СЧЕТЧИК СЕКУНД STATUS, Z SEC_H,
W ; СЧЕТЧИК ДОСЧИТАЛ ДО 6 0x06 STATUS, Z CURR_TIME ;
НЕТ - ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ
; ТЕКУЩЕГО ВРЕМЕНИ НА ИНДИКАЦИЮ SEC_H ;
ДА - ОЧИСТИТЬ СТАРШИЙ СЧЕТЧИК СЕКУНД
;-
; СЧЕТЧИК ЕДИНИЦ МИНУТ MIN_L,
F ; ИНКРЕМЕНТИРОВАТЬ МЛАДШИЙ СЧЕТЧИК МИНУТ STATUS, Z MIN_L, W ;
СЧЕТЧИК ДОСЧИТАЛ ДО 10 0x0A STATUS, Z CURR_TIME ; НЕТ -
ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ
; ТЕКУЩЕГО ВРЕМЕНИ НА ИНДИКАЦИЮ MIN_L ;
ДА - ОЧИСТИТЬ МЛАДШИЙ СЧЕТЧИК МИНУТ
;-
; СЧЕТЧИК ДЕСЯТКОВ МИНУТ MIN_H, F ;
ИНКРЕМЕНТИРОВАТЬ СТАРШИЙ СЧЕТЧИК МИНУТ STATUS, Z MIN_H, W ;
СЧЕТЧИК ДОСЧИТАЛ ДО 6
XORLW 0x06 STATUS,
Z
GOTO CURR_TIME ; НЕТ -
ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ
; ТЕКУЩЕГО ВРЕМЕНИ НА ИНДИКАЦИЮ MIN_H ;
ДА - ОЧИСТИТЬ СТАРШИЙ СЧЕТЧИК МИНУТ
;-
; СЧЕТЧИКИ ЧАСОВ HOUR_L, F ;
ИНКРЕМЕНТИРОВАТЬ МЛАДШИЙ СЧЕТЧИК ЧАСОВ STATUS, Z HOUR_H, W ;
СТАРШИЙ СЧЕТЧИК ДОСЧИТАЛ ДО 2 0x02 STATUS, Z M3 ;
НЕТ - ПЕРЕХОД НА ПРОВЕРКУ МЛАДШЕГО СЧЕТЧИКА
BCF STATUS, Z HOUR_L,
W 0x04 STATUS, Z M3 STATUS, Z HOUR_L ; ДА - ОЧИСТИТЬ МЛАДШИЙ СЧЕТЧИК ЧАСОВ
CLRF HOUR_H CURR_TIME ;
ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ
; ТЕКУЩЕГО ВРЕМЕНИ НА ИНДИКАЦИЮ HOUR_L,
W 0x0A ; СЧЕТЧИК ДОСЧИТАЛ ДО 10 STATUS, Z CURR_TIME ;
НЕТ - ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ
; ТЕКУЩЕГО ВРЕМЕНИ НА ИНДИКАЦИЮ HOUR_L ;
ДА - ОЧИСТИТЬ МЛАДШИЙ СЧЕТЧИК ЧАСОВ HOUR_H ; ИНКРЕМЕНТИРОВАТЬ СТАРШИЙ
СЧЕТЧИК ЧАСОВ
;-_TIME ;
ПОДПРОГРАММА УПРАВЛЕНИЯ ВЫВОДОМ ТЕКУЩЕГО
; ВРЕМЕНИ НА ИНДИКАЦИЮ
;-
; ВКЛЮЧЕНИЕ/ВЫКЛЮЧЕНИЕ РЕЖИМА
ПОДДЕРЖАНИЯ ТЕМПЕРАТУРЫ
BCF STATUS, Z START_ML,
W MIN_L, W STATUS, Z M4
STATUS, Z START_MH,
W MIN_H, W STATUS, Z M4
STATUS, Z START_HL,
W HOUR_L, W STATUS, Z M4
STATUS, Z START_HH,
W HOUR_H, W STATUS, Z M4
FLAG_R1,0 STATUS,
Z STOP_ML, W MIN_L, W STATUS, Z M5
STATUS, Z STOP_MH,
W MIN_H, W STATUS, Z M5
STATUS, Z STOP_HL,
W HOUR_L, W STATUS, Z M5
STATUS, Z STOP_HH,
W HOUR_H, W STATUS, Z M5
FLAG_R1,0
;- FLAG_R, 6 ; ВКЛЮЧЕН РЕЖИМ
ОТОБРАЖЕНИЯ ТЕКУЩЕГО ВРЕМЕНИ INT_SOURCE ; НЕТ - ВЕРНУТЬСЯ К ПОИСКУ
ИСТОЧНИКОВ ПРЕРЫВАНИЙ
; -
; ВКЛЮЧЕНИЕ/ВЫКЛЮЧЕНИЕ РАЗДЕЛЯЮЩЕЙ
ТОЧКИ POINT, 2 POINT, 1 ; ДЕЦИМАЛЬНАЯ ТОЧКА ВКЛЮЧЕНА $+3 POINT,
1 ; ДА - ВЫКЛЮЧИТЬ ТОЧКУ $+2 POINT, 1 ; НЕТ - ВКЛЮЧИТЬ ТОЧКУ
; -
MOVF MIN_L, W IND_0 MIN_H,
W IND_1 HOUR_L, W IND_2 HOUR_H, W IND_3
GOTO INT_SOURCE ; НЕТ -
ВЕРНУТЬСЯ К ПОИСКУ ИСТОЧНИКОВ ПРЕРЫВАНИЙ
;-
Подпрограмма обработки
прерываний от таймера TMR2
Данная подпрограмма осуществляет
опрос состояния кнопок «+1» и «-1» через промежутки времени, определяемые
таймером TMR2. Если нажата и удерживается одна из кнопок «+1» и «-1»,
происходит инкрементирование или декрементирование соответствующих регистров с
частотой прерываний от таймера TMR2. При кратковременном нажатии происходит однократное изменение
значений регистров.
Если ни одна из кнопок «+1» и «-1»
не нажата, то таймер TMR2 выключается.
Листинг подпрограммы приведен ниже.
;-_TMR2 ;
ОБРАБОТЧИК ПРЕРЫВАНИЙ ОТ TMR2 PIR1, TMR2IF ; СБРОСИТЬ ФЛАГ
ПРЕРЫВАНИЯ ОТ ТАЙМЕРА TMR2
BCF STATUS, Z COUNTER,
W COUNT STATUS, Z ; СЧЕТЧИК ЗАКОНЧИЛ СЧЕТ
GOTO DOWN_BUTT ; ДА -
ПЕРЕХОД К ПРОВЕРКЕ СОСТОЯНИЙ КНОПОК COUNTER, F ; НЕТ -
ИНКРЕМЕНТИРОВАНИЕ СЧЕТЧИКА INT_SOURCE ; ВЕРНУТЬСЯ К ПОИСКУ
ИСТОЧНИКОВ ПРЕРЫВАНИЙ
_BUTT ;
ПРОВЕРКА СОСТОЯНИЙ КНОПОК
; - FLAG_R, 0 ; РЕЖИМ
УСТАНОВКИ ТЕМПЕРАТУРЫ ВКЛЮЧЕН START_TIME ; НЕТ - ПЕРЕХОД К
УСТАНОВКЕ ВРЕМЕНИ ВКЛЮЧЕНИЯ
PORTB, 6 ; НАЖАТА КНОПКА
«+1» M6 ; НЕТ - ПЕРЕХОД К ПРОВЕРКЕ НАЖАТИЯ КНОПКИ «- 1» MAX_TL ;
ИНКРЕМЕНТИРОВАТЬ РЕГИСТР MAX_TL
MOVF MAX_TH, W MAX_TH MAX_TH,
F MAX_TH, F ; ПРИБАВИТЬ К РЕГИСТРУ MAX_TH
ФЛАГ ПЕРЕНОСА
STATUS, Z MAX_TL,
W TEMP_MAXL ; ЗНАЧЕНИЕ В MAX_TL ДОСТИГЛО TEMP_MAXL
BTFSS STATUS, Z M6 ;
НЕТ - ПЕРЕХОД К ПРОВЕРКЕ НАЖАТИЯ КНОПКИ «- 1»
BCF STATUS, Z MAX_TH,
W TEMP_MAXH ; ЗНАЧЕНИЕ В MAX_TH ДОСТИГЛО TEMP_MAXH
BTFSS STATUS, Z M6 ;
НЕТ - ПЕРЕХОД К ПРОВЕРКЕ НАЖАТИЯ КНОПКИ «- 1» STATUS, Z MAX_TH ;
ДА - ОБНУЛИТЬ РЕГИСТРЫ MAX_TH И MAX_TL
CLRF MAX_TL CALL_BIN_DEC PORTB,
7 ; НАЖАТА КНОПКА «- 1»
GOTO STOP_TMR2 ; НЕТ -
ПЕРЕХОД К ОСТАНОВКЕ TMR2 MAX_TL ; ДЕКРЕМЕНТИРОВАТЬ РЕГИСТР MAX_TL STATUS,
C ; ЕСЛИ БЫЛ ЗАЕМ MAX_TH, W ; ДЕКРЕМЕНТИРОВАТЬ
РЕГИСТР MAX_TH
BCF STATUS, C
STATUS, Z
MOVF MAX_TL, F ;
ЗНАЧЕНИЕ В MAX_TL ДОСТИГЛО 0 STATUS, Z STOP_TMR2 ; НЕТ - ПЕРЕХОД
К ОСТАНОВКЕ TMR2 STATUS, Z MAX_TH, F ; ЗНАЧЕНИЕ
В MAX_TH ДОСТИГЛО 0 STATUS, Z STOP_TMR2 ; НЕТ - ПЕРЕХОД К
ОСТАНОВКЕ TMR2
BCF STATUS, Z TEMP_MAXL MAX_TL TEMP_MAXH MAX_TH
_BIN_DEC MAX_TL, W TEMP_TL MAX_TH,
W TEMP_TH
CALL BIN_DEC ; ВЫЗОВ
ПОДПРОГРАММЫ ДВОИЧНО-ДЕСЯТИЧНОЙ КОРРЕКЦИИ_TMR2 T2CON, TMR2ON;
ОСТАНОВКА ТАЙМЕРА TMR2 INT_SOURCE ; ВЕРНУТЬСЯ К ПОИСКУ ИСТОЧНИКОВ
ПРЕРЫВАНИЙ
;-_TIME ;
УСТАНОВКА ВРЕМЕНИ ВКЛЮЧЕНИЯ FLAG_R, 1 ; РЕЖИМ УСТАНОВКИ ВРЕМЕНИ ВКЛЮЧЕНИЯ
ВКЛЮЧЕН STOP_TIME ; НЕТ - ПЕРЕХОД К УСТАНОВКЕ ВРЕМЕНИ ВЫКЛЮЧЕНИЯ
FLAG_R, 5 ; РЕЖИМ УСТАНОВКИ
МИНУТ ВКЛЮЧЕН SET_HOUR ; НЕТ - ПЕРЕХОД К УСТАНОВКЕ ЧАСОВ
PORTB, 6 ;
НАЖАТА КНОПКА «+1» M7 ; НЕТ - ПЕРЕХОД К ПРОВЕРКЕ НАЖАТИЯ КНОПКИ
«- 1»
;-
; СЧЕТЧИК ЕДИНИЦ МИНУТ START_ML,
F ; ИНКРЕМЕНТИРОВАТЬ МЛАДШИЙ СЧЕТЧИК МИНУТ STATUS, Z START_ML, W ;
СЧЕТЧИК ДОСЧИТАЛ ДО 10 0x0A STATUS, Z SET_REG_LCD ; НЕТ -
ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ
; ВРЕМЕНИ ВКЛЮЧЕНИЯ НА ИНДИКАЦИЮ START_ML ;
ДА - ОЧИСТИТЬ МЛАДШИЙ СЧЕТЧИК МИНУТ
;-
; СЧЕТЧИК ДЕСЯТКОВ МИНУТ START_MH,
F ; ИНКРЕМЕНТИРОВАТЬ СТАРШИЙ СЧЕТЧИК МИНУТ STATUS, Z START_MH,
W ; СЧЕТЧИК ДОСЧИТАЛ ДО 6
XORLW 0x06 STATUS,
Z
GOTO SET_REG_LCD ; НЕТ -
ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ
; ТЕКУЩЕГО ВРЕМЕНИ НА ИНДИКАЦИЮ START_MH ;
ДА - ОЧИСТИТЬ СТАРШИЙ СЧЕТЧИК МИНУТ SET_REG_LCD ; НЕТ - ПЕРЕХОД НА
ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ
; ВРЕМЕНИ ВКЛЮЧЕНИЯ НА ИНДИКАЦИЮ
;-
PORTB, 7 ; НАЖАТА КНОПКА
«- 1» STOP_TMR2_2 ; ПЕРЕХОД НА ПОДПРОГРАММУ ОСТАНОВКИ ТАЙМЕРА TMR2
;-
; СЧЕТЧИК ЕДИНИЦ МИНУТ STATUS,
C START_ML, F ; ДЕКРЕМЕНТИРОВАТЬ МЛАДШИЙ СЧЕТЧИК МИНУТ STATUS, C ;
ПРОИЗОШЕЛ ЗАЕМ SET_REG_LCD ; НЕТ - ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ
ВЫВОДОМ
; ВРЕМЕНИ ВКЛЮЧЕНИЯ НА ИНДИКАЦИЮ STATUS,
C 0x09 ; ДА - ЗАГРУЗКА НАЧАЛЬНОГО ЗНАЧЕНИЯ START_ML
;-
; СЧЕТЧИК ДЕСЯТКОВ МИНУТ START_MH,
F ; ДЕКРЕМЕНТИРОВАТЬ СТАРШИЙ СЧЕТЧИК МИНУТ STATUS, C ; ПРОИЗОШЕЛ
ЗАЕМ SET_REG_LCD ; НЕТ - ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ
; ВРЕМЕНИ ВКЛЮЧЕНИЯ НА ИНДИКАЦИЮ STATUS,
C 0x05 ; ДА - ЗАПИСАТЬ НАЧАЛЬНОЕ ЗНАЧЕНИЕ START_MH SET_REG_LCD ;
НЕТ - ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ
; ВРЕМЕНИ ВКЛЮЧЕНИЯ НА ИНДИКАЦИЮ
;-
FLAG_R, 4 ; РЕЖИМ УСТАНОВКИ
ЧАСОВ ВКЛЮЧЕН STOP_TMR2_2 ; ПЕРЕХОД НА ПОДПРОГРАММУ ОСТАНОВКИ ТАЙМЕРА TMR2
;- PORTB, 6 ; НАЖАТА КНОПКА
«+1» M8 ; НЕТ - ПЕРЕХОД К ПРОВЕРКЕ НАЖАТИЯ КНОПКИ «- 1»
; СЧЕТЧИКИ ЧАСОВ START_HL,
F ; ИНКРЕМЕНТИРОВАТЬ МЛАДШИЙ СЧЕТЧИК ЧАСОВ STATUS, Z START_HH,
W ; СТАРШИЙ СЧЕТЧИК ДОСЧИТАЛ ДО 2 0x02 STATUS, Z M9 ;
НЕТ - ПЕРЕХОД НА ПРОВЕРКУ МЛАДШЕГО СЧЕТЧИКА
BCF STATUS, Z START_HL,
W 0x04 STATUS, Z M9 STATUS, Z START_HL ; ДА - ОЧИСТИТЬ МЛАДШИЙ СЧЕТЧИК ЧАСОВ
CLRF START_HH SET_REG_LCD ;
ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ
; ТЕКУЩЕГО ВРЕМЕНИ НА ИНДИКАЦИЮ START_HL,
W 0x0A ; СЧЕТЧИК ДОСЧИТАЛ ДО 10 STATUS, Z SET_REG_LCD ;
НЕТ - ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ
; ВРЕМЕНИ ВКЛЮЧЕНИЯ НА ИНДИКАЦИЮ START_HL ;
ДА - ОЧИСТИТЬ МЛАДШИЙ СЧЕТЧИК ЧАСОВ START_HH ; ИНКРЕМЕНТИРОВАТЬ
СТАРШИЙ СЧЕТЧИК ЧАСОВ SET_REG_LCD ; ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ
ВЫВОДОМ
; ВРЕМЕНИ ВКЛЮЧЕНИЯ НА ИНДИКАЦИЮ
;- PORTB, 6 ; НАЖАТА КНОПКА
«- 1» STOP_TMR2_2 ; ПЕРЕХОД НА ПОДПРОГРАММУ ОСТАНОВКИ ТАЙМЕРА TMR2
; СЧЕТЧИК ЕДИНИЦ ЧАСОВ STATUS,
C START_HL, F ; ДЕКРЕМЕНТИРОВАТЬ МЛАДШИЙ СЧЕТЧИК ЧАСОВ STATUS, C ;
ПРОИЗОШЕЛ ЗАЕМ SET_REG_LCD ; НЕТ - ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ
ВЫВОДОМ
; ВРЕМЕНИ ВКЛЮЧЕНИЯ НА ИНДИКАЦИЮ STATUS,
C 0x09 ; ДА - ЗАГРУЗИТЬ НАЧАЛЬНОЕ ЗНАЧЕНИЕ START_HL
;-
; СЧЕТЧИК ДЕСЯТКОВ ЧАСОВ START_HH,
F ; ДЕКРЕМЕНТИРОВАТЬ СТАРШИЙ СЧЕТЧИК ЧАСОВ STATUS, C ;
ПРОИЗОШЕЛ ЗАЕМ SET_REG_LCD ; НЕТ - ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ
ВЫВОДОМ
; ВРЕМЕНИ ВКЛЮЧЕНИЯ НА ИНДИКАЦИЮ STATUS,
C 0x02 ; ДА - ЗАГРУЗИТЬ НАЧАЛЬНЫЕ ЗНАЧЕНИЯ В СЧЕТЧИКИ
MOVWF START_HH 0x04
MOVWF START_HL SET_REG_LCD ;
НЕТ - ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ
; ВРЕМЕНИ ВКЛЮЧЕНИЯ НА ИНДИКАЦИЮ
;-_TMR2_2 T2CON, TMR2ON;
ОСТАНОВКА ТАЙМЕРА TMR2
SET_REG_LCD START_ML, W IND_0 START_MH,
W IND_1 START_HL, W IND_2 START_HH, W
MOVWF IND_3 POINT, 2 ;
ВЫКЛЮЧИТЬ ТОЧКУ ВО 2-М РАЗРЯДЕ POINT, 1 ; ВКЛЮЧИТЬ ТОЧКУ В 1-М
РАЗРЯДЕ INT_SOURCE ; ВЕРНУТЬСЯ К ПОИСКУ ИСТОЧНИКОВ ПРЕРЫВАНИЙ
;-
; ПОДПРОГРАММА УСТАНОВКИ ВРЕМЕНИ ВЫКЛЮЧЕНИЯ_TIME ;
УСТАНОВКА ВРЕМЕНИ ВЫКЛЮЧЕНИЯ FLAG_R, 2 ; РЕЖИМ УСТАНОВКИ ВРЕМЕНИ ВЫКЛЮЧЕНИЯ
ВКЛЮЧЕН CURRENT_TIME; НЕТ - ПЕРЕХОД К УСТАНОВКЕ ТЕКУЩЕГО ВРЕМЕНИ
FLAG_R, 5 ; РЕЖИМ УСТАНОВКИ
МИНУТ ВКЛЮЧЕН SET_HOUR ; НЕТ - ПЕРЕХОД К УСТАНОВКЕ ЧАСОВ
PORTB, 6 ; НАЖАТА КНОПКА
«+1» M10 ; НЕТ - ПЕРЕХОД К ПРОВЕРКЕ НАЖАТИЯ КНОПКИ «- 1»
;-
; СЧЕТЧИК ЕДИНИЦ МИНУТ STOP_ML,
F ; ИНКРЕМЕНТИРОВАТЬ МЛАДШИЙ СЧЕТЧИК МИНУТ STATUS, Z STOP_ML,
W ; СЧЕТЧИК ДОСЧИТАЛ ДО 10 0x0A STATUS, Z SET_REG_LCD1; НЕТ
- ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ
; ВРЕМЕНИ ВЫКЛЮЧЕНИЯ НА ИНДИКАЦИЮ STOP_ML ;
ДА - ОЧИСТИТЬ МЛАДШИЙ СЧЕТЧИК МИНУТ
;-
; СЧЕТЧИК ДЕСЯТКОВ МИНУТ STOP_MH, F ;
ИНКРЕМЕНТИРОВАТЬ СТАРШИЙ СЧЕТЧИК МИНУТ STATUS, Z STOP_MH, W ;
СЧЕТЧИК ДОСЧИТАЛ ДО 6
XORLW 0x06 STATUS,
Z
GOTO SET_REG_LCD1; НЕТ -
ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ
; ВРЕМЕНИ ВЫКЛЮЧЕНИЯ НА ИНДИКАЦИЮ STOP_MH ;
ДА - ОЧИСТИТЬ СТАРШИЙ СЧЕТЧИК МИНУТ SET_REG_LCD1; ПЕРЕХОД НА ПОДПРОГРАММУ
УПРАВЛЕНИЯ ВЫВОДОМ
; ВРЕМЕНИ ВЫКЛЮЧЕНИЯ НА ИНДИКАЦИЮ
;-
PORTB, 7 ; НАЖАТА КНОПКА
«- 1» STOP_TMR2_3 ; ПЕРЕХОД НА ПОДПРОГРАММУ ОСТАНОВКИ ТАЙМЕРА TMR2
;-
; СЧЕТЧИК ЕДИНИЦ МИНУТ STATUS,
C STOP_ML, F ; ДЕКРЕМЕНТИРОВАТЬ МЛАДШИЙ СЧЕТЧИК МИНУТ STATUS, C ;
ПРОИЗОШЕЛ ЗАЕМ SET_REG_LCD1; НЕТ - ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ
ВЫВОДОМ
; ВРЕМЕНИ ВЫКЛЮЧЕНИЯ НА ИНДИКАЦИЮ STATUS,
C 0x09 ; ДА - ЗАГРУЗКА НАЧАЛЬНОГО ЗНАЧЕНИЯ STOP_ML
;-
; СЧЕТЧИК ДЕСЯТКОВ МИНУТ STOP_MH, F ;
ДЕКРЕМЕНТИРОВАТЬ СТАРШИЙ СЧЕТЧИК МИНУТ STATUS, C ; ПРОИЗОШЕЛ ЗАЕМ SET_REG_LCD1;
НЕТ - ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ
; ВРЕМЕНИ ВЫКЛЮЧЕНИЯ НА ИНДИКАЦИЮ STATUS,
C 0x05 ; ДА - ЗАПИСАТЬ НАЧАЛЬНОЕ ЗНАЧЕНИЕ STOP_MH SET_REG_LCD1;
НЕТ - ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ
; ВРЕМЕНИ ВЫКЛЮЧЕНИЯ НА ИНДИКАЦИЮ
;-
FLAG_R, 4 ; РЕЖИМ УСТАНОВКИ
ЧАСОВ ВКЛЮЧЕН STOP_TMR2_3 ; ПЕРЕХОД НА ПОДПРОГРАММУ ОСТАНОВКИ ТАЙМЕРА TMR2
;- PORTB, 6 ; НАЖАТА КНОПКА
«+1» M11 ; НЕТ - ПЕРЕХОД К ПРОВЕРКЕ НАЖАТИЯ КНОПКИ «- 1»
; СЧЕТЧИКИ ЧАСОВ STOP_HL, F ;
ИНКРЕМЕНТИРОВАТЬ МЛАДШИЙ СЧЕТЧИК ЧАСОВ STATUS, Z STOP_HH, W ;
СТАРШИЙ СЧЕТЧИК ДОСЧИТАЛ ДО 2 0x02 STATUS, Z M12 ;
НЕТ - ПЕРЕХОД НА ПРОВЕРКУ МЛАДШЕГО СЧЕТЧИКА
BCF STATUS, Z STOP_HL,
W 0x04 STATUS, Z M12 STATUS, Z STOP_HL ; ДА - ОЧИСТИТЬ МЛАДШИЙ СЧЕТЧИК ЧАСОВ
CLRF STOP_HH SET_REG_LCD1;
НЕТ - ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ
; ВРЕМЕНИ ВЫКЛЮЧЕНИЯ НА ИНДИКАЦИЮ STOP_HL,
W 0x0A ; СЧЕТЧИК ДОСЧИТАЛ ДО 10 STATUS, Z SET_REG_LCD1;
НЕТ - ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ
; ВРЕМЕНИ ВЫКЛЮЧЕНИЯ НА ИНДИКАЦИЮ STOP_HL ;
ДА - ОЧИСТИТЬ МЛАДШИЙ СЧЕТЧИК ЧАСОВ STOP_HH ; ИНКРЕМЕНТИРОВАТЬ СТАРШИЙ
СЧЕТЧИК ЧАСОВ SET_REG_LCD1; ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ
; ВРЕМЕНИ ВЫКЛЮЧЕНИЯ НА ИНДИКАЦИЮ
;- PORTB, 6 ; НАЖАТА КНОПКА
«- 1» STOP_TMR2_3 ; ПЕРЕХОД НА ПОДПРОГРАММУ ОСТАНОВКИ ТАЙМЕРА TMR2
; СЧЕТЧИК ЕДИНИЦ ЧАСОВ STATUS,
C STOP_HL, F ; ДЕКРЕМЕНТИРОВАТЬ МЛАДШИЙ СЧЕТЧИК ЧАСОВ STATUS, C ;
ПРОИЗОШЕЛ ЗАЕМ SET_REG_LCD1; НЕТ - ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ
ВЫВОДОМ
; ВРЕМЕНИ ВЫКЛЮЧЕНИЯ НА ИНДИКАЦИЮ STATUS,
C 0x09 ; ДА - ЗАГРУЗИТЬ НАЧАЛЬНОЕ ЗНАЧЕНИЕ STOP_HL
;-
; СЧЕТЧИК ДЕСЯТКОВ ЧАСОВ STOP_HH, F ;
ДЕКРЕМЕНТИРОВАТЬ СТАРШИЙ СЧЕТЧИК ЧАСОВ STATUS, C ; ПРОИЗОШЕЛ ЗАЕМ SET_REG_LCD1;
НЕТ - ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ
; ВРЕМЕНИ ВЫКЛЮЧЕНИЯ НА ИНДИКАЦИЮ STATUS,
C 0x02 ; ДА - ЗАГРУЗИТЬ НАЧАЛЬНЫЕ ЗНАЧЕНИЯ В СЧЕТЧИКИ
MOVWF STOP_HH 0x04
MOVWF STOP_HL SET_REG_LCD1; НЕТ
- ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ
; ВРЕМЕНИ ВЫКЛЮЧЕНИЯ НА ИНДИКАЦИЮ
;-_TMR2_3 T2CON, TMR2ON;
ОСТАНОВКА ТАЙМЕРА TMR2
SET_REG_LCD1 STOP_ML, W IND_0 STOP_MH,
W IND_1 STOP_HL, W IND_2 STOP_HH, W
MOVWF IND_3 POINT, 2 ;
ВЫКЛЮЧИТЬ ТОЧКУ ВО 2-М РАЗРЯДЕ POINT, 1 ; ВКЛЮЧИТЬ ТОЧКУ В 1-М
РАЗРЯДЕ INT_SOURCE ; ВЕРНУТЬСЯ К ПОИСКУ ИСТОЧНИКОВ ПРЕРЫВАНИЙ
;-
; ПОДПРОГРАММА УСТАНОВКИ ТЕКУЩЕГО
ВРЕМЕНИ_TIME ; УСТАНОВКА ТЕКУЩЕГО ВРЕМЕНИ FLAG_R, 2 ; РЕЖИМ
УСТАНОВКИ ТЕКУЩЕГО ВРЕМЕНИ ВКЛЮЧЕН INT_SOURCE ; ВЕРНУТЬСЯ К ПОИСКУ
ИСТОЧНИКОВ ПРЕРЫВАНИЙ
FLAG_R, 5 ; РЕЖИМ УСТАНОВКИ
МИНУТ ВКЛЮЧЕН SET_HOUR ; НЕТ - ПЕРЕХОД К УСТАНОВКЕ ЧАСОВ
PORTB, 6 ; НАЖАТА КНОПКА
«+1» M13 ; НЕТ - ПЕРЕХОД К ПРОВЕРКЕ НАЖАТИЯ КНОПКИ «- 1»
;-
; СЧЕТЧИК ЕДИНИЦ МИНУТ MIN_L,
F ; ИНКРЕМЕНТИРОВАТЬ МЛАДШИЙ СЧЕТЧИК МИНУТ STATUS, Z MIN_L, W ;
СЧЕТЧИК ДОСЧИТАЛ ДО 10 0x0A STATUS, Z SET_REG_LCD2; НЕТ -
ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ
; ТЕКУЩЕГО ВРЕМЕНИ НА ИНДИКАЦИЮ MIN_L ;
ДА - ОЧИСТИТЬ МЛАДШИЙ СЧЕТЧИК МИНУТ
;-
; СЧЕТЧИК ДЕСЯТКОВ МИНУТ MIN_H, F ;
ИНКРЕМЕНТИРОВАТЬ СТАРШИЙ СЧЕТЧИК МИНУТ STATUS, Z MIN_H, W ;
СЧЕТЧИК ДОСЧИТАЛ ДО 6
XORLW 0x06 STATUS,
Z
GOTO SET_REG_LCD2; НЕТ -
ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ
; ТЕКУЩЕГО ВРЕМЕНИ НА ИНДИКАЦИЮ MIN_H ;
ДА - ОЧИСТИТЬ СТАРШИЙ СЧЕТЧИК МИНУТ SET_REG_LCD2; НЕТ - ПЕРЕХОД НА
ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ
; ТЕКУЩЕГО ВРЕМЕНИ НА ИНДИКАЦИЮ
;-
PORTB, 7 ; НАЖАТА КНОПКА
«- 1» STOP_TMR2_4 ; ПЕРЕХОД НА ПОДПРОГРАММУ ОСТАНОВКИ ТАЙМЕРА TMR2
;-
; СЧЕТЧИК ЕДИНИЦ МИНУТ STATUS,
C MIN_L, F ; ДЕКРЕМЕНТИРОВАТЬ МЛАДШИЙ СЧЕТЧИК МИНУТ STATUS, C ;
ПРОИЗОШЕЛ ЗАЕМ SET_REG_LCD2; НЕТ - ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ
ВЫВОДОМ
; ТЕКУЩЕГО ВРЕМЕНИ НА ИНДИКАЦИЮ STATUS,
C 0x09 ; ДА - ЗАГРУЗКА НАЧАЛЬНОГО ЗНАЧЕНИЯ MIN_L
;-
; СЧЕТЧИК ДЕСЯТКОВ МИНУТ MIN_H, F ;
ДЕКРЕМЕНТИРОВАТЬ СТАРШИЙ СЧЕТЧИК МИНУТ STATUS, C ; ПРОИЗОШЕЛ ЗАЕМ SET_REG_LCD2;
НЕТ - ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ
; ТЕКУЩЕГО ВРЕМЕНИ НА ИНДИКАЦИЮ STATUS,
C 0x05 ; ДА - ЗАПИСАТЬ НАЧАЛЬНОЕ ЗНАЧЕНИЕ MIN_H SET_REG_LCD2;
НЕТ - ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ
; ВЫВОДОМ ВРЕМЕНИ ВКЛЮЧЕНИЯ НА
ИНДИКАЦИЮ
;-
FLAG_R, 4 ; РЕЖИМ
УСТАНОВКИ ЧАСОВ ВКЛЮЧЕН STOP_TMR2_4 ; ПЕРЕХОД НА
ПОДПРОГРАММУ ОСТАНОВКИ ТАЙМЕРА TMR2
;- PORTB, 6 ;
НАЖАТА КНОПКА «+1» M14 ; НЕТ - ПЕРЕХОД К ПРОВЕРКЕ НАЖАТИЯ
КНОПКИ «- 1»
_HOUR
; СЧЕТЧИКИ ЧАСОВ HOUR_L, F ;
ИНКРЕМЕНТИРОВАТЬ МЛАДШИЙ СЧЕТЧИК ЧАСОВ STATUS, Z HOUR_H, W ;
СТАРШИЙ СЧЕТЧИК ДОСЧИТАЛ ДО 2 0x02 STATUS, Z M15 ;
НЕТ - ПЕРЕХОД НА ПРОВЕРКУ МЛАДШЕГО СЧЕТЧИКА
BCF STATUS, Z HOUR_L,
W 0x04 STATUS, Z M15 STATUS, Z HOUR_L ; ДА - ОЧИСТИТЬ МЛАДШИЙ СЧЕТЧИК ЧАСОВ
CLRF HOUR_H SET_REG_LCD2 ;
ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ
; ТЕКУЩЕГО ВРЕМЕНИ НА ИНДИКАЦИЮ HOUR_L,
W 0x0A ; СЧЕТЧИК ДОСЧИТАЛ ДО 10 STATUS, Z SET_REG_LCD2 ;
НЕТ - ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ
; ВЫВОДОМ ВРЕМЕНИ ВКЛЮЧЕНИЯ НА
ИНДИКАЦИЮ HOUR_L ; ДА - ОЧИСТИТЬ МЛАДШИЙ СЧЕТЧИК ЧАСОВ HOUR_H ;
ИНКРЕМЕНТИРОВАТЬ СТАРШИЙ СЧЕТЧИК ЧАСОВ SET_REG_LCD2 ; НЕТ - ПЕРЕХОД НА
ПОДПРОГРАММУ УПРАВЛЕНИЯ
; ВЫВОДОМ ВРЕМЕНИ ВКЛЮЧЕНИЯ НА
ИНДИКАЦИЮ
;- PORTB, 6 ;
НАЖАТА КНОПКА «- 1» SET_REG_LCD2 ; ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ
; ВРЕМЕНИ ВКЛЮЧЕНИЯ НА ИНДИКАЦИЮ
; СЧЕТЧИК ЕДИНИЦ ЧАСОВ STATUS,
C HOUR_L, F ; ДЕКРЕМЕНТИРОВАТЬ МЛАДШИЙ СЧЕТЧИК ЧАСОВ STATUS,
C ; ПРОИЗОШЕЛ ЗАЕМ SET_REG_LCD2 ; НЕТ - ПЕРЕХОД НА
ПОДПРОГРАММУ УПРАВЛЕНИЯ
; ВЫВОДОМ ВРЕМЕНИ ВКЛЮЧЕНИЯ НА
ИНДИКАЦИЮ STATUS, C 0x09 ; ДА -
ЗАГРУЗИТЬ НАЧАЛЬНОЕ ЗНАЧЕНИЕ HOUR_L
;-
; СЧЕТЧИК ДЕСЯТКОВ ЧАСОВ HOUR_H, F ;
ДЕКРЕМЕНТИРОВАТЬ СТАРШИЙ СЧЕТЧИК ЧАСОВ STATUS, C ;
ПРОИЗОШЕЛ ЗАЕМ SET_REG_LCD2 ; НЕТ - ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ
; ВЫВОДОМ ВРЕМЕНИ ВКЛЮЧЕНИЯ НА
ИНДИКАЦИЮ STATUS, C 0x02 ; ДА -
ЗАГРУЗИТЬ НАЧАЛЬНЫЕ ЗНАЧЕНИЯ В СЧЕТЧИКИ
MOVWF HOUR_H 0x04
MOVWF HOUR_L SET_REG_LCD2 ;
НЕТ - ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ
; ВЫВОДОМ ВРЕМЕНИ ВКЛЮЧЕНИЯ НА
ИНДИКАЦИЮ
;-_TMR2_4 T2CON, TMR2ON ;
ОСТАНОВКА ТАЙМЕРА TMR2
SET_REG_LCD2 MIN_L, W IND_0 MIN_H,
W IND_1 HOUR_L, W IND_2 HOUR_H, W
MOVWF IND_3 POINT, 2 ;
ВЫКЛЮЧИТЬ ТОЧКУ ВО 2-М РАЗРЯДЕ POINT, 1 ; ВКЛЮЧИТЬ ТОЧКУ В
1-М РАЗРЯДЕ INT_SOURCE ; ВЕРНУТЬСЯ К ПОИСКУ ИСТОЧНИКОВ ПРЕРЫВАНИЙ
;-
Подпрограмма обработки
прерываний по входу INT
Данная подпрограмма проверяет
нажатие кнопок выбора режима. При первом нажатии кнопки включается
соответствующий режим и разрешаются прерывания по входам <RB4:RB7> от кнопок
«Установка часов», «Установка минут», «+1» и «-1». При повторном нажатии этой
же кнопки происходит выключение соответствующего режима, запрет прерываний по
входам <RB4:RB7> и, при необходимости, производится запись установленных
значений в EEPROM память данных.
;-
INT_INT ; ОБРАБОТЧИК ПРЕРЫВАНИЙ ПО ВХОДУ INT
;-
BCF INTCON, INTF ; СБРОСИТЬ ФЛАГ ПРЕРЫВАНИЯ ПО ВХОДУ INT
BTFSC PORTA, 2 ; НАЖАТА КНОПКА «УСТАНОВКА ТЕМПЕРАТУРЫ»
GOTO B_TIME_START ; НЕТ - ПЕРЕХОД К ПРОВЕРКЕ НАЖАТИЯ КНОПКИ
; «УСТАНОВКА ВРЕМЕНИ ВКЛЮЧЕНИЯ»
BTFSS FLAG_R, 0 ; РЕЖИМ УСТАНОВКИ ТЕМПЕРАТУРЫ ВКЛЮЧЕН
GOTO START_UST_T ; НЕТ - ПЕРЕХОД НА ПОДПРОГРАММУ ВКЛЮЧЕНИЯ РЕЖИМА
; УСТАНОВКИ ТЕМПЕРАТУРЫ
BCF FLAG_R, 0 ; ВЫКЛЮЧИТЬ РЕЖИМ УСТАНОВКИ ТЕМПЕРАТУРЫ
BSF FLAG_R, 6 ; ВКЛЮЧИТЬ РЕЖИМ ОТОБРАЖЕНИЯ ТЕКУЩЕГО ВРЕМЕНИ
BCF INTCON, RBIE ; ЗАПРЕТИТЬ ПРЕРЫВАНИЯ ПО ВХОДАМ <RB4:RB7>
;-
; ЗАПИСЬ В EEPROM
BANC2
CLRF EEADR ; УСТАНОВКА НАЧАЛЬНОГО АДРЕСА 00h
BANC3
BTFSC EECON1, WR ; ПРОВЕРКА ОКОНЧАНИЯ ЗАПИСИ В EEPROM
GOTO $+1
BANC0
MOVF MAX_TL, W ; ЧТЕНИЕ ДАННЫХ ИЗ РЕГИСТРА MAX_TL
BANC2
MOVWF EEDATA
BANC3
BCF EECON1, EEPGD ; ЗАПИСЬ БУДЕТ ПРОИЗВОДИТЬСЯ В EEPROM
BSF EECON1, WREN ; РАЗРЕШЕНИЕ ЗАПИСИ В EEPROM
MOVLW 0x55 EECON2 0xAA EECON2
BSF EECON1, WR ; ИНИЦИАЛИЗАЦИЯ ЗАПИСИ
BCF EECON1, WREN ; ЗАПРЕТ ЗАПИСИ ВEEPROM
BANC2
INCF EEADR, F ; УВЕЛИЧИТЬ АДРЕС НА 1
BANC3
BTFSC EECON1, WR ; ПРОВЕРКА ОКОНЧАНИЯ ЗАПИСИ В EEPROM
GOTO $+1
BANC0
MOVF MAX_TH, W ; ЧТЕНИЕ ДАННЫХ ИЗ РЕГИСТРА MAX_TH
BANC2
MOVWF EEDATA
BANC3
BSF EECON1, WREN ; РАЗРЕШЕНИЕ ЗАПИСИ В EEPROM
MOVLW 0x55 EECON2 0xAA EECON2
BSF EECON1, WR ; ИНИЦИАЛИЗАЦИЯ ЗАПИСИ
BCF EECON1, WREN ; ЗАПРЕТ ЗАПИСИ ВEEPROM
BANC0
GOTO INT_SOURCE ; ВЕРНУТЬСЯ К ПОИСКУ ИСТОЧНИКОВ ПРЕРЫВАНИЙ
;-
START_UST_T ; ПОДПРОГРАММА ВКЛЮЧЕНИЯ РЕЖИМА УСТАНОВКИ ТЕМПЕРАТУРЫ
MOVLW B'00000001' ; ВКЛЮЧИТЬ РЕЖИМ УСТАНОВКИ ТЕМПЕРАТУРЫ
MOVWF FLAG_R ; ОСТАЛЬНЫЕ ВЫКЛЮЧИТЬ
BSF INTCON, RBIE ; РАЗРЕШИТЬ ПРЕРЫВАНИЯ ПО ВХОДАМ <RB4:RB7>
GOTO INT_SOURCE ; ВЕРНУТЬСЯ К ПОИСКУ ИСТОЧНИКОВ ПРЕРЫВАНИЙ
;-
B_TIME_START ; ПРОВЕРКА НАЖАТИЯ КНОПКИ «УСТАНОВКА ВРЕМЕНИ
; ВКЛЮЧЕНИЯ»
BTFSC PORTA, 2 ; НАЖАТА КНОПКА «УСТАНОВКА ВРЕМЕНИ ВКЛЮЧЕНИЯ»
GOTO B_TIME_STOP ; НЕТ - ПЕРЕХОД К ПРОВЕРКЕ НАЖАТИЯ КНОПКИ
; «УСТАНОВКА ВРЕМЕНИ ВЫКЛЮЧЕНИЯ»
BTFSS FLAG_R, 1 ; РЕЖИМ УСТАНОВКИ ВРЕМЕНИ ВКЛЮЧЕНИЯ ВКЛЮЧЕН
GOTO START_UST_T_ST ; НЕТ - ПЕРЕХОД НА ПОДПРОГРАММУ ВКЛЮЧЕНИЯ РЕЖИМА
; УСТАНОВКИ ВРЕМЕНИ ВКЛЮЧЕНИЯ
BCF FLAG_R, 1 ; ВЫКЛЮЧИТЬ РЕЖИМ УСТАНОВКИ ВРЕМЕНИ ВЫКЛЮЧЕНИЯ
BSF FLAG_R, 6 ; ВКЛЮЧИТЬ РЕЖИМ ОТОБРАЖЕНИЯ ТЕКУЩЕГО ВРЕМЕНИ
BCF INTCON, RBIE ; ЗАПРЕТИТЬ ПРЕРЫВАНИЯ ПО ВХОДАМ <RB4:RB7>
;-
; ЗАПИСЬ В EEPROM
BANC2
MOVLW 0x02
MOVWF EEADR ; УСТАНОВКА НАЧАЛЬНОГО АДРЕСА 02h
BANC3
BTFSC EECON1, WR ; ПРОВЕРКА ОКОНЧАНИЯ ЗАПИСИ В EEPROM
GOTO $+1
BANC0
MOVF START_ML, W ; ЧТЕНИЕ ДАННЫХ ИЗ РЕГИСТРА START_ML
BANC2
MOVWF EEDATA
BANC3
BCF EECON1, EEPGD ; ЗАПИСЬ БУДЕТ ПРОИЗВОДИТЬСЯ В EEPROM
BSF EECON1, WREN ; РАЗРЕШЕНИЕ ЗАПИСИ В EEPROM
MOVLW 0x55 EECON2 0xAA EECON2
BSF EECON1, WR ; ИНИЦИАЛИЗАЦИЯ ЗАПИСИ
BCF EECON1, WREN ; ЗАПРЕТ ЗАПИСИ ВEEPROM
BANC2
INCF EEADR, F ; УВЕЛИЧИТЬ АДРЕС НА 1
BANC3
BTFSC EECON1, WR ; ПРОВЕРКА ОКОНЧАНИЯ ЗАПИСИ В EEPROM
GOTO $+1
BANC0
MOVF START_MH, W ; ЧТЕНИЕ ДАННЫХ ИЗ РЕГИСТРА START_MH
BANC2
MOVWF EEDATA
BANC3
BCF EECON1, EEPGD ; ЗАПИСЬ БУДЕТ ПРОИЗВОДИТЬСЯ В EEPROM
BSF EECON1, WREN ; РАЗРЕШЕНИЕ ЗАПИСИ В EEPROM
MOVLW 0x55 EECON2 0xAA EECON2
BSF EECON1, WR ; ИНИЦИАЛИЗАЦИЯ ЗАПИСИ
BCF EECON1, WREN ; ЗАПРЕТ ЗАПИСИ ВEEPROM
BANC2
INCF EEADR, F ; УВЕЛИЧИТЬ АДРЕС НА 1
BANC3
BTFSC EECON1, WR ; ПРОВЕРКА ОКОНЧАНИЯ ЗАПИСИ В EEPROM
GOTO $+1
BANC0
MOVF START_HL, W ; ЧТЕНИЕ ДАННЫХ ИЗ РЕГИСТРА START_HL
BANC2
MOVWF EEDATA
BANC3
BCF EECON1, EEPGD ; ЗАПИСЬ БУДЕТ ПРОИЗВОДИТЬСЯ В EEPROM
BSF EECON1, WREN ; РАЗРЕШЕНИЕ ЗАПИСИ В EEPROM
MOVLW 0x55 EECON2 0xAA EECON2
BSF EECON1, WR ; ИНИЦИАЛИЗАЦИЯ ЗАПИСИ
BCF EECON1, WREN ; ЗАПРЕТ ЗАПИСИ ВEEPROM
BANC2
INCF EEADR, F ; УВЕЛИЧИТЬ АДРЕС НА 1
BANC3
BTFSC EECON1, WR ; ПРОВЕРКА ОКОНЧАНИЯ ЗАПИСИ В EEPROM
GOTO $+1
BANC0
MOVF START_HH, W ; ЧТЕНИЕ ДАННЫХ ИЗ РЕГИСТРА START_HH
BANC2
MOVWF EEDATA
BANC3
BCF EECON1, EEPGD ; ЗАПИСЬ БУДЕТ ПРОИЗВОДИТЬСЯ В EEPROM
BSF EECON1, WREN ; РАЗРЕШЕНИЕ ЗАПИСИ В EEPROM
MOVLW 0x55 EECON2 0xAA EECON2
BSF EECON1, WR ; ИНИЦИАЛИЗАЦИЯ ЗАПИСИ
BCF EECON1, WREN ; ЗАПРЕТ ЗАПИСИ ВEEPROM
BANC0
GOTO INT_SOURCE ; ВЕРНУТЬСЯ К ПОИСКУ ИСТОЧНИКОВ ПРЕРЫВАНИЙ
;-
START_UST_T_ST ; ПОДПРОГРАММА ВКЛЮЧЕНИЯ РЕЖИМА УСТАНОВКИ ВРЕМЕНИ ВКЛЮЧЕНИЯ
MOVLW B'00000010' ; ВКЛЮЧИТЬ РЕЖИМ УСТАНОВКИ ВРЕМЕНИ ВКЛЮЧЕНИЯ
MOVWF FLAG_R ; ОСТАЛЬНЫЕ ВЫКЛЮЧИТЬ
BSF INTCON, RBIE ; РАЗРЕШИТЬ ПРЕРЫВАНИЯ ПО ВХОДАМ <RB4:RB7>
GOTO INT_SOURCE ; ВЕРНУТЬСЯ К ПОИСКУ ИСТОЧНИКОВ ПРЕРЫВАНИЙ
;-
B_TIME_STOP ; ПРОВЕРКА НАЖАТИЯ КНОПКИ
«УСТАНОВКА ВРЕМЕНИ
; ВЫКЛЮЧЕНИЯ»
BTFSC PORTA, 3 ; НАЖАТА КНОПКА «УСТАНОВКА ВРЕМЕНИ ВЫКЛЮЧЕНИЯ»
GOTO B_TIME_CURR ; НЕТ - ПЕРЕХОД К ПРОВЕРКЕ НАЖАТИЯ КНОПКИ
; «УСТАНОВКА ТЕКУЩЕГО ВРЕМЕНИ»
BTFSS FLAG_R, 2 ; РЕЖИМ УСТАНОВКИ ВРЕМЕНИ ВЫКЛЮЧЕНИЯ ВКЛЮЧЕН
GOTO START_UST_T_SP ; НЕТ - ПЕРЕХОД НА ПОДПРОГРАММУ ВКЛЮЧЕНИЯ РЕЖИМА
; УСТАНОВКИ ВРЕМЕНИ ВЫКЛЮЧЕНИЯ
BCF FLAG_R, 2 ; ВЫКЛЮЧИТЬ РЕЖИМ УСТАНОВКИ ВРЕМЕНИ ВЫКЛЮЧЕНИЯ
BSF FLAG_R, 6 ; ВКЛЮЧИТЬ РЕЖИМ ОТОБРАЖЕНИЯ ТЕКУЩЕГО ВРЕМЕНИ
BCF INTCON, RBIE ; ЗАПРЕТИТЬ ПРЕРЫВАНИЯ ПО ВХОДАМ <RB4:RB7>
;-
; ЗАПИСЬ В EEPROM
BANC2
MOVLW 0x06
MOVWF EEADR ; УСТАНОВКА НАЧАЛЬНОГО АДРЕСА 06h
BANC3
BTFSC EECON1, WR ; ПРОВЕРКА ОКОНЧАНИЯ ЗАПИСИ В EEPROM
GOTO $+1
BANC0
MOVF STOP_ML, W ; ЧТЕНИЕ ДАННЫХ ИЗ РЕГИСТРА STOP_ML
BANC2
MOVWF EEDATA
BANC3
BCF EECON1, EEPGD ; ЗАПИСЬ БУДЕТ ПРОИЗВОДИТЬСЯ В EEPROM
BSF EECON1, WREN ; РАЗРЕШЕНИЕ ЗАПИСИ В EEPROM
MOVLW 0x55 EECON2 0xAA EECON2
BSF EECON1, WR ; ИНИЦИАЛИЗАЦИЯ ЗАПИСИ
BCF EECON1, WREN ; ЗАПРЕТ ЗАПИСИ ВEEPROM
BANC2
INCF EEADR, F ; УВЕЛИЧИТЬ АДРЕС НА 1
BANC3
BTFSC EECON1, WR ; ПРОВЕРКА ОКОНЧАНИЯ ЗАПИСИ В EEPROM
GOTO $+1
BANC0
MOVF STOP_MH, W ; ЧТЕНИЕ ДАННЫХ ИЗ РЕГИСТРА STOP_MH
BANC2
MOVWF EEDATA
BANC3
BCF EECON1, EEPGD ; ЗАПИСЬ БУДЕТ ПРОИЗВОДИТЬСЯ В EEPROM
BSF EECON1, WREN ; РАЗРЕШЕНИЕ ЗАПИСИ В EEPROM
MOVLW 0x55 EECON2 0xAA EECON2
BSF EECON1, WR ; ИНИЦИАЛИЗАЦИЯ ЗАПИСИ
BCF EECON1, WREN ; ЗАПРЕТ ЗАПИСИ ВEEPROM
BANC2
INCF EEADR, F ; УВЕЛИЧИТЬ АДРЕС НА 1
BANC3
BTFSC EECON1, WR ; ПРОВЕРКА ОКОНЧАНИЯ ЗАПИСИ В EEPROM
GOTO $+1
BANC0
MOVF STOP_HL, W ; ЧТЕНИЕ ДАННЫХ ИЗ РЕГИСТРА STOP_HL
BANC2
MOVWF EEDATA
BANC3
BCF EECON1, EEPGD ; ЗАПИСЬ БУДЕТ ПРОИЗВОДИТЬСЯ В EEPROM
BSF EECON1, WREN ; РАЗРЕШЕНИЕ ЗАПИСИ В EEPROM
MOVLW 0x55 EECON2 0xAA EECON2
BSF EECON1, WR ; ИНИЦИАЛИЗАЦИЯ ЗАПИСИ
BCF EECON1, WREN ; ЗАПРЕТ ЗАПИСИ ВEEPROM
BANC2
INCF EEADR, F ; УВЕЛИЧИТЬ АДРЕС НА 1
BANC3
BTFSC EECON1, WR ; ПРОВЕРКА ОКОНЧАНИЯ ЗАПИСИ В EEPROM
GOTO $+1
BANC0
MOVF STOP_HH, W ; ЧТЕНИЕ ДАННЫХ ИЗ РЕГИСТРА STOP_HH
BANC2
MOVWF EEDATA
BANC3
BCF EECON1, EEPGD ; ЗАПИСЬ БУДЕТ ПРОИЗВОДИТЬСЯ В EEPROM
BSF EECON1, WREN ; РАЗРЕШЕНИЕ ЗАПИСИ В EEPROM
MOVLW 0x55 EECON2 0xAA EECON2
BSF EECON1, WR ; ИНИЦИАЛИЗАЦИЯ ЗАПИСИ
BCF EECON1, WREN ; ЗАПРЕТ ЗАПИСИ ВEEPROM
BANC0
GOTO INT_SOURCE ; ВЕРНУТЬСЯ К ПОИСКУ ИСТОЧНИКОВ ПРЕРЫВАНИЙ
;-
START_UST_T_SP ; ПОДПРОГРАММА ВКЛЮЧЕНИЯ РЕЖИМА УСТАНОВКИ ВРЕМЕНИ
; ВЫКЛЮЧЕНИЯ
MOVLW B'00000100' ; ВКЛЮЧИТЬ РЕЖИМ УСТАНОВКИ ВРЕМЕНИ ВЫКЛЮЧЕНИЯ
MOVWF FLAG_R ; ОСТАЛЬНЫЕ ВЫКЛЮЧИТЬ
BSF INTCON, RBIE ; РАЗРЕШИТЬ ПРЕРЫВАНИЯ ПО ВХОДАМ <RB4:RB7>
GOTO INT_SOURCE ; ВЕРНУТЬСЯ К ПОИСКУ ИСТОЧНИКОВ ПРЕРЫВАНИЙ
;-
B_TIME_CURR ; ПРОВЕРКА НАЖАТИЯ КНОПКИ «УСТАНОВКА ТЕКУЩЕГО
; ВРЕМЕНИ»
BTFSC PORTA, 4 ; НАЖАТА КНОПКА «УСТАНОВКА ТЕКУЩЕГО ВРЕМЕНИ»
GOTO INT_SOURCE ; ВЕРНУТЬСЯ К ПОИСКУ ИСТОЧНИКОВ ПРЕРЫВАНИЙ
BTFSS FLAG_R, 3 ; РЕЖИМ УСТАНОВКИ ТЕКУЩЕГО ВРЕМЕНИ ВКЛЮЧЕН
GOTO START_UST_T_CUR ; НЕТ - ПЕРЕХОД НА ПОДПРОГРАММУ ВКЛЮЧЕНИЯ РЕЖИМА
; УСТАНОВКИ ТЕКУЩЕГО ВРЕМЕНИ
BCF FLAG_R, 3 ; ВЫКЛЮЧИТЬ РЕЖИМ УСТАНОВКИ ТЕКУЩЕГО ВРЕМЕНИ
BSF FLAG_R, 6 ; ВКЛЮЧИТЬ РЕЖИМ ОТОБРАЖЕНИЯ ТЕКУЩЕГО ВРЕМЕНИ
MOVLW B'00001011' ; ВКЛЮЧИТЬ МОДУЛЬ CCP1
MOVWF CCP1CON
BCF INTCON, RBIE ; ЗАПРЕТИТЬ ПРЕРЫВАНИЯ ПО ВХОДАМ <RB4:RB7>
;-
START_UST_T_CUR ; ПОДПРОГРАММА ВКЛЮЧЕНИЯ РЕЖИМА УСТАНОВКИ ТЕКУЩЕГО ВРЕМЕНИ
CLRF CCP1CON ; ВЫКЛЮЧИТЬ МОДУЛЬ CCP1
MOVLW B'00001000' ; ВКЛЮЧИТЬ РЕЖИМ УСТАНОВКИ ТЕКУЩЕГО ВРЕМЕНИ
MOVWF FLAG_R ; ОСТАЛЬНЫЕ ВЫКЛЮЧИТЬ
CLRF SEC_L ; ОЧИСТИТЬ СЧЕТЧИКИ СЕКУНД
CLRF SEC_H
BSF INTCON, RBIE ; РАЗРЕШИТЬ ПРЕРЫВАНИЯ ПО ВХОДАМ <RB4:RB7>
GOTO INT_SOURCE ; ВЕРНУТЬСЯ К ПОИСКУ ИСТОЧНИКОВ ПРЕРЫВАНИЙ
;-
Подпрограмма обработки
прерываний по входам <RB4:RB7>
Данная подпрограмма проверяет
нажатие кнопок «Установка часов», «Установка минут», «+1» и «-1». Если нажата
кнопка «+1» или «-1», происходит запуск таймера TMR2 и переход к установке
соответствующей величины (температуры, времени включения, времени выключения,
текущего времени). Если же обе кнопки отпущены, происходит остановка таймера TMR2. Нажатие кнопок
«Установка часов» и «Установка минут» приводит к включению соответствующего
режима.
Листинг подпрограммы приведен ниже.
;-_RB ;
ОБРАБОТЧИК ПРЕРЫВАНИЙ ПО ВХОДАМ <RB4:RB7> INTCON, RBIF ;
СБРОСИТЬ ФЛАГ ПРЕРЫВАНИЯ ПО ВХОДАМ <RB4:RB7> PORTB, 5 ;
НАЖАТА КНОПКА «УСТАНОВКА МИНУТ» $+4 FLAG_R, 5 ; ДА -
ВКЛЮЧИТЬ РЕЖИМ УСТАНОВКИ МИНУТ FLAG_R, 4 ; ВЫКЛЮЧИТЬ
РЕЖИМ УСТАНОВКИ ЧАСОВ $+5 PORTB, 4 ; НАЖАТА КНОПКА «УСТАНОВКА
ЧАСОВ» $+3 FLAG_R, 4 ; ДА - ВКЛЮЧИТЬ РЕЖИМ УСТАНОВКИ ЧАСОВ FLAG_R,
5 ; ВЫКЛЮЧИТЬ РЕЖИМ УСТАНОВКИ МИНУТ
PORTB, 6 ;
НАЖАТА КНОПКА «+1» $+2 $+3 PORTB, 7 $+3 T2CON, TMR2ON ;
ЗАПУСК ТАЙМЕРА TMR2 DOWN_BUTT ; ПЕРЕХОД НА ПРОВЕРКУ
СОСТОЯНИЙ КНОПОК T2CON, TMR2ON ; ОСТАНОВКА ТАЙМЕРА TMR2 COUNTER INT_SOURCE ;
ВЕРНУТЬСЯ К ПОИСКУ ИСТОЧНИКОВ ПРЕРЫВАНИЙ
;-
Подпрограмма приема /
передачи данных через USART
Данная подпрограмма проверяет
данные, записанные в буфер приемника USART, и, если они соответствуют коду запроса чтения EEPROM (константа CONST_COD), читает данные из EEPROM, а затем осуществляет
передачу этих данных во внешнее устройство, используя модуль USART.
;-_PRT ;
ПОДПРОГРАММА ПРИЕМА/ПЕРЕДАЧИ ДАННЫХ ЧЕРЕЗ USART PIE1, RCIE ; ЗАПРЕТИТЬ
ПРЕРЫВАНИЯ ОТ ПРИЕМНИКА USART
;-
; ПРОВЕРКА НА ОТСУТСТВИЕ ОШИБОК
КАДРА RCSTA, OERR ; ПРОИЗОШЛА ОШИБКА КАДРА $+3 ; НЕТ -
ПЕРЕХОД К ИДЕНТИФИКАЦИИ КОДА ЗАПРОСА
; ПЕРЕДАЧИ ДАННЫХ RCSTA, OERR ;
СБРОСИТЬ ФЛАГ ОШИБКИ КАДРА INT_SOURCE ; ВЕРНУТЬСЯ К ПОИСКУ
ИСТОЧНИКОВ ПРЕРЫВАНИЙ
;-
; ИДЕНТИФИКАЦИЯ КОДА ЗАПРОСА
ПЕРЕДАЧИ ДАННЫХ STATUS, Z RCREG, W ; ЧТЕНИЕ ДАННЫХ ИЗ БУФЕРА
ПРИЕМНИКА PIR1, RCIF ; СБРОСИТЬ ФЛАГ ПРЕРЫВАНИЯ ОТ ПРИЕМНИКА USART CONST_COD ;
СРАВНИТЬ КОД STATUS, Z ; КОД ВЕРНЫЙ INT_SOURCE ;
ВЕРНУТЬСЯ К ПОИСКУ ИСТОЧНИКОВ ПРЕРЫВАНИЙ
;-
; ЧТЕНИЕ ДАННЫХ ИЗ EEPROM И ПЕРЕДАЧА
ЧЕРЕЗ USART EEADR ; ОЧИСТИТЬ РЕГИСТР АДРЕСА EECON1,
EEPGD; УСТАНОВИТЬ ЧТЕНИЕ ИЗ EEPROM EECON1, RD ; НАЧАТЬ ЧТЕНИЕ EEDATA,
W ; ПРОЧИТАТЬ РЕГИСТР ДАННЫХ TXREG ; ПОМЕСТИТЬ
СОДЕРЖИМОЕ ТЕКУЩЕЙ ЯЧЕЙКИ ПАМЯТИ
; В БУФЕР ПЕРЕДАТЧИКА TXSTA, TXEN ;
РАЗРЕШИТЬ ПЕРЕДАЧУ EEADR, F ; УВЕЛИЧИТЬ НА 1 АДРЕС ТЕКУЩЕЙ ЯЧЕЙКИ
ПАМЯТИ
MOVF EEADR, W 0x0A
BTFSC PIR1, TXIF ; ОЖИДАТЬ
ОКОНЧАНИЕ ПЕРЕДАЧИ
GOTO $-1 STATUS,
Z READ
GOTO INT_SOURCE ;
ВЕРНУТЬСЯ К ПОИСКУ ИСТОЧНИКОВ ПРЕРЫВАНИЙ
;-
Подпрограмма
восстановления контекста
Данная подпрограмма осуществляет
восстановление содержимого аккумулятора и регистра STATUS перед выходом из
обработчиков прерываний.
Листинг программы приведен ниже.
;-_INT ;
ВОССТАНОВЛЕНИЕ АККУМУЛЯТОРА И РЕГИСТРА STATUS PIE1, RCIE ; РАЗРЕШИТЬ
ПРЕРЫВАНИЯ ОТ ПРИЕМНИКА USART
BANC0 STATUS_TEMP,
W ; ВОССТАНОВИТЬ РЕГИСТР STATUS
MOVWF STATUS STATUS, RP0 ;
ОПРЕДЕЛЕНИЕ ТЕКУЩЕГО БАНКА
GOTO REST_WREG STATUS,
RP0 ; ВЫБОР БАНКА 0 W_TEMP, F ; ВОССТАНОВИТЬ
АККУМУЛЯТОР
SWAPF W_TEMP, W STATUS,
RP0 ; ВЫБОР БАНКА 1_WREG W_TEMP, F ; ВОССТАНОВИТЬ АККУМУЛЯТОР W_TEMP, W
RETURN ; ВЕРНУТЬСЯ ИЗ ПРЕРЫВАНИЯ
;-
3. Расчет электрических
параметров МПС
Рассчитаем мощность, потребляемую
микроконтроллером:
;
программа микропроцессорный
управление датчик
где -
напряжение относительно
;
- максимальный ток
вывода ;
- выходное напряжение
высокого уровня;
- ток I/O канала;
- выходное напряжение
низкого уровня;
- ток I/O канала.
Рассчитаем мощность,
рассеиваемую всеми резисторами схемы:
;
где -
напряжение на i-м резисторе;
- сопротивление i-го резистора.
;
Рассчитаем мощность,
рассеиваемую светодиодами:
;
где -
напряжение на i-м светодиоде;
- ток в i-м светодиоде.
;
Рассчитаем мощность,
рассеиваемую светодиодными индикаторами:
;
где -
напряжение на i-м индикаторе;
- ток в i-м индикаторе.
Ток определяется
суммой токов всех сегментов, .
;
Токи, потребляемые микросхемами,
приведены в таблице 3.
Таблица 3 - Токи, потребляемые
микросхемами
Напряжение питания, В
|
Микросхема
|
Потребляемый ток, мА
|
|
Обозначение
|
Наименование
|
|
+15
|
DA2
|
AD210
|
50
|
Итого
|
50
|
+5
|
DD1
|
К155ЛН1
|
33
|
|
DD2
|
PIC16F873
|
43
|
|
DD3
|
MAX6958
|
150
|
|
DD4
|
MXL1543
|
150
|
|
DA1
|
АОТ101АС
|
5
|
Итого
|
381
|
Таким образом, суммарная
потребляемая мощность будет равна:
4. Разработка блока
питания
Для питания
проектируемой микропроцессорной системы управления необходим блок питания,
отдающий в нагрузку мощность не менее 2,81 Вт. Максимальный выходной ток по
цепи +5В должен быть не менее 381 мА, по цепям +15В - не менее 50 мА. Схема
блока питания приведена на рисунке 16.
В качестве
трансформатора T1 выбран унифицированный
трансформатор ТПП232-127/220-50. Этот трансформатор имеет габаритную мощность 9
В·А. Напряжения на обмотках следующие: U11-12
= U13-14 = 5,04В; U15-16
= U17-18 = 10В; U19-20
= U20-22 = 2,63В. Максимальный ток каждой обмотки 0,255А.
Для стабилизации
напряжения +5В используется интегральный стабилизатор LM7805,
рассчитанный на максимальный ток 1,5 А. Для стабилизации напряжения +15В
используется интегральный стабилизатор LM7815.
Он рассчитан на максимальный ток 0,15 А.
Рисунок 15 -
Принципиальная электрическая схема блока питания
Список использованных
источников
программа микропроцессорный
управление датчик
1. Сташин В.В. Проектирование цифровых устройств на
однокристальных микроконтроллерах / Сташин В.В. - М.:Энергоатомиздат, 1990.
189-224 с
2. Щелкунов Н.Н. Микропроцессорные средства и системы / Щелкунов
Н.Н., Дианов А.Н. - М.:Радио и связь, 1989. - 117-152 c
3. Официальный сайт компании Maxim Integrated Products and Dallas Semiconductor [Электронный ресурс] MAX6958/MAX6959
2-Ware Interfaced, 3V to 5,5V, 4-Digit, 9-Segment LED Display Drivers with Keyscan.
Режим доступа: http://www.maxim-ic.com/quick_view2.cfm/qv_pk/3638