Микропроцессорныая система.
Автоматический чайник
Однако к настоящему времени значительную часть мирового рынка микропроцессорных средств составляет другой вид однокристальных контроллеров — это т.н. периферийные интерфейсные контроллеры или PIC. Они представляют собой высокопроизводительные БИС, в которые интегрированы помимо цифровых устройств (собственно микроконтроллера) также и аналоговые — это различные АЦП, компараторы, модули сравнения… Читать ещё >
Микропроцессорныая система. Автоматический чайник (реферат, курсовая, диплом, контрольная)
Микропроцессорные и информационно-управляющие системы, в настоящее время, стали одним из наиболее дешевых и быстрых способов обработки информации. Практически ни одна область современной науки и техники не обходиться без использования их.
В настоящее время всё острее встают проблемы безопасности. Практика показывает, что наибольшее число аварийных ситуаций возникает из-за ошибочных действий человека. В связи с этим большое значение имеет применение в системах управления технических средств позволяющих полностью автоматизировать этот процесс. Развитие микропроцессорных и информационно-управляющих систем позволило перейти на качественно новую элементную базу, которая в свою очередь повысила скорость и качество выполнения операций.
В течении четырех лет, начиная с 1976 г., фирмой INTEL разрабатывалось получившее широкое распространение семейство 8-и разрядных однокристальных микроконтроллеров с программным управлением MCS-48.
Вычислительные возможности первых однокристальных микроЭВМ были исчерпаны уже к началу 80-х гг. Встала задача разработки новых микроконтроллеров, обладающих расширенными функциональными ресурсами. Среди предложенных новых архитектур однокристальных микроЭВМ следует выделить 8-и разрядную архитектуру семейства микроконтроллеров MCS-51, предложенного фирмой INTEL в 1981 г. Она удовлетворяет всем требованиям, представляемым к однокристальным микроконтроллерам, и является наиболее применяемой.
Однако к настоящему времени значительную часть мирового рынка микропроцессорных средств составляет другой вид однокристальных контроллеров — это т.н. периферийные интерфейсные контроллеры или PIC. Они представляют собой высокопроизводительные БИС, в которые интегрированы помимо цифровых устройств (собственно микроконтроллера) также и аналоговые — это различные АЦП, компараторы, модули сравнения ШИМ и т. д. Это делает данные устройства чрезвычайно популярными у производителей «интеллектуальных» устройств.
Исходя из вышеперечисленного, разрабатываемая нами система управления барокамерой будет обладать следующими свойствами:
· Простота в установке, наладке и эксплуатации;
· Небольшие габариты;
· Небольшая стоимость;
· Обработка системой различных аварийных ситуаций;
Возможность получения информации о состоянии установки и технологического процесса с помощью ЭВМ.
1. Разработка аппаратного обеспечения
1.1 Функциональная схема микропроцессорной системы управления
Функциональная схема системы управления представлена на рисунке 1.
Рисунок 1 — Функциональная схема системы управления На рисунке представлена функциональная схема системы управления, на которой указаны подключения к микроконтроллеру всех датчиков. При необходимости при подключении датчиков, для согласования сигналов, использовались схемы сопряжения (СС). Кроме того на схеме указано подключение к микроконтроллеру 4-х 7-сегментных светодиодных индикаторов через схему управления (СУ), подключенную к шине I2C и согласование микроконтроллера с интерфейсом RS-449. Также на схеме показаны все выходные сигналы, используемые для управления различными устройствами.
1.2 Выбор элементной базы
1.2.1 Выбор микроконтроллера
Таблица 1 — Наименование линий ввода / вывода микроконтроллера
Датчики | Исполнительный механизм | Прочее | Тип линии | |
1 (температуры) | ; | ; | Аналоговая | |
1 (уровня) | ; | ; | Цифровая | |
; | 1 (нагреватель) | ; | Цифровая | |
; | ; | 9 (клавиатура) | Цифровая | |
; | ; | 1 (прерывание от клавиатуры) | Цифровая | |
; | ; | 2 (выводы тактового генератора таймера TMR1) | Цифровая | |
; | ; | 2 (I2C) | Цифровая | |
; | ; | 1 (индикация снижения уровня) | Цифровая | |
; | ; | 2 (USART) | Цифровая | |
Для обработки информации со всех датчиков и для управления всеми устройствами необходимо 20 линий ввода / вывода.
Контроллер должен иметь следующие периферийные модули:
1. Модуль АЦП для обработки сигнала от датчика температуры;
2. EEPROM память данных для хранения установок времени и температуры.
3. Модуль USART для обеспечения возможности передачи данных из EEPROM во внешнее устройство.
4. Модуль MSSP для управления индикаторами по шине I2С.
5. Таймер TMR1 с отдельным генератором для формирования секундных импульсов.
6. Таймер TMR2 для формирования временных задержек при опросе состояния кнопок.
В данной МПС используется микроконтроллер PIC16F873. Этот контроллер содержит все необходимые периферийные модули и имеет 22 линии ввода / вывода. Назначение выводов следующее:
RA0/AN0 — вход АЦП обработки сигнала от датчика температуры;
RC6/TX — выход передатчика USART;
RC7/RX — вход приемника USART;
RC0/T1OSO — выход генератора таймера TMR1;
RC1/T1OSI — вход генератора таймера TMR1;
RC3/SCL — шина синхронизации интерфейса I2C;
RC4/SDA — шина данных интерфейса I2C;
RB0/INT — вход прерываний по нажатию кнопок клавиатуры;
RA1 — RA5, RB1, RB4 — RB7 — цифровые порты ввода / вывода.
Микроконтроллеры семейства PIC имеют очень эффективную систему команд, состоящую всего из 35 инструкций. Все инструкции выполняются за один цикл, за исключением условных переходов и команд, изменяющих программный счетчик, которые выполняются за 2 цикла. Один цикл выполнения инструкции состоит из 4 периодов тактовой частоты. Каждая инструкция состоит из 14 бит, делящихся на код операции и операнд (возможна манипуляция с регистрами, ячейками памяти и непосредственными данными).
Высокая скорость выполнения команд в PIC-контроллерах достигается за счет использования двухшинной гарвардской архитектуры вместо традиционной одношинной Фон-Неймановской. Гарвардская архитектура основывается на наборе регистров с разделенными шинами и адресным пространством для команд и для данных. Набор регистров означает, что все программные объекты, такие как порты ввода / вывода, ячейки памяти и таймер, представляют собой физически реализованные аппаратные регистры.
1.2.2 Разработка схемы сопряжения для подключения датчика уровня воды
Схема сопряжения обеспечивает гальваническую развязку датчика уровня и линии ввода RA1 контроллера. Схема сопряжения представлена на рисунке 2.
Рисунок 2 — Схема сопряжения для подключения датчика уровня воды Сигнал сдатчика (верхний уровень +30В) через ограничительный резистор R1 поступает на транзисторный оптрон, который осуществляет гальваническую развязку. Рассчитаем сопротивление резистора R1:
;
где Uвх — максимальное входное напряжение;
Uпрн — прямое падение напряжения на светодиоде оптрона;
Iн — номинальный ток через светодиод;
В данной схеме используется оптрон АОТ101АС для которого Uпрн = 1,6 В и Iн = 5мА. Таким образом:
.
Диод VD1 типа КД521А шунтирует светодиод оптрона при отрицательном входном напряжении (-15В).
Транзистор оптрона и подтягивающий резистор R4 образуют инвертор напряжения. Для восстановления фазы сигнала, а также для приведения его к уровням ТТЛ используется инвертор DD1.1 микросхемы К155ЛН1.
1.2.3 Разработка схемы сопряжения для подключения датчика температуры
Схема сопряжения обеспечивает гальваническую развязку датчика температуры и линии ввода AN0 контроллера, а также преобразует входной аналоговый сигнал с уровнями 0…25 В в выходной сигнал с уровнями 0… Uвыхmax. Напряжение Uвыхmax соответствует температуре 1000С, при этом АЦП должен выдавать значение 1000d или 3E8h. Схема сопряжения представлена на рисунке 3.
Рисунок 3 — Схема сопряжения для подключения датчика температуры Рассчитаем величину напряжения Uвыхmax:
;
где Uref = 5В — опорное напряжение; N = 10 — разрядность АЦП.
Таким образом
.
Для преобразования уровней сигнала используется делитель напряжения на резисторах R2, R3.
Рассчитаем сопротивления резисторов R2 и R3:
;
где ;
;
Пусть R3 = 3,9к, тогда R2 = 16к.
Гальваническую развязку осуществляет ОУ DA2 типа AD210, работающий в режиме повторителя напряжения.
Структурная схема ОУ AD210 приведена на рисунке 4.
Рисунок 4 — Структурная схема ОУ AD210
1.2.4 Разработка схемы сопряжения для подключения схемы управления нагревателем
Схема сопряжения обеспечивает гальваническую развязку линии RB2 контроллера, а также преобразует выходной цифровой сигнал с уровнями ТТЛ в выходной цифровой сигнал с уровнями -5/0 В. Схема сопряжения представлена на рисунке 5.
Рисунок 5 — Схема сопряжения для подключения схемы управления нагревателем Оптрон DA1.2 осуществляет гальваническую развязку и выполняет роль ключа.
Схема работает следующим образом. Если на выходе RB2 «0», то на выходе инвертора DD1.2 «1», светодиод оптрона засвечивает базу транзистора, транзистор оптрона открыт и пропускает напряжение -5 В на схему управления нагревателем. Нагреватель выключен. Если на выходе BR2 «1», на выходе инвертора DD1.2 «0», светодиод оптрона погашен, транзистор оптрона закрыт, и напряжение -5 В не поступает на схему управления нагревателем. Нагреватель включен.
Питающее напряжение ±5 В поступает из схемы управления нагревателем.
1.2.5 Подключение светодиодов «Нагрев» и «Низкий уровень воды»
Для снижения нагрузки на линии RB2 и RB3 светодиоды HL1 «Нагрев» и HL2 «Низкий уровень воды» подключены через транзисторные ключи VT1 и VT2 (рисунок 6).
В качестве ключей используются маломощные транзисторы типа КТ315А.
В качестве светодиодов HL1, HL2 используются светодиоды типа АЛ307А с красным цветом свечения.
Рисунок 6 — Схема подключения светодиодов «Нагрев» и «Низкий уровень воды»
1.2.6 Разработка схемы индикации времени / температуры
Схема индикации предназначена для отображения текущего времени в минутах и часах либо температуры воды (выбирается нажатием кнопки SB8 «Управление отображением времени / температуры»). Схема индикации приведена на рисунке 7.
Для управления светодиодными индикаторами применен драйвер MAX6958, управляемый по шине I2C. Данный драйвер позволяет управлять 4-мя светодиодными 7-сегментными индикаторами с общим катодом, а также 8-ю отдельными светодиодами. Драйвер имеет возможность программно регулировать яркость свечения индикаторов.
Подключение индикаторов к выводам драйвера приведено в таблице 2, а цоколевка драйвера — на рисунке 8.
Таблица 2 — Подключение индикаторов к выводам драйвера
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
1.2.10 Сброс контроллера
Схема сброса контроллера приведена на рисунке 12. При нажатии на кнопку SB1 на вывод MCLR микроконтроллера подается низкий уровень, что приводит к сбросу микроконтроллера.
Рисунок 12 — Схема сброса микроконтроллера
2. Разработка программного обеспечения
2.1 Алгоритм работы микропроцессорной системы управления
Блок-схема алгоритма работы системы управления представлена на рисунке 13.
Рисунок 13 — Блок-схема алгоритма работы микропроцессорной системы управления
На рисунке 14 приведена блок-схема алгоритма обработки прерываний. В данной микропроцессорной системе возможны 5 видов прерываний: прерывание от модуля CCP1, прерывание от таймера TMR2, внешнее прерывание по входу INT, прерывание по изменению уровня на входах и прерывание от приемника USART.
Рисунок 14 — Блок-схема алгоритма обработки прерываний Рисунок 14 — Блок-схема алгоритма обработки прерываний (продолжение) Рисунок 14 — Блок-схема алгоритма обработки прерываний (продолжение)
Рисунок 14 — Блок-схема алгоритма обработки прерываний (продолжение)
Рисунок 14 — Блок-схема алгоритма обработки прерываний (продолжение) Рисунок 14 — Блок-схема алгоритма обработки прерываний (продолжение) Рисунок 14 — Блок-схема алгоритма обработки прерываний (продолжение) Рисунок 14 — Блок-схема алгоритма обработки прерываний (окончание)
2.2 Инициализация микроконтроллера
При запуске микроконтроллера необходимо проинициализировать следующие модули:
1. Порты ввода / вывода;
2. Модуль АЦП;
3. Модуль CCP1;
4. Таймер TMR1;
5. Таймер TMR2;
6. Модуль USART;
7. Модуль MSSP;
Необходимо настроить прерывания от приемника USART, модуля CCP1, таймера TMR2, прерывания по заднему фронту сигнала на входе INT и прерывания по изменению уровня на входах .
Листинг подпрограммы инициализации приведен ниже.
;;
; ИНИЦИАЛИЗАЦИЯ ПОРТОВ ВВОДА/ВЫВОДА
BANC0
BCF INTCON, GIE; ЗАПРЕТИТЬ ПРЕРЫВАНИЯ
CLRF PORTA; ОЧИСТКА ПОРТОВ
CLRF PORTB
CLRF PORTC
BANC1
MOVLW B'111 111'; ЛИНИИ RA0-RA5 НА ВВОД
MOVWF TRISA
MOVLW B'11 110 011'; ЛИНИИ RB2, RB3 НА ВЫВОД
; ОСТАЛЬНЫЕ НА ВВОД
MOVWF TRISB
CLRF TRISC
;;
; ИНИЦИАЛИЗАЦИЯ МОДУЛЯ USART
BANC0
MOVLW B'10 010 000'; ВКЛЮЧИТЬ МОДУЛЬ USART
; РАЗРЕШИТЬ ПРИЕМ
; УСТАНОВИТЬ 8-РАЗРЯДНЫЙ ПРИЕМ
MOVWF RCSTA
BANC1
MOVLW B'100'; УСТАНОВИТЬ 8-РАЗРЯДНУЮ ПЕРЕДАЧУ
; АСИНХРОННЫЙ НИЗКОСКОРОСТНОЙ РЕЖИМ ПЕРЕДАЧИ
MOVWF TXSTA
MOVLW D'129'; СКОРОСТЬ ОБМЕНА 9600 бит/с
MOVWF SPBRG
;;
; ИНИЦИАЛИЗАЦИЯ МОДУЛЯ MSSP
BANC0
MOVLW B'1 000'; ВЕДУЩИЙ РЕЖИМ I2C
MOVWF SSPCON
BANC1
MOVLW B'10 000 000'; УПРАВЛЕНИЕ ДЛИТЕЛЬНОСТЬЮ ФРОНТА ВЫКЛЮЧЕНО
; ВЫХ. УРОВНИ СООТВЕТСТВУЮТ СПЕЦИФИКАЦИИ I2C
MOVWF SSPSTAT
MOVLW 0×09; ТАКТОВАЯ ЧАСТОТА 100 кГц
MOVWF SSPADD
CLRF SSPCON2
;;
; ИНИЦИАЛИЗАЦИЯ МОДУЛЯ АЦП
MOVLW B'10 001 110'; ПРАВОЕ ВЫРАВНИВАНИЕ
; КАНАЛ AN0 — АНАЛОГОВЫЙ ВХОД, ОСТАЛЬНЫЕ ЦИФРОВЫЕ
MOVWF ADCON1
BANC0
MOVLW B'10 000 001'; МОДУЛЬ АЦП ВКЛЮЧЕН
; ТАКТОВАЯ ЧАСТОТА Fosc/32
; ВЫБРАН КАНАЛ 0
MOVWF ADCON0
;;
; ИНИЦИАЛИЗАЦИЯ МОДУЛЯ CCP
MOVLW B'1 011'; РЕЖИМ СРАВНЕНИЯ
; ТРИГГЕР СПЕЦИАЛЬНЫХ ФУНКЦИЙ
MOVWF CCP1CON
MOVLW 0×80; ЗАГРУЗИТЬ 8000h В РЕГИСТРЫ CCPR1H И CCPR1L
MOVWF CCPR1H
CLRF CCPR1L
;;
; ИНИЦИАЛИЗАЦИЯ ТАЙМЕРА TMR1
MOVLW B'10'; КОЭФФИЦИЕНТ ДЕЛЕНИЯ ПРЕДДЕЛИТЕЛЯ 1:1
; СИНХРОНИЗАЦИЯ ВКЛЮЧЕНА
; ВНЕШНИЙ ИСТОЧНИК ТАКТОВЫХ ИМПУЛЬСОВ
MOVWF T1CON
CLRF TMR1L; ОЧИСТКА РЕГИСТРОВ TMR1L И TMR1H
CLRF TMR1H
;;
; ИНИЦИАЛИЗАЦИЯ ТАЙМЕРА TMR2
MOVLW B'1 111 010'; ПРЕДДЕЛИТЕЛЬ 1/16, ВЫХОДНОЙ ДЕЛИТЕЛЬ 1/16
MOVWF T2CON
MOVLW 0xFF
BANC1
MOVWF PR2
;;
CLRF OPTION_REG; ПОДКЛЮЧИТЬ ПОДТЯГИВАЮЩИЕ РЕЗИСТОРЫ
; К ВЫВОДАМ PORTB
; АКТИВНЫЙ ЗАДНИЙ ФРОНТ ИМПУЛЬСА НА ВХОДЕ INT
BANC0
;;
; ИНИЦИАЛИЗАЦИЯ ПРЕРЫВАНИЙ
MOVLW B'1 011 000'; РАЗРЕШИТЬ ПРЕРЫВАНИЯ ОТ ПЕРИФЕРИЙНЫХ МОДУЛЕЙ
; И ПРЕРЫВАНИЯ ПО ВХОДАМ INT И
MOVWF INTCON
MOVLW B'100 110'; РАЗРЕШИТЬ ПРЕРЫВАНИЯ ОТ ПРИЕМНИКА USART,
; МОДУЛЯ CCP1 И ТАЙМЕРА TMR2
CLRF PIR1
BANC1
MOVWF PIE1
;;
; ИНИЦИАЛИЗАЦИЯ РЕГИСТРОВ ОБЩЕГО НАЗНАЧЕНИЯ
BANC2
CLRF EEADR; ОЧИСТИТЬ РЕГИСТР АДРЕСА
BANC3
BCF EECON1, EEPGD; УСТАНОВИТЬ ЧТЕНИЕ ИЗ EEPROM
BSF EECON1, RD; НАЧАТЬ ЧТЕНИЕ
BANC2
MOVF EEDATA, W; ПРОЧИТАТЬ РЕГИСТР ДАННЫХ
BANC0
MOVWF MAX_TL; ПОМЕСТИТЬ СОДЕРЖИМОЕ ТЕКУЩЕЙ ЯЧЕЙКИ ПАМЯТИ
; В РЕГИСТР MAX_TL
BANC2
INCF EEADR, F; УВЕЛИЧИТЬ АДРЕС ТЕКУЩЕЙ ЯЧЕЙКИ ПАМЯТИ НА 1
MOVF EEDATA, W; ПРОЧИТАТЬ РЕГИСТР ДАННЫХ
BANC0
MOVWF MAX_TH; ПОМЕСТИТЬ СОДЕРЖИМОЕ ТЕКУЩЕЙ ЯЧЕЙКИ ПАМЯТИ
; В РЕГИСТР MAX_TH
BANC2
INCF EEADR, F; УВЕЛИЧИТЬ АДРЕС ТЕКУЩЕЙ ЯЧЕЙКИ ПАМЯТИ НА 1
MOVF EEDATA, W; ПРОЧИТАТЬ РЕГИСТР ДАННЫХ
BANC0
MOVWF START_ML; ПОМЕСТИТЬ СОДЕРЖИМОЕ ТЕКУЩЕЙ ЯЧЕЙКИ ПАМЯТИ
; В РЕГИСТР START_ML
BANC2
INCF EEADR, F; УВЕЛИЧИТЬ АДРЕС ТЕКУЩЕЙ ЯЧЕЙКИ ПАМЯТИ НА 1
MOVF EEDATA, W; ПРОЧИТАТЬ РЕГИСТР ДАННЫХ
BANC0
MOVWF START_MH; ПОМЕСТИТЬ СОДЕРЖИМОЕ ТЕКУЩЕЙ ЯЧЕЙКИ ПАМЯТИ
; В РЕГИСТР START_MH
BANC2
INCF EEADR, F; УВЕЛИЧИТЬ АДРЕС ТЕКУЩЕЙ ЯЧЕЙКИ ПАМЯТИ НА 1
MOVF EEDATA, W; ПРОЧИТАТЬ РЕГИСТР ДАННЫХ
BANC0
MOVWF START_HL; ПОМЕСТИТЬ СОДЕРЖИМОЕ ТЕКУЩЕЙ ЯЧЕЙКИ ПАМЯТИ
; В РЕГИСТР START_HL
BANC2
INCF EEADR, F; УВЕЛИЧИТЬ АДРЕС ТЕКУЩЕЙ ЯЧЕЙКИ ПАМЯТИ НА 1
MOVF EEDATA, W; ПРОЧИТАТЬ РЕГИСТР ДАННЫХ
BANC0
MOVWF START_HH; ПОМЕСТИТЬ СОДЕРЖИМОЕ ТЕКУЩЕЙ ЯЧЕЙКИ ПАМЯТИ
; В РЕГИСТР START_HH
BANC2
INCF EEADR, F; УВЕЛИЧИТЬ АДРЕС ТЕКУЩЕЙ ЯЧЕЙКИ ПАМЯТИ НА 1
MOVF EEDATA, W; ПРОЧИТАТЬ РЕГИСТР ДАННЫХ
BANC0
MOVWF STOP_ML; ПОМЕСТИТЬ СОДЕРЖИМОЕ ТЕКУЩЕЙ ЯЧЕЙКИ ПАМЯТИ
; В РЕГИСТР STOP_ML
BANC2
INCF EEADR, F; УВЕЛИЧИТЬ АДРЕС ТЕКУЩЕЙ ЯЧЕЙКИ ПАМЯТИ НА 1
MOVF EEDATA, W; ПРОЧИТАТЬ РЕГИСТР ДАННЫХ
BANC0
MOVWF STOP_MH; ПОМЕСТИТЬ СОДЕРЖИМОЕ ТЕКУЩЕЙ ЯЧЕЙКИ ПАМЯТИ
; В РЕГИСТР STOP_MH
BANC2
INCF EEADR, F; УВЕЛИЧИТЬ АДРЕС ТЕКУЩЕЙ ЯЧЕЙКИ ПАМЯТИ НА 1
MOVF EEDATA, W; ПРОЧИТАТЬ РЕГИСТР ДАННЫХ
BANC0
MOVWF STOP_HL; ПОМЕСТИТЬ СОДЕРЖИМОЕ ТЕКУЩЕЙ ЯЧЕЙКИ ПАМЯТИ
; В РЕГИСТР STOP_HL
BANC2
INCF EEADR, F; УВЕЛИЧИТЬ АДРЕС ТЕКУЩЕЙ ЯЧЕЙКИ ПАМЯТИ НА 1
MOVF EEDATA, W; ПРОЧИТАТЬ РЕГИСТР ДАННЫХ
BANC0
MOVWF STOP_HH; ПОМЕСТИТЬ СОДЕРЖИМОЕ ТЕКУЩЕЙ ЯЧЕЙКИ ПАМЯТИ
; В РЕГИСТР STOP_HH
MOVLW B'100 000'; ВКЛЮЧИТЬ РЕЖИМ ОТОБРАЖЕНИЯ ТЕКУЩЕГО ВРЕМЕНИ
MOVWF FLAG_R
CLRF FLAG_R1; ВЫКЛЮЧИТЬ РЕЖИМ ПОДДЕРЖАНИЯ ТЕМПЕРАТУРЫ
CLRF IND0; ОБНУЛИТЬ РЕГИСТРЫ ИНДИКАЦИИ
CLRF IND1
CLRF IND2
CLRF IND3
CLRF SEC_L; ОБНУЛИТЬ СЧЕТЧИКИ
CLRF SEC_H
CLRF MIN_L
CLRF MIN_H
CLRF HOUR_L
CLRF HOUR_H
MOVLW B'10'; ВКЛЮЧИТЬ ДЕЦИМАЛЬНУЮ ТОЧКУ ВО 2-М РАЗРЯДЕ
MOVWF POINT
;;
; ИНИЦИАЛИЗАЦИЯ ДРАЙВЕРА LCD
BSF SSPCON, SSPEN; ВКЛЮЧИТЬ МОДУЛЬ MSSP
BANC1
BSF SSPCON2, SEN; СГЕНЕРИРОВАТЬ БИТ START
BTFSC SSPCON2, SEN; ОЖИДАТЬ ОКОНЧАНИЯ ГЕНЕРАЦИИ БИТА START
GOTO $-1
MOVLW 0×38; ПЕРЕДАТЬ АДРЕС ДРАЙВЕРА
MOVWF SSPBUF
BTFSC SSPCON2, ACKSTAT; ОЖИДАТЬ ФОРМИРОВАНИЕ БИТА ПОДТВЕРЖДЕНИЯ
GOTO $-1
MOVLW 0×01; ПРЕРЕДАТЬ АДРЕС РЕГИСТРА УПРАВЛЕНИЯ ДЕКОДИРОВАНИЕМ
MOVWF SSPBUF
BTFSC SSPCON2, ACKSTAT; ОЖИДАТЬ ФОРМИРОВАНИЕ БИТА ПОДТВЕРЖДЕНИЯ
GOTO $-1
MOVLW 0x0 °F; ВКЛЮЧИТЬ ДВОИЧНО-ДЕСЯТИЧНОЕ ДЕКОДИРОВАНИЕ ДЛЯ ВСЕХ
; РАЗРЯДОВ
MOVWF SSPBUF
BTFSC SSPSTAT, BF; ОЖИДАТЬ ОКОНЧАНИЕ ПЕРЕДАЧИ
GOTO $-1
MOVLW 0×07; УСТАНОВИТЬ ЯРКОСТЬ СВЕЧЕНИЯ ИНДИКАТОРОВ
MOVWF SSPBUF
BTFSC SSPCON2, ACKSTAT; ОЖИДАТЬ ФОРМИРОВАНИЕ БИТА ПОДТВЕРЖДЕНИЯ
GOTO $-1
BSF SSPCON2, PEN; СФОРМИРОВАТЬ БИТ STOP
BSF INTCON, GIE; РАЗРЕШИТЬ ПРЕРЫВАНИЯ
;;
2.3 Преобразование напряжения от датчика температуры
Ниже приведена часть программы, осуществляющая преобразование напряжения от датчика температуры. При изменении температуры от 0 до 1000С напряжение на входе АЦП изменяется в пределах 0…4,88 В. При этом результат преобразования в регистрах ADRESL и ADRESH будет изменяться в пределах 0…1000d, что позволяет легко преобразовать результат в десятичный формат.
;;
BANC0
MOVLW TIME1; СФОРМИРОВАТЬ ЗАДЕРЖКУ 20 мкс
MOVWF TIMER1
DECFSZ TIMER1, F
GOTO $+1
;;
ADC_START; ПОДПРОГРАММА ИЗМЕРЕНИЯ ТЕМПЕРАТУРЫ
BANC0
BSF ADCON0, GO; НАЧАТЬ ПРЕОБРАЗОВАНИЕ
BTFSC ADCON0, GO; ОЖИДАТЬ ОКОНЧАНИЯ ПРЕОБРАЗОВАНИЯ
GOTO $-1
;;
Для осуществления временных задержек, необходимых для заряда внутреннего конденсатора модуля АЦП реализован программный счетчик на основе регистра TIMER1, определенного по адресу 26h. Счетчик формирует временную задержку 20 мкс. Рассчитаем константу TIME1.
;
где Tз — время задержки, Fosc — тактовая частота; n — количество машинных циклов в одном цикле работы счетчика. Так как счетчик включает в себя команду DECFSZ, выполняемую за 1 МЦ (если результат не равен 0) и команду GOTO, выполняемую за 2 МЦ, то n = 3. Таким образом
.
2.4 Подпрограмма управления выводом температуры на индикацию
Данная часть программы определяет, разрешено ли отображение температуры на индикаторах. Если отображение разрешено, подпрограмма включает точку в первом разряде индикации, помещает содержимое регистров ADRESL и ADRESH во временные регистры TEMP_TL и TEMP_TH и производит вызов подпрограммы двоично-десятичной коррекции.
;;
; ПОДПРОГРАММА УПРАВЛЕНИЯ ВЫВОДОМ ТЕМПЕРАТУРЫ НА ИНДИКАЦИЮ
BTFSS FLAG_R, 7; ОТОБРАЖЕНИЕ ТЕМПЕРАТУРЫ ВКЛЮЧЕНО
GOTO ST_NAGREV; НЕТ — ПЕРЕХОД К ПОДПРОГРАММЕ УПРАВЛЕНИЯ НАГРЕВОМ
MOVLW B'100'; ДА — ВКЛЮЧИТЬ ТОЧКУ В ПЕРВОМ РАЗРЯДЕ
MOVWF POINT
MOVF ADRESL, W; ПОМЕСТИТЬ РЕЗУЛЬТАТ ПРЕОБРАЗОВАНИЯ ВО ВРЕМЕННЫЕ
; РЕГИСТРЫ
MOVWF TEMP_TL
MOVF ADRESH, W
MOVWF TEMP_TH
CALL BIN_DEC; ВЫЗОВ ПОДПРОГРАММЫ ДВОИЧНО-ДЕСЯТИЧНОЙ
; КОРРЕКЦИИ
;;
2.5 Подпрограмма управления нагревателем
Данная подпрограмма осуществляет контроль состояния датчика снижения уровня воды и проверяет включение режима поддержания температуры. Если уровень воды в норме и включен режим поддержания температуры (бит 0 в регистре FLAG_R1 установлен в 1), то происходит включение нагревателя. Если уровень воды уменьшается ниже нормы, нагреватель выключается и включается индикатор «Снижение уровня воды».
;;
ST_NAGREV; ПОДПРОГРАММА УПРАВЛЕНИЯ НАГРЕВАТЕЛЕМ
BTFSC FLAG_R1,0; РЕЖИМ ПОДДЕРЖАНИЯ ТЕМПЕРАТУРЫ ВЫКЛЮЧЕН
GOTO $+3
BCF PORTB, 2; ДА — ВЫКЛЮЧИТЬ НАГРЕВ
GOTO OUT_LED
BTFSS PORTA, 1; УРОВЕНЬ В НОРМЕ
GOTO $+4
BSF PORTB, 3; НЕТ — ВКЛЮЧИТЬ ИНДИКАТОР «СНИЖЕНИЕ УРОВНЯ
; ВОДЫ"
BCF PORTB, 2; ВЫКЛЮЧИТЬ НАГРЕВ
GOTO OUT_LED
BCF PORTB, 3; ВЫКЛЮЧИТЬ ИНДИКАТОР «СНИЖЕНИЕ УРОВНЯ ВОДЫ»
;;
2.6 Подпрограмма вычисления нижнего предела температуры
Данная подпрограмма вычисляет нижний предел температуры, который принимается на 50С ниже заданного (верхнего).
Рассчитаем константу DELT_T, соответствующую разности температур в 50С:
;
где Nmax — значение регистров ADRESL и ADRESH, соответствующее температуре Tmax.
Так как Tmax = 1000С и Nmax = 1000d, то
.
;;
; ПОДПРОГРАММА ВЫЧИСЛЕНИЯ НИЖНЕГО ПРЕДЕЛА ТЕМПЕРАТУРЫ
CLRF MIN_TH; ОЧИСТКА РЕГИСТРА MIN_TH
MOVF MAX_TL, W
SUBLW DELT_T; ВЫЧЕСТЬ ИЗ СОДЕРЖИМОГО MAX_TL РАЗНОСТЬ ТЕМПЕРАТУР
MOVWF MIN_TL; ПОМЕСТИТЬ РЕЗУЛЬТАТ В MIN_TL
RLF MIN_TH, W; ЕСЛИ БЫЛ ЗАЕМ
SUBWF MAX_TH, W; УМЕНЬШИТЬ ЗНАЧЕНИЕ РЕГИСТРА MAX_TH НА 1
MOVWF MIN_TH; ПОМЕСТИТЬ РЕЗУЛЬТАТ В РЕГИСТР MIN_TH
BTFSS STATUS, C; ЕСЛИ БЫЛ ЗАЕМ
GOTO $+4
CLRF MIN_TL; ОЧИСТИТЬ РЕГИСТРЫ MIN_TL И MIN_TH
CLRF MIN_TH
BCF STATUS, C; И СБРОСИТЬ ФЛАГ ПЕРЕНОСА
;;
2.7 Подпрограмма контроля температуры
Данная подпрограмма осуществляет контроль температуры воды и при ее уменьшении ниже значения, записанного в регистрах MIN_TH и MIN_TL включает нагреватель, а при увеличении выше значения, записанного в регистрах MAX_TH и MAX_TL выключает его.
;;
; ПОДПРОГРАММА ПРОВЕРКИ СНИЖЕНИЯ ТЕМПЕРАТУРЫ НИЖЕ НОРМЫ
BCF STATUS, Z
BANC1
MOVF ADRESH, W
XORWF MIN_TH, W
BTFSC STATUS, Z
GOTO M1
MOVF ADRESH, W
BCF STATUS, C
SUBWF MIN_TH, W
BANC0
BTFSC STATUS, C
BSF PORTB, 2; ВКЛЮЧЕНИЕ НАГРЕВАТЕЛЯ
M1
BCF STATUS, Z
MOVF ADRESL, W
SUBWF MIN_TL, W
BTFSC STATUS, C
BSF PORTB, 2; ВКЛЮЧЕНИЕ НАГРЕВАТЕЛЯ
;;
; ПРОВЕРКА ПРЕВЫШЕНИЯ НОРМЫ
BANC1
MOVF ADRESH, W
XORWF MAX_TH, W
BTFSC STATUS, Z
GOTO M2
MOVF ADRESH, W
SUBWF MAX_TH, W
BANC0
BTFSS STATUS, C
BCF PORTB, 2; ВЫКЛЮЧЕНИЕ НАГРЕВАТЕЛЯ
M2
BCF STATUS, Z
MOVF ADRESL, W
SUBWF MAX_TH, W
BTFSC STATUS, C
BCF PORTB, 2; ВЫКЛЮЧЕНИЕ НАГРЕВАТЕЛЯ
;;
2.8 Подпрограмма вывода на индикацию
Данная подпрограмма осуществляет передачу значений буферных регистров индикации IND0, IND1, IND2, IND3 и регистра управления децимальной точкой POINT во внутренние регистры драйвера LCD.
Драйвер MAX6958 поддерживает автоинкрементирование адреса при записи значений в регистры. Поэтому при передаче данных достаточно указать начальный адрес (0×20), а затем последовательно передавать данные без предварительной передачи адреса следующего регистра. Адрес драйвера на шине I2C 0×38.
Ниже приведен листинг программы, осуществляющей вывод на индикацию.
;;
OUT_LED
; ПОДПРОГРАММА ВЫВОДА НА ИНДИКАЦИЮ
BSF SSPCON2, SEN; СГЕНЕРИРОВАТЬ БИТ START
BTFSC SSPCON2, SEN; ОЖИДАТЬ ОКОНЧАНИЯ ГЕНЕРАЦИИ БИТА START
GOTO $-1
MOVLW 0×38; ПЕРЕДАТЬ АДРЕС ДРАЙВЕРА
MOVWF SSPBUF
BTFSC SSPCON2, ACKSTAT; ОЖИДАТЬ ФОРМИРОВАНИЕ БИТА ПОДТВЕРЖДЕНИЯ
GOTO $-1
MOVLW 0×20; ПРЕРЕДАТЬ АДРЕС ПЕРВОГО РЕГИСТРА ДАННЫХ
MOVWF SSPBUF
BTFSC SSPCON2, ACKSTAT; ОЖИДАТЬ ФОРМИРОВАНИЕ БИТА ПОДТВЕРЖДЕНИЯ
GOTO $-1
BANC0
MOVF IND3, W; ПЕРЕДАТЬ СОДЕРЖИМОЕ 3-ГО РАЗРЯДА ИНДИКАЦИИ
BANC1
MOVWF SSPBUF
BTFSC SSPSTAT, BF
GOTO $-1
BANC0
MOVF IND2, W; ПЕРЕДАТЬ СОДЕРЖИМОЕ 2-ГО РАЗРЯДА ИНДИКАЦИИ
BANC1
MOVWF SSPBUF
BTFSC SSPSTAT, BF
GOTO $-1
BANC0
MOVF IND1, W; ПЕРЕДАТЬ СОДЕРЖИМОЕ 1-ГО РАЗРЯДА ИНДИКАЦИИ
BANC1
MOVWF SSPBUF
BTFSC SSPSTAT, BF
GOTO $-1
BANC0
MOVF IND0, W; ПЕРЕДАТЬ СОДЕРЖИМОЕ 0-ГО РАЗРЯДА ИНДИКАЦИИ
BANC1
MOVWF SSPBUF
BTFSC SSPSTAT, BF
GOTO $-1
MOVF POINT, W; ПЕРЕДАТЬ СОСТОЯНИЕ ДЕЦИМАЛЬНОЙ ТОЧКИ
BTFSC SSPCON2, ACKSTAT
GOTO $-1
BSF SSPCON2, PEN; СГЕНЕРИРОВАТЬ БИТ STOP
BANC0
GOTO END_INT; ПЕРЕХОД НА НАЧАЛО ПРОГРАММЫ
;;
2.9 Подпрограмма двоично-десятичной коррекции
Данная подпрограмма осуществляет конвертирование двоичного кода, предварительно записанного в буферных регистрах TEMP_TL TEMP_TH в двоично-десятичный код, записываемый в регистры индикации IND0, IND1, IND2, IND3.
Листинг подпрограммы приведен ниже.
;;
BIN_DEC; ПОДПРОГРАММА ДВОИЧНО-ДЕСЯТИЧНОЙ КОРРЕКЦИИ
;;
; РАСПРЕДЕЛЕНИЕ ТЕТРАД РЕГИСТРОВ TEMP_TL И TEMP_TH ПО РЕГИСТРАМ IND0 — IND3
MOVF TEMP_TL, W
ANDLW 0x0F
MOVWF IND0; ПОМЕСТИТЬ МЛАДШУЮ ТЕТРАДУ TEMP_TL В IND0
SWAPF TEMP_TL, W
ANDLW 0x0F
MOVWF IND1; ПОМЕСТИТЬ СТАРШУЮ ТЕТРАДУ TEMP_TL В IND1
MOVF TEMP_TH, W
ANDLW 0x0F
MOVWF IND2; ПОМЕСТИТЬ МЛАДШУЮ ТЕТРАДУ TEMP_TH В IND2
SWAPF TEMP_TH, W
ANDLW 0x0F
MOVWF IND3; ПОМЕСТИТЬ СТАРШУЮ ТЕТРАДУ TEMP_TH В IND3
;;
; КОРРЕКЦИЯ РЕЗУЛЬТАТА
BCF STATUS, Z
BCF STATUS, C
MOVLW 0x0A
SUBWF IND0, W
BTFSC STATUS, C
GOTO $+5
BTFSS STATUS, Z; ЕСЛИ ЗНАЧЕНИЕ IND0 НЕ МЕНЬШЕ 0x0A
GOTO $+3
MOVWF IND0; В РЕГИСТР IND0 ЗАПИСАТЬ РАЗНОСТЬ ЕГО СОДЕРЖИМОГО И
; 0x0A
INCF IND1, F; И УВЕЛИЧИТЬ НА 1 СОДЕРЖИМОЕ IND1
BCF STATUS, Z
BCF STATUS, C
MOVLW 0x0A; ИНАЧЕ ЗНАЧЕНИЯ РЕГИСТРОВ ОСТАВИТЬ БЕЗ ИЗМЕНЕНИЯ
SUBWF IND1, W
BTFSC STATUS, C
GOTO $+5
BTFSS STATUS, Z; ЕСЛИ ЗНАЧЕНИЕ IND1 НЕ МЕНЬШЕ 0x0A
GOTO $+3
MOVWF IND1; В РЕГИСТР IND1 ЗАПИСАТЬ РАЗНОСТЬ ЕГО СОДЕРЖИМОГО И
; 0x0A
INCF IND2, F; И УВЕЛИЧИТЬ НА 1 СОДЕРЖИМОЕ IND2
BCF STATUS, Z
BCF STATUS, C
MOVLW 0x0A; ИНАЧЕ ЗНАЧЕНИЯ РЕГИСТРОВ ОСТАВИТЬ БЕЗ ИЗМЕНЕНИЯ
SUBWF IND2, W
BTFSC STATUS, C
GOTO $+5
BTFSS STATUS, Z; ЕСЛИ ЗНАЧЕНИЕ IND2 НЕ МЕНЬШЕ 0x0A
GOTO $+3
MOVWF IND2; В РЕГИСТР IND2 ЗАПИСАТЬ РАЗНОСТЬ ЕГО СОДЕРЖИМОГО И
; 0x0A
INCF IND3, F; И УВЕЛИЧИТЬ НА 1 СОДЕРЖИМОЕ IND3
RETURN
;;
2.10 Обработка прерываний
Вектор прерываний находится по адресу 0×04.
Обработчик прерываний включает в себя следующие подпрограммы:
1. Подпрограмма сохранения контекста.
2. Подпрограмма определения источника прерывания.
3. Подпрограмма часов.
4. Подпрограмма обработки прерываний от таймера TMR2.
5. Подпрограмма обработки прерываний по входу INT.
6. Подпрограмма обработки прерываний по входам .
7. Подпрограмма приема / передачи данных через USART.
8. Подпрограмма восстановления контекста.
Подпрограмма сохранения контекста
При переходе на обработку прерываний необходимо сохранять текущее содержимое аккумулятора и регистра STATUS, чтобы при возврате из прерывания программа могла продолжать нормальную работу.
Ниже приведен листинг подпрограммы, осуществляющей сохранение контекста во временные регистры W_TEMP и STATUS_TEMP. Регистр STATUS_TEMP определен в 0-м банке по адресу 0×39, а регистр W_TEMP — в 0-м банке по адресу 0×3А и в 1-м банке по адресу 0хВА.
;;
; СОХРАНЕНИЕ АККУМУЛЯТОРА И РЕГИСТРА STATUS
BTFSS STATUS, RP0; ОПРЕДЕЛЕНИЕ ТЕКУЩЕГО БАНКА
GOTO RP0_CLR
BCF STATUS, RP0; УСТАНОВИТЬ БАНК 0
MOVWF W_TEMP; СОХРАНИТЬ АККУМУЛЯТОР
SWAPF STATUS, W
MOVWF STATUS_TEMP; СОХРАНИТЬ РЕГИСТР STATUS
BSF STATUS_TEMP, 5; ВОССТАНОВИТЬ ЗНАЧЕНИЕ БИТА RP0
GOTO $+4
RP0_CLR
MOVWF W_TEMP; СОХРАНИТЬ АККУМУЛЯТОР
SWAPF STATUS, W
MOVWF STATUS_TEMP; СОХРАНИТЬ РЕГИСТР STATUS
;;
Подпрограмма определения источника прерывания
Данная подпрограмма по состоянию флагов прерываний в регистрах PIR1 и INTCON определяет источник прерывания и осуществляет вызов соответствующей подпрограммы обработки.
Листинг подпрограммы приведен ниже.
;;
; ОПРЕДЕЛЕНИЕ ИСТОЧНИКА ПРЕРЫВАНИЯ
INT_SOURCE
CLRF STATUS; ОЧИСТИТЬ РЕГИСТР STATUS
BTFSC PIR1, CCP1IF; ЕСЛИ ПРЕРЫВАНИЕ ОТ МОДУЛЯ CCP1
GOTO CLOCK; ПЕРЕХОД НА ПОДПРОГРАММУ ЧАСОВ
BTFSC PIR1, TMR2IF; ЕСЛИ ПРЕРЫВАНИЕ ОТ ТАЙМЕРА TMR2
GOTO INT_TMR2; ПЕРЕХОД НА ПОДПРОГРАММУ ОБРАБОТЧИКА ПРЕРЫВАНИЙ ОТ
; TMR2
BTFSC INTCON, INTF; ЕСЛИ ПРЕРЫВАНИЕ ПО ВХОДУ INT
GOTO INT_INT; ПЕРЕХОД НА ПОДПРОГРАММУ ОБРАБОТЧИКА ПРЕРЫВАНИЙ ПО
; INT
BTFSC INTCON, RBIF; ЕСЛИ ПРЕРЫВАНИЕ ПО ВХОДАМ
GOTO INT_RB; ПЕРЕХОД НА ПОДПРОГРАММУ ОБРАБОТЧИКА ПРЕРЫВАНИЙ ПО
; ВХОДАМ
BTFSC PIR1, RCIF; ЕСЛИ ПРЕРЫВАНИЕ ОТ ПРИЕМНИКА USART
GOTO SERIAL_PRT; ПЕРЕХОД НА ПОДПРОГРАММУ ПРИЕМА/ПЕРЕДАЧИ
; ДАННЫХ ЧЕРЕЗ USART
GOTO 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.
Листинг подпрограммы часов приведен ниже.
;;
CLOCK; ПОДПРОГРАММА ТАЙМЕРА
BCF PIR1, CCP1IF; СБРОСИТЬ ФЛАГ ПРЕРЫВАНИЯ ОТ МОДУЛЯ CCP1
;;
; СЧЕТЧИК ЕДИНИЦ СЕКУНД
INCF SEC_L, F; ИНКРЕМЕНТИРОВАТЬ МЛАДШИЙ СЧЕТЧИК СЕКУНД
MOVF SEC_L, W; СЧЕТЧИК ДОСЧИТАЛ ДО 10
XORLW 0x0A
BTFSS STATUS, Z
GOTO CURR_TIME; НЕТ — ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ
; ТЕКУЩЕГО ВРЕМЕНИ НА ИНДИКАЦИЮ
CLRF SEC_L; ДА — ОЧИСТИТЬ МЛАДШИЙ СЧЕТЧИК СЕКУНД
;;
; СЧЕТЧИК ДЕСЯТКОВ СЕКУНД
INCF SEC_H, F; ИНКРЕМЕНТИРОВАТЬ СТАРШИЙ СЧЕТЧИК СЕКУНД
BCF STATUS, Z
MOVF SEC_H, W; СЧЕТЧИК ДОСЧИТАЛ ДО 6
XORLW 0×06
BTFSS STATUS, Z
GOTO CURR_TIME; НЕТ — ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ
; ТЕКУЩЕГО ВРЕМЕНИ НА ИНДИКАЦИЮ
CLRF SEC_H; ДА — ОЧИСТИТЬ СТАРШИЙ СЧЕТЧИК СЕКУНД
;;
; СЧЕТЧИК ЕДИНИЦ МИНУТ
INCF MIN_L, F; ИНКРЕМЕНТИРОВАТЬ МЛАДШИЙ СЧЕТЧИК МИНУТ
BCF STATUS, Z
MOVF MIN_L, W; СЧЕТЧИК ДОСЧИТАЛ ДО 10
XORLW 0x0A
BTFSS STATUS, Z
GOTO CURR_TIME; НЕТ — ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ
; ТЕКУЩЕГО ВРЕМЕНИ НА ИНДИКАЦИЮ
CLRF MIN_L; ДА — ОЧИСТИТЬ МЛАДШИЙ СЧЕТЧИК МИНУТ
;;
; СЧЕТЧИК ДЕСЯТКОВ МИНУТ
INCF MIN_H, F; ИНКРЕМЕНТИРОВАТЬ СТАРШИЙ СЧЕТЧИК МИНУТ
BCF STATUS, Z
MOVF MIN_H, W; СЧЕТЧИК ДОСЧИТАЛ ДО 6
XORLW 0×06
BTFSS STATUS, Z
GOTO CURR_TIME; НЕТ — ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ
; ТЕКУЩЕГО ВРЕМЕНИ НА ИНДИКАЦИЮ
CLRF MIN_H; ДА — ОЧИСТИТЬ СТАРШИЙ СЧЕТЧИК МИНУТ
;;
; СЧЕТЧИКИ ЧАСОВ
INCF HOUR_L, F; ИНКРЕМЕНТИРОВАТЬ МЛАДШИЙ СЧЕТЧИК ЧАСОВ
BCF STATUS, Z
MOVF HOUR_H, W; СТАРШИЙ СЧЕТЧИК ДОСЧИТАЛ ДО 2
XORLW 0×02
BTFSS STATUS, Z
GOTO M3; НЕТ — ПЕРЕХОД НА ПРОВЕРКУ МЛАДШЕГО СЧЕТЧИКА
BCF STATUS, Z
MOVF HOUR_L, W
XORLW 0×04
BTFSS STATUS, Z
GOTO M3
BCF STATUS, Z
CLRF HOUR_L; ДА — ОЧИСТИТЬ МЛАДШИЙ СЧЕТЧИК ЧАСОВ
CLRF HOUR_H
GOTO CURR_TIME; ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ
; ТЕКУЩЕГО ВРЕМЕНИ НА ИНДИКАЦИЮ
M3
MOVF HOUR_L, W
XORLW 0x0A; СЧЕТЧИК ДОСЧИТАЛ ДО 10
BTFSS STATUS, Z
GOTO CURR_TIME; НЕТ — ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ
; ТЕКУЩЕГО ВРЕМЕНИ НА ИНДИКАЦИЮ
CLRF HOUR_L; ДА — ОЧИСТИТЬ МЛАДШИЙ СЧЕТЧИК ЧАСОВ
INCF HOUR_H; ИНКРЕМЕНТИРОВАТЬ СТАРШИЙ СЧЕТЧИК ЧАСОВ
;;
CURR_TIME; ПОДПРОГРАММА УПРАВЛЕНИЯ ВЫВОДОМ ТЕКУЩЕГО
; ВРЕМЕНИ НА ИНДИКАЦИЮ
;;
; ВКЛЮЧЕНИЕ/ВЫКЛЮЧЕНИЕ РЕЖИМА ПОДДЕРЖАНИЯ ТЕМПЕРАТУРЫ
BCF STATUS, Z
MOVF START_ML, W
XORWF MIN_L, W
BTFSS STATUS, Z
GOTO M4
BCF STATUS, Z
MOVF START_MH, W
XORWF MIN_H, W
BTFSS STATUS, Z
GOTO M4
BCF STATUS, Z
MOVF START_HL, W
XORWF HOUR_L, W
BTFSS STATUS, Z
GOTO M4
BCF STATUS, Z
MOVF START_HH, W
XORWF HOUR_H, W
BTFSS STATUS, Z
GOTO M4
BSF FLAG_R1,0
M4
BCF STATUS, Z
MOVF STOP_ML, W
XORWF MIN_L, W
BTFSS STATUS, Z
GOTO M5
BCF STATUS, Z
MOVF STOP_MH, W
XORWF MIN_H, W
BTFSS STATUS, Z
GOTO M5
BCF STATUS, Z
MOVF STOP_HL, W
XORWF HOUR_L, W
BTFSS STATUS, Z
GOTO M5
BCF STATUS, Z
MOVF STOP_HH, W
XORWF HOUR_H, W
BTFSS STATUS, Z
GOTO M5
BCF FLAG_R1,0
;;
M5
BTFSS FLAG_R, 6; ВКЛЮЧЕН РЕЖИМ ОТОБРАЖЕНИЯ ТЕКУЩЕГО ВРЕМЕНИ
GOTO INT_SOURCE; НЕТ — ВЕРНУТЬСЯ К ПОИСКУ ИСТОЧНИКОВ ПРЕРЫВАНИЙ
; ;
; ВКЛЮЧЕНИЕ/ВЫКЛЮЧЕНИЕ РАЗДЕЛЯЮЩЕЙ ТОЧКИ
BCF POINT, 2
BTFSS POINT, 1; ДЕЦИМАЛЬНАЯ ТОЧКА ВКЛЮЧЕНА
GOTO $+3
BCF POINT, 1; ДА — ВЫКЛЮЧИТЬ ТОЧКУ
GOTO $+2
BSF POINT, 1; НЕТ — ВКЛЮЧИТЬ ТОЧКУ
; ;
MOVF MIN_L, W
MOVWF IND0
MOVF MIN_H, W
MOVWF IND1
MOVF HOUR_L, W
MOVWF IND2
MOVF HOUR_H, W
MOVWF IND3
GOTO INT_SOURCE; НЕТ — ВЕРНУТЬСЯ К ПОИСКУ ИСТОЧНИКОВ ПРЕРЫВАНИЙ
;;
Подпрограмма обработки прерываний от таймера TMR2
Данная подпрограмма осуществляет опрос состояния кнопок «+1» и «-1» через промежутки времени, определяемые таймером TMR2. Если нажата и удерживается одна из кнопок «+1» и «-1», происходит инкрементирование или декрементирование соответствующих регистров с частотой прерываний от таймера TMR2. При кратковременном нажатии происходит однократное изменение значений регистров.
Если ни одна из кнопок «+1» и «-1» не нажата, то таймер TMR2 выключается.
Листинг подпрограммы приведен ниже.
;;
INT_TMR2; ОБРАБОТЧИК ПРЕРЫВАНИЙ ОТ TMR2
BCF PIR1, TMR2IF; СБРОСИТЬ ФЛАГ ПРЕРЫВАНИЯ ОТ ТАЙМЕРА TMR2
BCF STATUS, Z
MOVF COUNTER, W
XORLW COUNT
BTFSC STATUS, Z; СЧЕТЧИК ЗАКОНЧИЛ СЧЕТ
GOTO DOWN_BUTT; ДА — ПЕРЕХОД К ПРОВЕРКЕ СОСТОЯНИЙ КНОПОК
INCF COUNTER, F; НЕТ — ИНКРЕМЕНТИРОВАНИЕ СЧЕТЧИКА
GOTO INT_SOURCE; ВЕРНУТЬСЯ К ПОИСКУ ИСТОЧНИКОВ ПРЕРЫВАНИЙ
DOWN_BUTT; ПРОВЕРКА СОСТОЯНИЙ КНОПОК
; ;
BTFSS FLAG_R, 0; РЕЖИМ УСТАНОВКИ ТЕМПЕРАТУРЫ ВКЛЮЧЕН
GOTO START_TIME; НЕТ — ПЕРЕХОД К УСТАНОВКЕ ВРЕМЕНИ ВКЛЮЧЕНИЯ
BTFSC PORTB, 6; НАЖАТА КНОПКА «+1»
GOTO M6; НЕТ — ПЕРЕХОД К ПРОВЕРКЕ НАЖАТИЯ КНОПКИ «- 1»
INCF MAX_TL; ИНКРЕМЕНТИРОВАТЬ РЕГИСТР MAX_TL
MOVF MAX_TH, W
CLRF MAX_TH
RLF MAX_TH, F
ADDWF MAX_TH, F; ПРИБАВИТЬ К РЕГИСТРУ MAX_TH ФЛАГ ПЕРЕНОСА
BCF STATUS, Z
MOVF MAX_TL, W
XORLW TEMP_MAXL; ЗНАЧЕНИЕ В MAX_TL ДОСТИГЛО TEMP_MAXL
BTFSS STATUS, Z
GOTO M6; НЕТ — ПЕРЕХОД К ПРОВЕРКЕ НАЖАТИЯ КНОПКИ «- 1»
BCF STATUS, Z
MOVF MAX_TH, W
XORLW TEMP_MAXH; ЗНАЧЕНИЕ В MAX_TH ДОСТИГЛО TEMP_MAXH
BTFSS STATUS, Z
GOTO M6; НЕТ — ПЕРЕХОД К ПРОВЕРКЕ НАЖАТИЯ КНОПКИ «- 1»
BCF STATUS, Z
CLRF MAX_TH; ДА — ОБНУЛИТЬ РЕГИСТРЫ MAX_TH И MAX_TL
CLRF MAX_TL
GOTO CALL_BIN_DEC
M6
BTFSC PORTB, 7; НАЖАТА КНОПКА «- 1»
GOTO STOP_TMR2; НЕТ — ПЕРЕХОД К ОСТАНОВКЕ TMR2
DECF MAX_TL; ДЕКРЕМЕНТИРОВАТЬ РЕГИСТР MAX_TL
BTFSC STATUS, C; ЕСЛИ БЫЛ ЗАЕМ
DECF MAX_TH, W; ДЕКРЕМЕНТИРОВАТЬ РЕГИСТР MAX_TH
BCF STATUS, C
BCF STATUS, Z
MOVF MAX_TL, F; ЗНАЧЕНИЕ В MAX_TL ДОСТИГЛО 0
BTFSS STATUS, Z
GOTO STOP_TMR2; НЕТ — ПЕРЕХОД К ОСТАНОВКЕ TMR2
BCF STATUS, Z
MOVF MAX_TH, F; ЗНАЧЕНИЕ В MAX_TH ДОСТИГЛО 0
BTFSS STATUS, Z
GOTO STOP_TMR2; НЕТ — ПЕРЕХОД К ОСТАНОВКЕ TMR2
BCF STATUS, Z
MOVLW TEMP_MAXL
MOVWF MAX_TL
MOVLW TEMP_MAXH
MOVWF MAX_TH
CALL_BIN_DEC
MOVF MAX_TL, W
MOVWF TEMP_TL
MOVF MAX_TH, W
MOVWF TEMP_TH
CALL BIN_DEC; ВЫЗОВ ПОДПРОГРАММЫ ДВОИЧНО-ДЕСЯТИЧНОЙ КОРРЕКЦИИ
STOP_TMR2
BCF T2CON, TMR2ON; ОСТАНОВКА ТАЙМЕРА TMR2
GOTO INT_SOURCE; ВЕРНУТЬСЯ К ПОИСКУ ИСТОЧНИКОВ ПРЕРЫВАНИЙ
;;
START_TIME; УСТАНОВКА ВРЕМЕНИ ВКЛЮЧЕНИЯ
BTFSS FLAG_R, 1; РЕЖИМ УСТАНОВКИ ВРЕМЕНИ ВКЛЮЧЕНИЯ ВКЛЮЧЕН
GOTO STOP_TIME; НЕТ — ПЕРЕХОД К УСТАНОВКЕ ВРЕМЕНИ ВЫКЛЮЧЕНИЯ
BTFSS FLAG_R, 5; РЕЖИМ УСТАНОВКИ МИНУТ ВКЛЮЧЕН
GOTO SET_HOUR; НЕТ — ПЕРЕХОД К УСТАНОВКЕ ЧАСОВ
BTFSC PORTB, 6; НАЖАТА КНОПКА «+1»
GOTO M7; НЕТ — ПЕРЕХОД К ПРОВЕРКЕ НАЖАТИЯ КНОПКИ «- 1»
;;
; СЧЕТЧИК ЕДИНИЦ МИНУТ
INCF START_ML, F; ИНКРЕМЕНТИРОВАТЬ МЛАДШИЙ СЧЕТЧИК МИНУТ
BCF STATUS, Z
MOVF START_ML, W; СЧЕТЧИК ДОСЧИТАЛ ДО 10
XORLW 0x0A
BTFSS STATUS, Z
GOTO SET_REG_LCD; НЕТ — ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ
; ВРЕМЕНИ ВКЛЮЧЕНИЯ НА ИНДИКАЦИЮ
CLRF START_ML; ДА — ОЧИСТИТЬ МЛАДШИЙ СЧЕТЧИК МИНУТ
;;
; СЧЕТЧИК ДЕСЯТКОВ МИНУТ
INCF START_MH, F; ИНКРЕМЕНТИРОВАТЬ СТАРШИЙ СЧЕТЧИК МИНУТ
BCF STATUS, Z
MOVF START_MH, W; СЧЕТЧИК ДОСЧИТАЛ ДО 6
XORLW 0×06
BTFSS STATUS, Z
GOTO SET_REG_LCD; НЕТ — ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ
; ТЕКУЩЕГО ВРЕМЕНИ НА ИНДИКАЦИЮ
CLRF START_MH; ДА — ОЧИСТИТЬ СТАРШИЙ СЧЕТЧИК МИНУТ
GOTO SET_REG_LCD; НЕТ — ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ
; ВРЕМЕНИ ВКЛЮЧЕНИЯ НА ИНДИКАЦИЮ
;;
M7
BTFSC PORTB, 7; НАЖАТА КНОПКА «- 1»
GOTO STOP_TMR22; ПЕРЕХОД НА ПОДПРОГРАММУ ОСТАНОВКИ ТАЙМЕРА TMR2
;;
; СЧЕТЧИК ЕДИНИЦ МИНУТ
BCF STATUS, C
DECF START_ML, F; ДЕКРЕМЕНТИРОВАТЬ МЛАДШИЙ СЧЕТЧИК МИНУТ
BTFSS STATUS, C; ПРОИЗОШЕЛ ЗАЕМ
GOTO SET_REG_LCD; НЕТ — ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ
; ВРЕМЕНИ ВКЛЮЧЕНИЯ НА ИНДИКАЦИЮ
BCF STATUS, C
MOVLW 0×09; ДА — ЗАГРУЗКА НАЧАЛЬНОГО ЗНАЧЕНИЯ
MOVWF START_ML
;;
; СЧЕТЧИК ДЕСЯТКОВ МИНУТ
DECF START_MH, F; ДЕКРЕМЕНТИРОВАТЬ СТАРШИЙ СЧЕТЧИК МИНУТ
BTFSS STATUS, C; ПРОИЗОШЕЛ ЗАЕМ
GOTO SET_REG_LCD; НЕТ — ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ
; ВРЕМЕНИ ВКЛЮЧЕНИЯ НА ИНДИКАЦИЮ
BCF STATUS, C
MOVLW 0×05; ДА — ЗАПИСАТЬ НАЧАЛЬНОЕ ЗНАЧЕНИЕ
MOVWF START_MH
GOTO SET_REG_LCD; НЕТ — ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ
; ВРЕМЕНИ ВКЛЮЧЕНИЯ НА ИНДИКАЦИЮ
;;
BTFSS FLAG_R, 4; РЕЖИМ УСТАНОВКИ ЧАСОВ ВКЛЮЧЕН
GOTO STOP_TMR22; ПЕРЕХОД НА ПОДПРОГРАММУ ОСТАНОВКИ ТАЙМЕРА TMR2
;;
BTFSC PORTB, 6; НАЖАТА КНОПКА «+1»
GOTO M8; НЕТ — ПЕРЕХОД К ПРОВЕРКЕ НАЖАТИЯ КНОПКИ «- 1»
; СЧЕТЧИКИ ЧАСОВ
INCF START_HL, F; ИНКРЕМЕНТИРОВАТЬ МЛАДШИЙ СЧЕТЧИК ЧАСОВ
BCF STATUS, Z
MOVF START_HH, W; СТАРШИЙ СЧЕТЧИК ДОСЧИТАЛ ДО 2
XORLW 0×02
BTFSS STATUS, Z
GOTO M9; НЕТ — ПЕРЕХОД НА ПРОВЕРКУ МЛАДШЕГО СЧЕТЧИКА
BCF STATUS, Z
MOVF START_HL, W
XORLW 0×04
BTFSS STATUS, Z
GOTO M9
BCF STATUS, Z
CLRF START_HL; ДА — ОЧИСТИТЬ МЛАДШИЙ СЧЕТЧИК ЧАСОВ
CLRF START_HH
GOTO SET_REG_LCD; ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ
; ТЕКУЩЕГО ВРЕМЕНИ НА ИНДИКАЦИЮ
M9
MOVF START_HL, W
XORLW 0x0A; СЧЕТЧИК ДОСЧИТАЛ ДО 10
BTFSS STATUS, Z
GOTO SET_REG_LCD; НЕТ — ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ
; ВРЕМЕНИ ВКЛЮЧЕНИЯ НА ИНДИКАЦИЮ
CLRF START_HL; ДА — ОЧИСТИТЬ МЛАДШИЙ СЧЕТЧИК ЧАСОВ
INCF START_HH; ИНКРЕМЕНТИРОВАТЬ СТАРШИЙ СЧЕТЧИК ЧАСОВ
GOTO SET_REG_LCD; ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ
; ВРЕМЕНИ ВКЛЮЧЕНИЯ НА ИНДИКАЦИЮ
;;
M8
BTFSC PORTB, 6; НАЖАТА КНОПКА «- 1»
GOTO STOP_TMR22; ПЕРЕХОД НА ПОДПРОГРАММУ ОСТАНОВКИ ТАЙМЕРА TMR2
; СЧЕТЧИК ЕДИНИЦ ЧАСОВ
BCF STATUS, C
DECF START_HL, F; ДЕКРЕМЕНТИРОВАТЬ МЛАДШИЙ СЧЕТЧИК ЧАСОВ
BTFSS STATUS, C; ПРОИЗОШЕЛ ЗАЕМ
GOTO SET_REG_LCD; НЕТ — ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ
; ВРЕМЕНИ ВКЛЮЧЕНИЯ НА ИНДИКАЦИЮ
BCF STATUS, C
MOVLW 0×09; ДА — ЗАГРУЗИТЬ НАЧАЛЬНОЕ ЗНАЧЕНИЕ
MOVWF START_HL
;;
; СЧЕТЧИК ДЕСЯТКОВ ЧАСОВ
DECF START_HH, F; ДЕКРЕМЕНТИРОВАТЬ СТАРШИЙ СЧЕТЧИК ЧАСОВ
BTFSS STATUS, C; ПРОИЗОШЕЛ ЗАЕМ
GOTO SET_REG_LCD; НЕТ — ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ
; ВРЕМЕНИ ВКЛЮЧЕНИЯ НА ИНДИКАЦИЮ
BCF STATUS, C
MOVLW 0×02; ДА — ЗАГРУЗИТЬ НАЧАЛЬНЫЕ ЗНАЧЕНИЯ В СЧЕТЧИКИ
MOVWF START_HH
MOVLW 0×04
MOVWF START_HL
GOTO SET_REG_LCD; НЕТ — ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ
; ВРЕМЕНИ ВКЛЮЧЕНИЯ НА ИНДИКАЦИЮ
;;
STOP_TMR22
BCF T2CON, TMR2ON; ОСТАНОВКА ТАЙМЕРА TMR2
SET_REG_LCD
MOVF START_ML, W
MOVWF IND0
MOVF START_MH, W
MOVWF IND1
MOVF START_HL, W
MOVWF IND2
MOVF START_HH, W
MOVWF IND3
BCF POINT, 2; ВЫКЛЮЧИТЬ ТОЧКУ ВО 2-М РАЗРЯДЕ
BSF POINT, 1; ВКЛЮЧИТЬ ТОЧКУ В 1-М РАЗРЯДЕ
GOTO INT_SOURCE; ВЕРНУТЬСЯ К ПОИСКУ ИСТОЧНИКОВ ПРЕРЫВАНИЙ
;;
; ПОДПРОГРАММА УСТАНОВКИ ВРЕМЕНИ ВЫКЛЮЧЕНИЯ
STOP_TIME; УСТАНОВКА ВРЕМЕНИ ВЫКЛЮЧЕНИЯ
BTFSS FLAG_R, 2; РЕЖИМ УСТАНОВКИ ВРЕМЕНИ ВЫКЛЮЧЕНИЯ ВКЛЮЧЕН
GOTO CURRENT_TIME; НЕТ — ПЕРЕХОД К УСТАНОВКЕ ТЕКУЩЕГО ВРЕМЕНИ
BTFSS FLAG_R, 5; РЕЖИМ УСТАНОВКИ МИНУТ ВКЛЮЧЕН
GOTO SET_HOUR; НЕТ — ПЕРЕХОД К УСТАНОВКЕ ЧАСОВ
BTFSC PORTB, 6; НАЖАТА КНОПКА «+1»
GOTO M10; НЕТ — ПЕРЕХОД К ПРОВЕРКЕ НАЖАТИЯ КНОПКИ «- 1»
;;
; СЧЕТЧИК ЕДИНИЦ МИНУТ
INCF STOP_ML, F; ИНКРЕМЕНТИРОВАТЬ МЛАДШИЙ СЧЕТЧИК МИНУТ
BCF STATUS, Z
MOVF STOP_ML, W; СЧЕТЧИК ДОСЧИТАЛ ДО 10
XORLW 0x0A
BTFSS STATUS, Z
GOTO SET_REG_LCD1; НЕТ — ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ
; ВРЕМЕНИ ВЫКЛЮЧЕНИЯ НА ИНДИКАЦИЮ
CLRF STOP_ML; ДА — ОЧИСТИТЬ МЛАДШИЙ СЧЕТЧИК МИНУТ
;;
; СЧЕТЧИК ДЕСЯТКОВ МИНУТ
INCF STOP_MH, F; ИНКРЕМЕНТИРОВАТЬ СТАРШИЙ СЧЕТЧИК МИНУТ
BCF STATUS, Z
MOVF STOP_MH, W; СЧЕТЧИК ДОСЧИТАЛ ДО 6
XORLW 0×06
BTFSS STATUS, Z
GOTO SET_REG_LCD1; НЕТ — ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ
; ВРЕМЕНИ ВЫКЛЮЧЕНИЯ НА ИНДИКАЦИЮ
CLRF STOP_MH; ДА — ОЧИСТИТЬ СТАРШИЙ СЧЕТЧИК МИНУТ
GOTO SET_REG_LCD1; ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ
; ВРЕМЕНИ ВЫКЛЮЧЕНИЯ НА ИНДИКАЦИЮ
;;
M10
BTFSC PORTB, 7; НАЖАТА КНОПКА «- 1»
GOTO STOP_TMR23; ПЕРЕХОД НА ПОДПРОГРАММУ ОСТАНОВКИ ТАЙМЕРА TMR2
;;
; СЧЕТЧИК ЕДИНИЦ МИНУТ
BCF STATUS, C
DECF STOP_ML, F; ДЕКРЕМЕНТИРОВАТЬ МЛАДШИЙ СЧЕТЧИК МИНУТ
BTFSS STATUS, C; ПРОИЗОШЕЛ ЗАЕМ
GOTO SET_REG_LCD1; НЕТ — ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ
; ВРЕМЕНИ ВЫКЛЮЧЕНИЯ НА ИНДИКАЦИЮ
BCF STATUS, C
MOVLW 0×09; ДА — ЗАГРУЗКА НАЧАЛЬНОГО ЗНАЧЕНИЯ
MOVWF STOP_ML
;;
; СЧЕТЧИК ДЕСЯТКОВ МИНУТ
DECF STOP_MH, F; ДЕКРЕМЕНТИРОВАТЬ СТАРШИЙ СЧЕТЧИК МИНУТ
BTFSS STATUS, C; ПРОИЗОШЕЛ ЗАЕМ
GOTO SET_REG_LCD1; НЕТ — ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ
; ВРЕМЕНИ ВЫКЛЮЧЕНИЯ НА ИНДИКАЦИЮ
BCF STATUS, C
MOVLW 0×05; ДА — ЗАПИСАТЬ НАЧАЛЬНОЕ ЗНАЧЕНИЕ
MOVWF STOP_MH
GOTO SET_REG_LCD1; НЕТ — ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ
; ВРЕМЕНИ ВЫКЛЮЧЕНИЯ НА ИНДИКАЦИЮ
;;
BTFSS FLAG_R, 4; РЕЖИМ УСТАНОВКИ ЧАСОВ ВКЛЮЧЕН
GOTO STOP_TMR23; ПЕРЕХОД НА ПОДПРОГРАММУ ОСТАНОВКИ ТАЙМЕРА TMR2
;;
BTFSC PORTB, 6; НАЖАТА КНОПКА «+1»
GOTO M11; НЕТ — ПЕРЕХОД К ПРОВЕРКЕ НАЖАТИЯ КНОПКИ «- 1»
; СЧЕТЧИКИ ЧАСОВ
INCF STOP_HL, F; ИНКРЕМЕНТИРОВАТЬ МЛАДШИЙ СЧЕТЧИК ЧАСОВ
BCF STATUS, Z
MOVF STOP_HH, W; СТАРШИЙ СЧЕТЧИК ДОСЧИТАЛ ДО 2
XORLW 0×02
BTFSS STATUS, Z
GOTO M12; НЕТ — ПЕРЕХОД НА ПРОВЕРКУ МЛАДШЕГО СЧЕТЧИКА
BCF STATUS, Z
MOVF STOP_HL, W
XORLW 0×04
BTFSS STATUS, Z
GOTO M12
BCF STATUS, Z
CLRF STOP_HL; ДА — ОЧИСТИТЬ МЛАДШИЙ СЧЕТЧИК ЧАСОВ
CLRF STOP_HH
GOTO SET_REG_LCD1; НЕТ — ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ
; ВРЕМЕНИ ВЫКЛЮЧЕНИЯ НА ИНДИКАЦИЮ
M12
MOVF STOP_HL, W
XORLW 0x0A; СЧЕТЧИК ДОСЧИТАЛ ДО 10
BTFSS STATUS, Z
GOTO SET_REG_LCD1; НЕТ — ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ
; ВРЕМЕНИ ВЫКЛЮЧЕНИЯ НА ИНДИКАЦИЮ
CLRF STOP_HL; ДА — ОЧИСТИТЬ МЛАДШИЙ СЧЕТЧИК ЧАСОВ
INCF STOP_HH; ИНКРЕМЕНТИРОВАТЬ СТАРШИЙ СЧЕТЧИК ЧАСОВ
GOTO SET_REG_LCD1; ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ
; ВРЕМЕНИ ВЫКЛЮЧЕНИЯ НА ИНДИКАЦИЮ
;;
M11
BTFSC PORTB, 6; НАЖАТА КНОПКА «- 1»
GOTO STOP_TMR23; ПЕРЕХОД НА ПОДПРОГРАММУ ОСТАНОВКИ ТАЙМЕРА TMR2
; СЧЕТЧИК ЕДИНИЦ ЧАСОВ
BCF STATUS, C
DECF STOP_HL, F; ДЕКРЕМЕНТИРОВАТЬ МЛАДШИЙ СЧЕТЧИК ЧАСОВ
BTFSS STATUS, C; ПРОИЗОШЕЛ ЗАЕМ
GOTO SET_REG_LCD1; НЕТ — ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ
; ВРЕМЕНИ ВЫКЛЮЧЕНИЯ НА ИНДИКАЦИЮ
BCF STATUS, C
MOVLW 0×09; ДА — ЗАГРУЗИТЬ НАЧАЛЬНОЕ ЗНАЧЕНИЕ
MOVWF STOP_HL
;;
; СЧЕТЧИК ДЕСЯТКОВ ЧАСОВ
DECF STOP_HH, F; ДЕКРЕМЕНТИРОВАТЬ СТАРШИЙ СЧЕТЧИК ЧАСОВ
BTFSS STATUS, C; ПРОИЗОШЕЛ ЗАЕМ
GOTO SET_REG_LCD1; НЕТ — ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ
; ВРЕМЕНИ ВЫКЛЮЧЕНИЯ НА ИНДИКАЦИЮ
BCF STATUS, C
MOVLW 0×02; ДА — ЗАГРУЗИТЬ НАЧАЛЬНЫЕ ЗНАЧЕНИЯ В СЧЕТЧИКИ
MOVWF STOP_HH
MOVLW 0×04
MOVWF STOP_HL
GOTO SET_REG_LCD1; НЕТ — ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ
; ВРЕМЕНИ ВЫКЛЮЧЕНИЯ НА ИНДИКАЦИЮ
;;
STOP_TMR23
BCF T2CON, TMR2ON; ОСТАНОВКА ТАЙМЕРА TMR2
SET_REG_LCD1
MOVF STOP_ML, W
MOVWF IND0
MOVF STOP_MH, W
MOVWF IND1
MOVF STOP_HL, W
MOVWF IND2
MOVF STOP_HH, W
MOVWF IND3
BCF POINT, 2; ВЫКЛЮЧИТЬ ТОЧКУ ВО 2-М РАЗРЯДЕ
BSF POINT, 1; ВКЛЮЧИТЬ ТОЧКУ В 1-М РАЗРЯДЕ
GOTO INT_SOURCE; ВЕРНУТЬСЯ К ПОИСКУ ИСТОЧНИКОВ ПРЕРЫВАНИЙ
;;
; ПОДПРОГРАММА УСТАНОВКИ ТЕКУЩЕГО ВРЕМЕНИ
CURRENT_TIME; УСТАНОВКА ТЕКУЩЕГО ВРЕМЕНИ
BTFSS FLAG_R, 2; РЕЖИМ УСТАНОВКИ ТЕКУЩЕГО ВРЕМЕНИ ВКЛЮЧЕН
GOTO INT_SOURCE; ВЕРНУТЬСЯ К ПОИСКУ ИСТОЧНИКОВ ПРЕРЫВАНИЙ
BTFSS FLAG_R, 5; РЕЖИМ УСТАНОВКИ МИНУТ ВКЛЮЧЕН
GOTO SET_HOUR; НЕТ — ПЕРЕХОД К УСТАНОВКЕ ЧАСОВ
BTFSC PORTB, 6; НАЖАТА КНОПКА «+1»
GOTO M13; НЕТ — ПЕРЕХОД К ПРОВЕРКЕ НАЖАТИЯ КНОПКИ «- 1»
;;
; СЧЕТЧИК ЕДИНИЦ МИНУТ
INCF MIN_L, F; ИНКРЕМЕНТИРОВАТЬ МЛАДШИЙ СЧЕТЧИК МИНУТ
BCF STATUS, Z
MOVF MIN_L, W; СЧЕТЧИК ДОСЧИТАЛ ДО 10
XORLW 0x0A
BTFSS STATUS, Z
GOTO SET_REG_LCD2; НЕТ — ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ
; ТЕКУЩЕГО ВРЕМЕНИ НА ИНДИКАЦИЮ
CLRF MIN_L; ДА — ОЧИСТИТЬ МЛАДШИЙ СЧЕТЧИК МИНУТ
;;
; СЧЕТЧИК ДЕСЯТКОВ МИНУТ
INCF MIN_H, F; ИНКРЕМЕНТИРОВАТЬ СТАРШИЙ СЧЕТЧИК МИНУТ
BCF STATUS, Z
MOVF MIN_H, W; СЧЕТЧИК ДОСЧИТАЛ ДО 6
XORLW 0×06
BTFSS STATUS, Z
GOTO SET_REG_LCD2; НЕТ — ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ
; ТЕКУЩЕГО ВРЕМЕНИ НА ИНДИКАЦИЮ
CLRF MIN_H; ДА — ОЧИСТИТЬ СТАРШИЙ СЧЕТЧИК МИНУТ
GOTO SET_REG_LCD2; НЕТ — ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ
; ТЕКУЩЕГО ВРЕМЕНИ НА ИНДИКАЦИЮ
;;
M13
BTFSC PORTB, 7; НАЖАТА КНОПКА «- 1»
GOTO STOP_TMR24; ПЕРЕХОД НА ПОДПРОГРАММУ ОСТАНОВКИ ТАЙМЕРА TMR2
;;
; СЧЕТЧИК ЕДИНИЦ МИНУТ
BCF STATUS, C
DECF MIN_L, F; ДЕКРЕМЕНТИРОВАТЬ МЛАДШИЙ СЧЕТЧИК МИНУТ
BTFSS STATUS, C; ПРОИЗОШЕЛ ЗАЕМ
GOTO SET_REG_LCD2; НЕТ — ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ
; ТЕКУЩЕГО ВРЕМЕНИ НА ИНДИКАЦИЮ
BCF STATUS, C
MOVLW 0×09; ДА — ЗАГРУЗКА НАЧАЛЬНОГО ЗНАЧЕНИЯ
MOVWF MIN_L
;;
; СЧЕТЧИК ДЕСЯТКОВ МИНУТ
DECF MIN_H, F; ДЕКРЕМЕНТИРОВАТЬ СТАРШИЙ СЧЕТЧИК МИНУТ
BTFSS STATUS, C; ПРОИЗОШЕЛ ЗАЕМ
GOTO SET_REG_LCD2; НЕТ — ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ
; ТЕКУЩЕГО ВРЕМЕНИ НА ИНДИКАЦИЮ
BCF STATUS, C
MOVLW 0×05; ДА — ЗАПИСАТЬ НАЧАЛЬНОЕ ЗНАЧЕНИЕ
MOVWF MIN_H
GOTO SET_REG_LCD2; НЕТ — ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ
; ВЫВОДОМ ВРЕМЕНИ ВКЛЮЧЕНИЯ НА ИНДИКАЦИЮ
;;
BTFSS FLAG_R, 4; РЕЖИМ УСТАНОВКИ ЧАСОВ ВКЛЮЧЕН
GOTO STOP_TMR24; ПЕРЕХОД НА ПОДПРОГРАММУ ОСТАНОВКИ ТАЙМЕРА TMR2
;;
BTFSC PORTB, 6; НАЖАТА КНОПКА «+1»
GOTO M14; НЕТ — ПЕРЕХОД К ПРОВЕРКЕ НАЖАТИЯ КНОПКИ «- 1»
SET_HOUR
; СЧЕТЧИКИ ЧАСОВ
INCF HOUR_L, F; ИНКРЕМЕНТИРОВАТЬ МЛАДШИЙ СЧЕТЧИК ЧАСОВ
BCF STATUS, Z
MOVF HOUR_H, W; СТАРШИЙ СЧЕТЧИК ДОСЧИТАЛ ДО 2
XORLW 0×02
BTFSS STATUS, Z
GOTO M15; НЕТ — ПЕРЕХОД НА ПРОВЕРКУ МЛАДШЕГО СЧЕТЧИКА
BCF STATUS, Z
MOVF HOUR_L, W
XORLW 0×04
BTFSS STATUS, Z
GOTO M15
BCF STATUS, Z
CLRF HOUR_L; ДА — ОЧИСТИТЬ МЛАДШИЙ СЧЕТЧИК ЧАСОВ
CLRF HOUR_H
GOTO SET_REG_LCD2; ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ
; ТЕКУЩЕГО ВРЕМЕНИ НА ИНДИКАЦИЮ
M15
MOVF HOUR_L, W
XORLW 0x0A; СЧЕТЧИК ДОСЧИТАЛ ДО 10
BTFSS STATUS, Z
GOTO SET_REG_LCD2; НЕТ — ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ
; ВЫВОДОМ ВРЕМЕНИ ВКЛЮЧЕНИЯ НА ИНДИКАЦИЮ
CLRF HOUR_L; ДА — ОЧИСТИТЬ МЛАДШИЙ СЧЕТЧИК ЧАСОВ
INCF HOUR_H; ИНКРЕМЕНТИРОВАТЬ СТАРШИЙ СЧЕТЧИК ЧАСОВ
GOTO SET_REG_LCD2; НЕТ — ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ