Микропроцессорныая система. Автоматический чайник

 

Введение


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

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

В течении четырех лет, начиная с 1976 г., фирмой INTEL разрабатывалось получившее широкое распространение семейство 8-и разрядных однокристальных микроконтроллеров с программным управлением MCS-48.

Вычислительные возможности первых однокристальных микроЭВМ были исчерпаны уже к началу 80-х гг. Встала задача разработки новых микроконтроллеров, обладающих расширенными функциональными ресурсами. Среди предложенных новых архитектур однокристальных микроЭВМ следует выделить 8-и разрядную архитектуру семейства микроконтроллеров MCS-51, предложенного фирмой INTEL в 1981 г. Она удовлетворяет всем требованиям, представляемым к однокристальным микроконтроллерам, и является наиболее применяемой.

Однако к настоящему времени значительную часть мирового рынка микропроцессорных средств составляет другой вид однокристальных контроллеров - это т.н. периферийные интерфейсные контроллеры или PIC. Они представляют собой высокопроизводительные БИС, в которые интегрированы помимо цифровых устройств (собственно микроконтроллера) также и аналоговые - это различные АЦП, компараторы, модули сравнения ШИМ и т.д. Это делает данные устройства чрезвычайно популярными у производителей «интеллектуальных» устройств.

Исходя из вышеперечисленного, разрабатываемая нами система управления барокамерой будет обладать следующими свойствами:

·Простота в установке, наладке и эксплуатации;

·Небольшие габариты;

·Небольшая стоимость;

·Обработка системой различных аварийных ситуаций;

Возможность получения информации о состоянии установки и технологического процесса с помощью ЭВМ.


1. Разработка аппаратного обеспечения


.1 Функциональная схема микропроцессорной системы управления


Функциональная схема системы управления представлена на рисунке 1.


Рисунок 1 - Функциональная схема системы управления


На рисунке представлена функциональная схема системы управления, на которой указаны подключения к микроконтроллеру всех датчиков. При необходимости при подключении датчиков, для согласования сигналов, использовались схемы сопряжения (СС). Кроме того на схеме указано подключение к микроконтроллеру 4-х 7-сегментных светодиодных индикаторов через схему управления (СУ), подключенную к шине I2C и согласование микроконтроллера с интерфейсом RS-449. Также на схеме показаны все выходные сигналы, используемые для управления различными устройствами.


.2 Выбор элементной базы


.2.1 Выбор микроконтроллера


Таблица 1 - Наименование линий ввода / вывода микроконтроллера

ДатчикиИсполнительный механизмПрочееТип линии1 (температуры)--Аналоговая1 (уровня)--Цифровая-1 (нагреватель)-Цифровая--9 (клавиатура)Цифровая--1 (прерывание от клавиатуры)Цифровая--2 (выводы тактового генератора таймера TMR1)Цифровая--2 (I2C)Цифровая--1 (индикация снижения уровня)Цифровая--2 (USART)Цифровая

Для обработки информации со всех датчиков и для управления всеми устройствами необходимо 20 линий ввода / вывода.

Контроллер должен иметь следующие периферийные модули:

1.Модуль АЦП для обработки сигнала от датчика температуры;

2.EEPROM память данных для хранения установок времени и температуры.

.Модуль USART для обеспечения возможности передачи данных из EEPROM во внешнее устройство.

.Модуль MSSP для управления индикаторами по шине I2С.

.Таймер TMR1 с отдельным генератором для формирования секундных импульсов.

.Таймер 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/S0D1/S1D2/S2D3/S3S4S5S6S7S8S9Индикатор 0К0S0SGSFSESDSCSBSAS4Индикатор 1S1К1SGSFSESDSCSBSAS5Индикатор 2SGSFК2S2SESDSCSBSAS6Индикатор 3SGSFS3К3SESDSCSBSAS7Примечание: К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; ОЧИСТКА ПОРТОВPORTBPORTC

B'00111111'; ЛИНИИ RA0-RA5 НА ВВОДTRISAB'11110011'; ЛИНИИ RB2, RB3 НА ВЫВОД

; ОСТАЛЬНЫЕ НА ВВОДTRISBTRISC

;-

; ИНИЦИАЛИЗАЦИЯ МОДУЛЯ USARTB'10010000'; ВКЛЮЧИТЬ МОДУЛЬ USART

; РАЗРЕШИТЬ ПРИЕМ

; УСТАНОВИТЬ 8-РАЗРЯДНЫЙ ПРИЕМRCSTAB'00000100'; УСТАНОВИТЬ 8-РАЗРЯДНУЮ ПЕРЕДАЧУ

; АСИНХРОННЫЙ НИЗКОСКОРОСТНОЙ РЕЖИМ ПЕРЕДАЧИTXSTAD'129'; СКОРОСТЬ ОБМЕНА 9600 бит/сSPBRG

;-

; ИНИЦИАЛИЗАЦИЯ МОДУЛЯ MSSPB'00001000'; ВЕДУЩИЙ РЕЖИМ I2CSSPCONB'10000000'; УПРАВЛЕНИЕ ДЛИТЕЛЬНОСТЬЮ ФРОНТА ВЫКЛЮЧЕНО

; ВЫХ. УРОВНИ СООТВЕТСТВУЮТ СПЕЦИФИКАЦИИ I2CSSPSTAT0x09; ТАКТОВАЯ ЧАСТОТА 100 кГцSSPADDSSPCON2


;-

; ИНИЦИАЛИЗАЦИЯ МОДУЛЯ АЦПB'10001110'; ПРАВОЕ ВЫРАВНИВАНИЕ

; КАНАЛ AN0 - АНАЛОГОВЫЙ ВХОД, ОСТАЛЬНЫЕ ЦИФРОВЫЕADCON1B'10000001'; МОДУЛЬ АЦП ВКЛЮЧЕН

; ТАКТОВАЯ ЧАСТОТА Fosc/32

; ВЫБРАН КАНАЛ 0ADCON0


;-

; ИНИЦИАЛИЗАЦИЯ МОДУЛЯ CCPB'00001011'; РЕЖИМ СРАВНЕНИЯ

; ТРИГГЕР СПЕЦИАЛЬНЫХ ФУНКЦИЙCCP1CON0x80; ЗАГРУЗИТЬ 8000h В РЕГИСТРЫ CCPR1H И CCPR1LCCPR1HCCPR1L

;-

; ИНИЦИАЛИЗАЦИЯ ТАЙМЕРА TMR1B'00000010'; КОЭФФИЦИЕНТ ДЕЛЕНИЯ ПРЕДДЕЛИТЕЛЯ 1:1

; СИНХРОНИЗАЦИЯ ВКЛЮЧЕНА

; ВНЕШНИЙ ИСТОЧНИК ТАКТОВЫХ ИМПУЛЬСОВT1CONTMR1L; ОЧИСТКА РЕГИСТРОВ TMR1L И TMR1HTMR1H

;-

; ИНИЦИАЛИЗАЦИЯ ТАЙМЕРА TMR2B'01111010'; ПРЕДДЕЛИТЕЛЬ 1/16, ВЫХОДНОЙ ДЕЛИТЕЛЬ 1/16

MOVWFT2CON0xFFPR2

;-OPTION_REG; ПОДКЛЮЧИТЬ ПОДТЯГИВАЮЩИЕ РЕЗИСТОРЫ

; К ВЫВОДАМ PORTB

; АКТИВНЫЙ ЗАДНИЙ ФРОНТ ИМПУЛЬСА НА ВХОДЕ INT

;-

; ИНИЦИАЛИЗАЦИЯ ПРЕРЫВАНИЙB'01011000'; РАЗРЕШИТЬ ПРЕРЫВАНИЯ ОТ ПЕРИФЕРИЙНЫХ МОДУЛЕЙ

; И ПРЕРЫВАНИЯ ПО ВХОДАМ INT И <RB4:RB7>INTCONB'00100110'; РАЗРЕШИТЬ ПРЕРЫВАНИЯ ОТ ПРИЕМНИКА USART,

; МОДУЛЯ CCP1 И ТАЙМЕРА TMR2PIR1PIE1


;-

; ИНИЦИАЛИЗАЦИЯ РЕГИСТРОВ ОБЩЕГО НАЗНАЧЕНИЯEEADR; ОЧИСТИТЬ РЕГИСТР АДРЕСАEECON1, EEPGD; УСТАНОВИТЬ ЧТЕНИЕ ИЗ EEPROMEECON1, RD; НАЧАТЬ ЧТЕНИЕEEDATA, W; ПРОЧИТАТЬ РЕГИСТР ДАННЫХMAX_TL; ПОМЕСТИТЬ СОДЕРЖИМОЕ ТЕКУЩЕЙ ЯЧЕЙКИ ПАМЯТИ

; В РЕГИСТР MAX_TLEEADR, F; УВЕЛИЧИТЬ АДРЕС ТЕКУЩЕЙ ЯЧЕЙКИ ПАМЯТИ НА 1EEDATA, W; ПРОЧИТАТЬ РЕГИСТР ДАННЫХMAX_TH; ПОМЕСТИТЬ СОДЕРЖИМОЕ ТЕКУЩЕЙ ЯЧЕЙКИ ПАМЯТИ

; В РЕГИСТР MAX_THEEADR, F; УВЕЛИЧИТЬ АДРЕС ТЕКУЩЕЙ ЯЧЕЙКИ ПАМЯТИ НА 1EEDATA, W; ПРОЧИТАТЬ РЕГИСТР ДАННЫХSTART_ML; ПОМЕСТИТЬ СОДЕРЖИМОЕ ТЕКУЩЕЙ ЯЧЕЙКИ ПАМЯТИ

; В РЕГИСТР START_MLEEADR, F; УВЕЛИЧИТЬ АДРЕС ТЕКУЩЕЙ ЯЧЕЙКИ ПАМЯТИ НА 1EEDATA, W; ПРОЧИТАТЬ РЕГИСТР ДАННЫХSTART_MH; ПОМЕСТИТЬ СОДЕРЖИМОЕ ТЕКУЩЕЙ ЯЧЕЙКИ ПАМЯТИ

; В РЕГИСТР START_MHEEADR, F; УВЕЛИЧИТЬ АДРЕС ТЕКУЩЕЙ ЯЧЕЙКИ ПАМЯТИ НА 1EEDATA, W; ПРОЧИТАТЬ РЕГИСТР ДАННЫХSTART_HL; ПОМЕСТИТЬ СОДЕРЖИМОЕ ТЕКУЩЕЙ ЯЧЕЙКИ ПАМЯТИ

; В РЕГИСТР START_HLEEADR, F; УВЕЛИЧИТЬ АДРЕС ТЕКУЩЕЙ ЯЧЕЙКИ ПАМЯТИ НА 1EEDATA, W; ПРОЧИТАТЬ РЕГИСТР ДАННЫХSTART_HH; ПОМЕСТИТЬ СОДЕРЖИМОЕ ТЕКУЩЕЙ ЯЧЕЙКИ ПАМЯТИ

; В РЕГИСТР START_HHEEADR, F; УВЕЛИЧИТЬ АДРЕС ТЕКУЩЕЙ ЯЧЕЙКИ ПАМЯТИ НА 1EEDATA, W; ПРОЧИТАТЬ РЕГИСТР ДАННЫХSTOP_ML; ПОМЕСТИТЬ СОДЕРЖИМОЕ ТЕКУЩЕЙ ЯЧЕЙКИ ПАМЯТИ

; В РЕГИСТР STOP_MLEEADR, F; УВЕЛИЧИТЬ АДРЕС ТЕКУЩЕЙ ЯЧЕЙКИ ПАМЯТИ НА 1EEDATA, W; ПРОЧИТАТЬ РЕГИСТР ДАННЫХSTOP_MH; ПОМЕСТИТЬ СОДЕРЖИМОЕ ТЕКУЩЕЙ ЯЧЕЙКИ ПАМЯТИ

; В РЕГИСТР STOP_MHEEADR, F; УВЕЛИЧИТЬ АДРЕС ТЕКУЩЕЙ ЯЧЕЙКИ ПАМЯТИ НА 1EEDATA, W; ПРОЧИТАТЬ РЕГИСТР ДАННЫХSTOP_HL; ПОМЕСТИТЬ СОДЕРЖИМОЕ ТЕКУЩЕЙ ЯЧЕЙКИ ПАМЯТИ

; В РЕГИСТР STOP_HLEEADR, F; УВЕЛИЧИТЬ АДРЕС ТЕКУЩЕЙ ЯЧЕЙКИ ПАМЯТИ НА 1EEDATA, W; ПРОЧИТАТЬ РЕГИСТР ДАННЫХSTOP_HH; ПОМЕСТИТЬ СОДЕРЖИМОЕ ТЕКУЩЕЙ ЯЧЕЙКИ ПАМЯТИ

; В РЕГИСТР STOP_HH

B'0100000'; ВКЛЮЧИТЬ РЕЖИМ ОТОБРАЖЕНИЯ ТЕКУЩЕГО ВРЕМЕНИFLAG_RFLAG_R1; ВЫКЛЮЧИТЬ РЕЖИМ ПОДДЕРЖАНИЯ ТЕМПЕРАТУРЫ

IND_0; ОБНУЛИТЬ РЕГИСТРЫ ИНДИКАЦИИIND_1

CLRFIND_2IND_3

SEC_L; ОБНУЛИТЬ СЧЕТЧИКИSEC_HMIN_LMIN_HHOUR_L

CLRFHOUR_H

B'00000010'; ВКЛЮЧИТЬ ДЕЦИМАЛЬНУЮ ТОЧКУ ВО 2-М РАЗРЯДЕPOINT

;-

; ИНИЦИАЛИЗАЦИЯ ДРАЙВЕРА LCDSSPCON, SSPEN; ВКЛЮЧИТЬ МОДУЛЬ MSSPSSPCON2, SEN; СГЕНЕРИРОВАТЬ БИТ STARTSSPCON2, SEN; ОЖИДАТЬ ОКОНЧАНИЯ ГЕНЕРАЦИИ БИТА START$-10x38; ПЕРЕДАТЬ АДРЕС ДРАЙВЕРАSSPBUFSSPCON2, ACKSTAT; ОЖИДАТЬ ФОРМИРОВАНИЕ БИТА ПОДТВЕРЖДЕНИЯ$-10x01; ПРЕРЕДАТЬ АДРЕС РЕГИСТРА УПРАВЛЕНИЯ ДЕКОДИРОВАНИЕМSSPBUFSSPCON2, ACKSTAT; ОЖИДАТЬ ФОРМИРОВАНИЕ БИТА ПОДТВЕРЖДЕНИЯ$-10x0F; ВКЛЮЧИТЬ ДВОИЧНО-ДЕСЯТИЧНОЕ ДЕКОДИРОВАНИЕ ДЛЯ ВСЕХ

; РАЗРЯДОВSSPBUFSSPSTAT, BF; ОЖИДАТЬ ОКОНЧАНИЕ ПЕРЕДАЧИ$-10x07; УСТАНОВИТЬ ЯРКОСТЬ СВЕЧЕНИЯ ИНДИКАТОРОВSSPBUFSSPCON2, ACKSTAT; ОЖИДАТЬ ФОРМИРОВАНИЕ БИТА ПОДТВЕРЖДЕНИЯ$-1SSPCON2, PEN; СФОРМИРОВАТЬ БИТ STOP

INTCON, GIE; РАЗРЕШИТЬ ПРЕРЫВАНИЯ

;-


2.3 Преобразование напряжения от датчика температуры


Ниже приведена часть программы, осуществляющая преобразование напряжения от датчика температуры. При изменении температуры от 0 до 1000С напряжение на входе АЦП изменяется в пределах 0…4,88 В. При этом результат преобразования в регистрах ADRESL и ADRESH будет изменяться в пределах 0…1000d, что позволяет легко преобразовать результат в десятичный формат.


;-TIME1; СФОРМИРОВАТЬ ЗАДЕРЖКУ 20 мкс

MOVWFTIMER1TIMER1, 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'; ДА - ВКЛЮЧИТЬ ТОЧКУ В ПЕРВОМ РАЗРЯДЕPOINTADRESL, W; ПОМЕСТИТЬ РЕЗУЛЬТАТ ПРЕОБРАЗОВАНИЯ ВО ВРЕМЕННЫЕ

; РЕГИСТРЫ

MOVWFTEMP_TLADRESH, W

MOVWFTEMP_THBIN_DEC; ВЫЗОВ ПОДПРОГРАММЫ ДВОИЧНО-ДЕСЯТИЧНОЙ

; КОРРЕКЦИИ

;-


2.5 Подпрограмма управления нагревателем


Данная подпрограмма осуществляет контроль состояния датчика снижения уровня воды и проверяет включение режима поддержания температуры. Если уровень воды в норме и включен режим поддержания температуры (бит 0 в регистре FLAG_R1 установлен в 1), то происходит включение нагревателя. Если уровень воды уменьшается ниже нормы, нагреватель выключается и включается индикатор «Снижение уровня воды».

;-_NAGREV; ПОДПРОГРАММА УПРАВЛЕНИЯ НАГРЕВАТЕЛЕМFLAG_R1,0; РЕЖИМ ПОДДЕРЖАНИЯ ТЕМПЕРАТУРЫ ВЫКЛЮЧЕН$+3PORTB, 2; ДА - ВЫКЛЮЧИТЬ НАГРЕВ

GOTOOUT_LEDPORTA, 1; УРОВЕНЬ В НОРМЕ

GOTO$+4PORTB, 3; НЕТ - ВКЛЮЧИТЬ ИНДИКАТОР «СНИЖЕНИЕ УРОВНЯ

; ВОДЫ»

BCFPORTB, 2; ВЫКЛЮЧИТЬ НАГРЕВ

GOTOOUT_LEDPORTB, 3; ВЫКЛЮЧИТЬ ИНДИКАТОР «СНИЖЕНИЕ УРОВНЯ ВОДЫ»

;-


2.6 Подпрограмма вычисления нижнего предела температуры


Данная подпрограмма вычисляет нижний предел температуры, который принимается на 50С ниже заданного (верхнего).

Рассчитаем константу DELT_T, соответствующую разности температур в 50С:


;

где Nmax - значение регистров ADRESL и ADRESH, соответствующее температуре Tmax.

Так как Tmax = 1000С и Nmax = 1000d, то


.


;-

; ПОДПРОГРАММА ВЫЧИСЛЕНИЯ НИЖНЕГО ПРЕДЕЛА ТЕМПЕРАТУРЫMIN_TH; ОЧИСТКА РЕГИСТРА MIN_THMAX_TL, WDELT_T; ВЫЧЕСТЬ ИЗ СОДЕРЖИМОГО MAX_TL РАЗНОСТЬ ТЕМПЕРАТУРMIN_TL; ПОМЕСТИТЬ РЕЗУЛЬТАТ В MIN_TLMIN_TH, W; ЕСЛИ БЫЛ ЗАЕМMAX_TH, W; УМЕНЬШИТЬ ЗНАЧЕНИЕ РЕГИСТРА MAX_TH НА 1MIN_TH; ПОМЕСТИТЬ РЕЗУЛЬТАТ В РЕГИСТР MIN_THSTATUS, C; ЕСЛИ БЫЛ ЗАЕМ$+4MIN_TL; ОЧИСТИТЬ РЕГИСТРЫ MIN_TL И MIN_THMIN_THSTATUS, C; И СБРОСИТЬ ФЛАГ ПЕРЕНОСА


;-


2.7 Подпрограмма контроля температуры


Данная подпрограмма осуществляет контроль температуры воды и при ее уменьшении ниже значения, записанного в регистрах MIN_TH и MIN_TL включает нагреватель, а при увеличении выше значения, записанного в регистрах MAX_TH и MAX_TL выключает его.


;-

; ПОДПРОГРАММА ПРОВЕРКИ СНИЖЕНИЯ ТЕМПЕРАТУРЫ НИЖЕ НОРМЫ


BCFSTATUS, ZADRESH, WMIN_TH, WSTATUS, ZM1ADRESH, WSTATUS, CMIN_TH, WSTATUS, C

BSFPORTB, 2; ВКЛЮЧЕНИЕ НАГРЕВАТЕЛЯ

STATUS, Z

MOVFADRESL, WMIN_TL, W

BTFSCSTATUS, CPORTB, 2; ВКЛЮЧЕНИЕ НАГРЕВАТЕЛЯ

;-

; ПРОВЕРКА ПРЕВЫШЕНИЯ НОРМЫ

BANC1

MOVFADRESH, W

XORWFMAX_TH, WSTATUS, ZM2ADRESH, WMAX_TH, WSTATUS, CPORTB, 2; ВЫКЛЮЧЕНИЕ НАГРЕВАТЕЛЯ


M2STATUS, Z

MOVFADRESL, WMAX_TH, W

BTFSCSTATUS, C

BCFPORTB, 2; ВЫКЛЮЧЕНИЕ НАГРЕВАТЕЛЯ

;-


2.8 Подпрограмма вывода на индикацию


Данная подпрограмма осуществляет передачу значений буферных регистров индикации IND_0, IND_1, IND_2, IND_3 и регистра управления децимальной точкой POINT во внутренние регистры драйвера LCD.

Драйвер MAX6958 поддерживает автоинкрементирование адреса при записи значений в регистры. Поэтому при передаче данных достаточно указать начальный адрес (0х20), а затем последовательно передавать данные без предварительной передачи адреса следующего регистра. Адрес драйвера на шине I2C 0x38.

Ниже приведен листинг программы, осуществляющей вывод на индикацию.


;-_LED

; ПОДПРОГРАММА ВЫВОДА НА ИНДИКАЦИЮSSPCON2, SEN; СГЕНЕРИРОВАТЬ БИТ STARTSSPCON2, SEN; ОЖИДАТЬ ОКОНЧАНИЯ ГЕНЕРАЦИИ БИТА START$-10x38; ПЕРЕДАТЬ АДРЕС ДРАЙВЕРАSSPBUFSSPCON2, ACKSTAT; ОЖИДАТЬ ФОРМИРОВАНИЕ БИТА ПОДТВЕРЖДЕНИЯ$-10x20; ПРЕРЕДАТЬ АДРЕС ПЕРВОГО РЕГИСТРА ДАННЫХSSPBUFSSPCON2, ACKSTAT; ОЖИДАТЬ ФОРМИРОВАНИЕ БИТА ПОДТВЕРЖДЕНИЯ$-1IND_3, W; ПЕРЕДАТЬ СОДЕРЖИМОЕ 3-ГО РАЗРЯДА ИНДИКАЦИИ

BANC1SSPBUFSSPSTAT, BF

GOTO$-1IND_2, W; ПЕРЕДАТЬ СОДЕРЖИМОЕ 2-ГО РАЗРЯДА ИНДИКАЦИИ

BANC1SSPBUFSSPSTAT, BF

GOTO$-1IND_1, W; ПЕРЕДАТЬ СОДЕРЖИМОЕ 1-ГО РАЗРЯДА ИНДИКАЦИИ

BANC1SSPBUFSSPSTAT, BF

GOTO$-1IND_0, W; ПЕРЕДАТЬ СОДЕРЖИМОЕ 0-ГО РАЗРЯДА ИНДИКАЦИИ

BANC1SSPBUFSSPSTAT, BF

GOTO$-1POINT, W; ПЕРЕДАТЬ СОСТОЯНИЕ ДЕЦИМАЛЬНОЙ ТОЧКИSSPCON2, ACKSTAT$-1SSPCON2, PEN; СГЕНЕРИРОВАТЬ БИТ STOPEND_INT; ПЕРЕХОД НА НАЧАЛО ПРОГРАММЫ

;-

2.9 Подпрограмма двоично-десятичной коррекции


Данная подпрограмма осуществляет конвертирование двоичного кода, предварительно записанного в буферных регистрах TEMP_TL TEMP_TH в двоично-десятичный код, записываемый в регистры индикации IND_0, IND_1, IND_2, IND_3.

Листинг подпрограммы приведен ниже.


;-_DEC; ПОДПРОГРАММА ДВОИЧНО-ДЕСЯТИЧНОЙ КОРРЕКЦИИ

;-

; РАСПРЕДЕЛЕНИЕ ТЕТРАД РЕГИСТРОВ TEMP_TL И TEMP_TH ПО РЕГИСТРАМ IND_0 - IND_3

MOVFTEMP_TL, W0x0F

MOVWFIND_0; ПОМЕСТИТЬ МЛАДШУЮ ТЕТРАДУ TEMP_TL В IND_0


SWAPFTEMP_TL, W0x0F

MOVWFIND_1; ПОМЕСТИТЬ СТАРШУЮ ТЕТРАДУ TEMP_TL В IND_1


MOVFTEMP_TH, W0x0F

MOVWFIND_2; ПОМЕСТИТЬ МЛАДШУЮ ТЕТРАДУ TEMP_TH В IND_2


SWAPFTEMP_TH, W0x0F

MOVWFIND_3; ПОМЕСТИТЬ СТАРШУЮ ТЕТРАДУ TEMP_TH В IND_3

;-

; КОРРЕКЦИЯ РЕЗУЛЬТАТАSTATUS, ZSTATUS, C

MOVLW0x0AIND_0, WSTATUS, C

GOTO$+5STATUS, Z; ЕСЛИ ЗНАЧЕНИЕ IND_0 НЕ МЕНЬШЕ 0x0A$+3IND_0; В РЕГИСТР IND_0 ЗАПИСАТЬ РАЗНОСТЬ ЕГО СОДЕРЖИМОГО И

; 0x0AIND_1, F; И УВЕЛИЧИТЬ НА 1 СОДЕРЖИМОЕ IND_1


BCFSTATUS, ZSTATUS, C

MOVLW0x0A; ИНАЧЕ ЗНАЧЕНИЯ РЕГИСТРОВ ОСТАВИТЬ БЕЗ ИЗМЕНЕНИЯ

SUBWFIND_1, WSTATUS, C

GOTO$+5STATUS, Z; ЕСЛИ ЗНАЧЕНИЕ IND_1 НЕ МЕНЬШЕ 0x0A$+3IND_1; В РЕГИСТР IND_1 ЗАПИСАТЬ РАЗНОСТЬ ЕГО СОДЕРЖИМОГО И

; 0x0AIND_2, F; И УВЕЛИЧИТЬ НА 1 СОДЕРЖИМОЕ IND_2


BCFSTATUS, ZSTATUS, C

MOVLW0x0A; ИНАЧЕ ЗНАЧЕНИЯ РЕГИСТРОВ ОСТАВИТЬ БЕЗ ИЗМЕНЕНИЯ

SUBWFIND_2, WSTATUS, C

GOTO$+5STATUS, Z; ЕСЛИ ЗНАЧЕНИЕ IND_2 НЕ МЕНЬШЕ 0x0A$+3IND_2; В РЕГИСТР IND_2 ЗАПИСАТЬ РАЗНОСТЬ ЕГО СОДЕРЖИМОГО И

; 0x0AIND_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хВА.


;-

; СОХРАНЕНИЕ АККУМУЛЯТОРА И РЕГИСТРА STATUSSTATUS, RP0; ОПРЕДЕЛЕНИЕ ТЕКУЩЕГО БАНКАRP0_CLRSTATUS, RP0; УСТАНОВИТЬ БАНК 0W_TEMP; СОХРАНИТЬ АККУМУЛЯТОРSTATUS, WSTATUS_TEMP; СОХРАНИТЬ РЕГИСТР STATUSSTATUS_TEMP, 5; ВОССТАНОВИТЬ ЗНАЧЕНИЕ БИТА RP0$+4_CLRW_TEMP; СОХРАНИТЬ АККУМУЛЯТОР

SWAPFSTATUS, WSTATUS_TEMP; СОХРАНИТЬ РЕГИСТР STATUS

;-


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

Данная подпрограмма по состоянию флагов прерываний в регистрах PIR1 и INTCON определяет источник прерывания и осуществляет вызов соответствующей подпрограммы обработки.

Листинг подпрограммы приведен ниже.


;-

; ОПРЕДЕЛЕНИЕ ИСТОЧНИКА ПРЕРЫВАНИЯ

INT_SOURCESTATUS; ОЧИСТИТЬ РЕГИСТР STATUS

BTFSCPIR1, CCP1IF; ЕСЛИ ПРЕРЫВАНИЕ ОТ МОДУЛЯ CCP1CLOCK; ПЕРЕХОД НА ПОДПРОГРАММУ ЧАСОВ

PIR1, TMR2IF; ЕСЛИ ПРЕРЫВАНИЕ ОТ ТАЙМЕРА TMR2INT_TMR2; ПЕРЕХОД НА ПОДПРОГРАММУ ОБРАБОТЧИКА ПРЕРЫВАНИЙ ОТ

; TMR2

INTCON, INTF; ЕСЛИ ПРЕРЫВАНИЕ ПО ВХОДУ INTINT_INT; ПЕРЕХОД НА ПОДПРОГРАММУ ОБРАБОТЧИКА ПРЕРЫВАНИЙ ПО

; INT

INTCON, RBIF; ЕСЛИ ПРЕРЫВАНИЕ ПО ВХОДАМ <RB4:RB7>INT_RB; ПЕРЕХОД НА ПОДПРОГРАММУ ОБРАБОТЧИКА ПРЕРЫВАНИЙ ПО

; ВХОДАМ <RB4:RB7>PIR1, RCIF; ЕСЛИ ПРЕРЫВАНИЕ ОТ ПРИЕМНИКА USARTSERIAL_PRT; ПЕРЕХОД НА ПОДПРОГРАММУ ПРИЕМА/ПЕРЕДАЧИ

; ДАННЫХ ЧЕРЕЗ USARTEND_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; СЧЕТЧИК ДОСЧИТАЛ ДО 100x0ASTATUS, ZCURR_TIME; НЕТ - ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ

; ТЕКУЩЕГО ВРЕМЕНИ НА ИНДИКАЦИЮSEC_L; ДА - ОЧИСТИТЬ МЛАДШИЙ СЧЕТЧИК СЕКУНД

;-

; СЧЕТЧИК ДЕСЯТКОВ СЕКУНДSEC_H, F; ИНКРЕМЕНТИРОВАТЬ СТАРШИЙ СЧЕТЧИК СЕКУНДSTATUS, ZSEC_H, W; СЧЕТЧИК ДОСЧИТАЛ ДО 60x06STATUS, ZCURR_TIME; НЕТ - ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ

; ТЕКУЩЕГО ВРЕМЕНИ НА ИНДИКАЦИЮSEC_H; ДА - ОЧИСТИТЬ СТАРШИЙ СЧЕТЧИК СЕКУНД

;-

; СЧЕТЧИК ЕДИНИЦ МИНУТMIN_L, F; ИНКРЕМЕНТИРОВАТЬ МЛАДШИЙ СЧЕТЧИК МИНУТSTATUS, ZMIN_L, W; СЧЕТЧИК ДОСЧИТАЛ ДО 100x0ASTATUS, ZCURR_TIME; НЕТ - ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ

; ТЕКУЩЕГО ВРЕМЕНИ НА ИНДИКАЦИЮMIN_L; ДА - ОЧИСТИТЬ МЛАДШИЙ СЧЕТЧИК МИНУТ

;-

; СЧЕТЧИК ДЕСЯТКОВ МИНУТMIN_H, F; ИНКРЕМЕНТИРОВАТЬ СТАРШИЙ СЧЕТЧИК МИНУТSTATUS, ZMIN_H, W; СЧЕТЧИК ДОСЧИТАЛ ДО 6

XORLW0x06STATUS, Z

GOTOCURR_TIME; НЕТ - ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ

; ТЕКУЩЕГО ВРЕМЕНИ НА ИНДИКАЦИЮMIN_H; ДА - ОЧИСТИТЬ СТАРШИЙ СЧЕТЧИК МИНУТ

;-

; СЧЕТЧИКИ ЧАСОВHOUR_L, F; ИНКРЕМЕНТИРОВАТЬ МЛАДШИЙ СЧЕТЧИК ЧАСОВSTATUS, ZHOUR_H, W; СТАРШИЙ СЧЕТЧИК ДОСЧИТАЛ ДО 20x02STATUS, ZM3; НЕТ - ПЕРЕХОД НА ПРОВЕРКУ МЛАДШЕГО СЧЕТЧИКА

BCFSTATUS, ZHOUR_L, W0x04STATUS, ZM3STATUS, ZHOUR_L; ДА - ОЧИСТИТЬ МЛАДШИЙ СЧЕТЧИК ЧАСОВ

CLRFHOUR_HCURR_TIME; ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ

; ТЕКУЩЕГО ВРЕМЕНИ НА ИНДИКАЦИЮHOUR_L, W0x0A; СЧЕТЧИК ДОСЧИТАЛ ДО 10STATUS, ZCURR_TIME; НЕТ - ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ

; ТЕКУЩЕГО ВРЕМЕНИ НА ИНДИКАЦИЮHOUR_L; ДА - ОЧИСТИТЬ МЛАДШИЙ СЧЕТЧИК ЧАСОВHOUR_H; ИНКРЕМЕНТИРОВАТЬ СТАРШИЙ СЧЕТЧИК ЧАСОВ

;-_TIME; ПОДПРОГРАММА УПРАВЛЕНИЯ ВЫВОДОМ ТЕКУЩЕГО

; ВРЕМЕНИ НА ИНДИКАЦИЮ

;-

; ВКЛЮЧЕНИЕ/ВЫКЛЮЧЕНИЕ РЕЖИМА ПОДДЕРЖАНИЯ ТЕМПЕРАТУРЫ

BCFSTATUS, ZSTART_ML, WMIN_L, WSTATUS, ZM4

STATUS, ZSTART_MH, WMIN_H, WSTATUS, ZM4

STATUS, ZSTART_HL, WHOUR_L, WSTATUS, ZM4

STATUS, ZSTART_HH, WHOUR_H, WSTATUS, ZM4

FLAG_R1,0STATUS, ZSTOP_ML, WMIN_L, WSTATUS, ZM5

STATUS, ZSTOP_MH, WMIN_H, WSTATUS, ZM5

STATUS, ZSTOP_HL, WHOUR_L, WSTATUS, ZM5

STATUS, ZSTOP_HH, WHOUR_H, WSTATUS, ZM5

FLAG_R1,0

;-FLAG_R, 6; ВКЛЮЧЕН РЕЖИМ ОТОБРАЖЕНИЯ ТЕКУЩЕГО ВРЕМЕНИINT_SOURCE; НЕТ - ВЕРНУТЬСЯ К ПОИСКУ ИСТОЧНИКОВ ПРЕРЫВАНИЙ

; -

; ВКЛЮЧЕНИЕ/ВЫКЛЮЧЕНИЕ РАЗДЕЛЯЮЩЕЙ ТОЧКИPOINT, 2POINT, 1; ДЕЦИМАЛЬНАЯ ТОЧКА ВКЛЮЧЕНА$+3POINT, 1; ДА - ВЫКЛЮЧИТЬ ТОЧКУ$+2POINT, 1; НЕТ - ВКЛЮЧИТЬ ТОЧКУ

; -

MOVFMIN_L, WIND_0MIN_H, WIND_1HOUR_L, WIND_2HOUR_H, WIND_3

GOTOINT_SOURCE; НЕТ - ВЕРНУТЬСЯ К ПОИСКУ ИСТОЧНИКОВ ПРЕРЫВАНИЙ

;-


Подпрограмма обработки прерываний от таймера TMR2

Данная подпрограмма осуществляет опрос состояния кнопок «+1» и «-1» через промежутки времени, определяемые таймером TMR2. Если нажата и удерживается одна из кнопок «+1» и «-1», происходит инкрементирование или декрементирование соответствующих регистров с частотой прерываний от таймера TMR2. При кратковременном нажатии происходит однократное изменение значений регистров.

Если ни одна из кнопок «+1» и «-1» не нажата, то таймер TMR2 выключается.

Листинг подпрограммы приведен ниже.


;-_TMR2; ОБРАБОТЧИК ПРЕРЫВАНИЙ ОТ TMR2PIR1, TMR2IF; СБРОСИТЬ ФЛАГ ПРЕРЫВАНИЯ ОТ ТАЙМЕРА TMR2

BCFSTATUS, ZCOUNTER, WCOUNTSTATUS, Z; СЧЕТЧИК ЗАКОНЧИЛ СЧЕТ

GOTODOWN_BUTT; ДА - ПЕРЕХОД К ПРОВЕРКЕ СОСТОЯНИЙ КНОПОКCOUNTER, F; НЕТ - ИНКРЕМЕНТИРОВАНИЕ СЧЕТЧИКАINT_SOURCE; ВЕРНУТЬСЯ К ПОИСКУ ИСТОЧНИКОВ ПРЕРЫВАНИЙ

_BUTT; ПРОВЕРКА СОСТОЯНИЙ КНОПОК

; -FLAG_R, 0; РЕЖИМ УСТАНОВКИ ТЕМПЕРАТУРЫ ВКЛЮЧЕНSTART_TIME; НЕТ - ПЕРЕХОД К УСТАНОВКЕ ВРЕМЕНИ ВКЛЮЧЕНИЯ

PORTB, 6; НАЖАТА КНОПКА «+1»M6; НЕТ - ПЕРЕХОД К ПРОВЕРКЕ НАЖАТИЯ КНОПКИ «- 1»MAX_TL; ИНКРЕМЕНТИРОВАТЬ РЕГИСТР MAX_TL

MOVFMAX_TH, WMAX_THMAX_TH, FMAX_TH, F; ПРИБАВИТЬ К РЕГИСТРУ MAX_TH ФЛАГ ПЕРЕНОСА

STATUS, ZMAX_TL, WTEMP_MAXL; ЗНАЧЕНИЕ В MAX_TL ДОСТИГЛО TEMP_MAXL

BTFSSSTATUS, ZM6; НЕТ - ПЕРЕХОД К ПРОВЕРКЕ НАЖАТИЯ КНОПКИ «- 1»

BCFSTATUS, ZMAX_TH, WTEMP_MAXH; ЗНАЧЕНИЕ В MAX_TH ДОСТИГЛО TEMP_MAXH

BTFSSSTATUS, ZM6; НЕТ - ПЕРЕХОД К ПРОВЕРКЕ НАЖАТИЯ КНОПКИ «- 1»STATUS, ZMAX_TH; ДА - ОБНУЛИТЬ РЕГИСТРЫ MAX_TH И MAX_TL

CLRFMAX_TLCALL_BIN_DECPORTB, 7; НАЖАТА КНОПКА «- 1»

GOTOSTOP_TMR2; НЕТ - ПЕРЕХОД К ОСТАНОВКЕ TMR2MAX_TL; ДЕКРЕМЕНТИРОВАТЬ РЕГИСТР MAX_TLSTATUS, C; ЕСЛИ БЫЛ ЗАЕМMAX_TH, W; ДЕКРЕМЕНТИРОВАТЬ РЕГИСТР MAX_TH

BCFSTATUS, C

STATUS, Z

MOVFMAX_TL, F; ЗНАЧЕНИЕ В MAX_TL ДОСТИГЛО 0STATUS, ZSTOP_TMR2; НЕТ - ПЕРЕХОД К ОСТАНОВКЕ TMR2STATUS, ZMAX_TH, F; ЗНАЧЕНИЕ В MAX_TH ДОСТИГЛО 0STATUS, ZSTOP_TMR2; НЕТ - ПЕРЕХОД К ОСТАНОВКЕ TMR2

BCFSTATUS, ZTEMP_MAXLMAX_TLTEMP_MAXHMAX_TH

_BIN_DECMAX_TL, WTEMP_TLMAX_TH, WTEMP_TH

CALLBIN_DEC; ВЫЗОВ ПОДПРОГРАММЫ ДВОИЧНО-ДЕСЯТИЧНОЙ КОРРЕКЦИИ_TMR2T2CON, TMR2ON; ОСТАНОВКА ТАЙМЕРА TMR2INT_SOURCE; ВЕРНУТЬСЯ К ПОИСКУ ИСТОЧНИКОВ ПРЕРЫВАНИЙ

;-_TIME; УСТАНОВКА ВРЕМЕНИ ВКЛЮЧЕНИЯFLAG_R, 1; РЕЖИМ УСТАНОВКИ ВРЕМЕНИ ВКЛЮЧЕНИЯ ВКЛЮЧЕНSTOP_TIME; НЕТ - ПЕРЕХОД К УСТАНОВКЕ ВРЕМЕНИ ВЫКЛЮЧЕНИЯ

FLAG_R, 5; РЕЖИМ УСТАНОВКИ МИНУТ ВКЛЮЧЕНSET_HOUR; НЕТ - ПЕРЕХОД К УСТАНОВКЕ ЧАСОВ

PORTB, 6; НАЖАТА КНОПКА «+1»M7; НЕТ - ПЕРЕХОД К ПРОВЕРКЕ НАЖАТИЯ КНОПКИ «- 1»


;-

; СЧЕТЧИК ЕДИНИЦ МИНУТSTART_ML, F; ИНКРЕМЕНТИРОВАТЬ МЛАДШИЙ СЧЕТЧИК МИНУТSTATUS, ZSTART_ML, W; СЧЕТЧИК ДОСЧИТАЛ ДО 100x0ASTATUS, ZSET_REG_LCD; НЕТ - ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ

; ВРЕМЕНИ ВКЛЮЧЕНИЯ НА ИНДИКАЦИЮSTART_ML; ДА - ОЧИСТИТЬ МЛАДШИЙ СЧЕТЧИК МИНУТ

;-

; СЧЕТЧИК ДЕСЯТКОВ МИНУТSTART_MH, F; ИНКРЕМЕНТИРОВАТЬ СТАРШИЙ СЧЕТЧИК МИНУТSTATUS, ZSTART_MH, W; СЧЕТЧИК ДОСЧИТАЛ ДО 6

XORLW0x06STATUS, Z

GOTOSET_REG_LCD; НЕТ - ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ

; ТЕКУЩЕГО ВРЕМЕНИ НА ИНДИКАЦИЮSTART_MH; ДА - ОЧИСТИТЬ СТАРШИЙ СЧЕТЧИК МИНУТSET_REG_LCD; НЕТ - ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ

; ВРЕМЕНИ ВКЛЮЧЕНИЯ НА ИНДИКАЦИЮ

;-

PORTB, 7; НАЖАТА КНОПКА «- 1»STOP_TMR2_2; ПЕРЕХОД НА ПОДПРОГРАММУ ОСТАНОВКИ ТАЙМЕРА TMR2

;-

; СЧЕТЧИК ЕДИНИЦ МИНУТSTATUS, CSTART_ML, F; ДЕКРЕМЕНТИРОВАТЬ МЛАДШИЙ СЧЕТЧИК МИНУТSTATUS, C; ПРОИЗОШЕЛ ЗАЕМSET_REG_LCD; НЕТ - ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ

; ВРЕМЕНИ ВКЛЮЧЕНИЯ НА ИНДИКАЦИЮSTATUS, C0x09; ДА - ЗАГРУЗКА НАЧАЛЬНОГО ЗНАЧЕНИЯSTART_ML

;-

; СЧЕТЧИК ДЕСЯТКОВ МИНУТSTART_MH, F; ДЕКРЕМЕНТИРОВАТЬ СТАРШИЙ СЧЕТЧИК МИНУТSTATUS, C; ПРОИЗОШЕЛ ЗАЕМSET_REG_LCD; НЕТ - ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ

; ВРЕМЕНИ ВКЛЮЧЕНИЯ НА ИНДИКАЦИЮSTATUS, C0x05; ДА - ЗАПИСАТЬ НАЧАЛЬНОЕ ЗНАЧЕНИЕSTART_MHSET_REG_LCD; НЕТ - ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ

; ВРЕМЕНИ ВКЛЮЧЕНИЯ НА ИНДИКАЦИЮ

;-

FLAG_R, 4; РЕЖИМ УСТАНОВКИ ЧАСОВ ВКЛЮЧЕНSTOP_TMR2_2; ПЕРЕХОД НА ПОДПРОГРАММУ ОСТАНОВКИ ТАЙМЕРА TMR2

;-PORTB, 6; НАЖАТА КНОПКА «+1»M8; НЕТ - ПЕРЕХОД К ПРОВЕРКЕ НАЖАТИЯ КНОПКИ «- 1»

; СЧЕТЧИКИ ЧАСОВSTART_HL, F; ИНКРЕМЕНТИРОВАТЬ МЛАДШИЙ СЧЕТЧИК ЧАСОВSTATUS, ZSTART_HH, W; СТАРШИЙ СЧЕТЧИК ДОСЧИТАЛ ДО 20x02STATUS, ZM9; НЕТ - ПЕРЕХОД НА ПРОВЕРКУ МЛАДШЕГО СЧЕТЧИКА

BCFSTATUS, ZSTART_HL, W0x04STATUS, ZM9STATUS, ZSTART_HL; ДА - ОЧИСТИТЬ МЛАДШИЙ СЧЕТЧИК ЧАСОВ

CLRFSTART_HHSET_REG_LCD; ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ

; ТЕКУЩЕГО ВРЕМЕНИ НА ИНДИКАЦИЮSTART_HL, W0x0A; СЧЕТЧИК ДОСЧИТАЛ ДО 10STATUS, ZSET_REG_LCD; НЕТ - ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ

; ВРЕМЕНИ ВКЛЮЧЕНИЯ НА ИНДИКАЦИЮSTART_HL; ДА - ОЧИСТИТЬ МЛАДШИЙ СЧЕТЧИК ЧАСОВSTART_HH; ИНКРЕМЕНТИРОВАТЬ СТАРШИЙ СЧЕТЧИК ЧАСОВSET_REG_LCD; ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ

; ВРЕМЕНИ ВКЛЮЧЕНИЯ НА ИНДИКАЦИЮ

;-PORTB, 6; НАЖАТА КНОПКА «- 1»STOP_TMR2_2; ПЕРЕХОД НА ПОДПРОГРАММУ ОСТАНОВКИ ТАЙМЕРА TMR2


; СЧЕТЧИК ЕДИНИЦ ЧАСОВSTATUS, CSTART_HL, F; ДЕКРЕМЕНТИРОВАТЬ МЛАДШИЙ СЧЕТЧИК ЧАСОВSTATUS, C; ПРОИЗОШЕЛ ЗАЕМSET_REG_LCD; НЕТ - ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ

; ВРЕМЕНИ ВКЛЮЧЕНИЯ НА ИНДИКАЦИЮSTATUS, C0x09; ДА - ЗАГРУЗИТЬ НАЧАЛЬНОЕ ЗНАЧЕНИЕSTART_HL

;-

; СЧЕТЧИК ДЕСЯТКОВ ЧАСОВSTART_HH, F; ДЕКРЕМЕНТИРОВАТЬ СТАРШИЙ СЧЕТЧИК ЧАСОВSTATUS, C; ПРОИЗОШЕЛ ЗАЕМSET_REG_LCD; НЕТ - ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ

; ВРЕМЕНИ ВКЛЮЧЕНИЯ НА ИНДИКАЦИЮSTATUS, C0x02; ДА - ЗАГРУЗИТЬ НАЧАЛЬНЫЕ ЗНАЧЕНИЯ В СЧЕТЧИКИ

MOVWFSTART_HH0x04

MOVWFSTART_HLSET_REG_LCD; НЕТ - ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ

; ВРЕМЕНИ ВКЛЮЧЕНИЯ НА ИНДИКАЦИЮ

;-_TMR2_2T2CON, TMR2ON; ОСТАНОВКА ТАЙМЕРА TMR2

SET_REG_LCDSTART_ML, WIND_0START_MH, WIND_1START_HL, WIND_2START_HH, W

MOVWFIND_3POINT, 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, ZSTOP_ML, W; СЧЕТЧИК ДОСЧИТАЛ ДО 100x0ASTATUS, ZSET_REG_LCD1; НЕТ - ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ

; ВРЕМЕНИ ВЫКЛЮЧЕНИЯ НА ИНДИКАЦИЮSTOP_ML; ДА - ОЧИСТИТЬ МЛАДШИЙ СЧЕТЧИК МИНУТ

;-

; СЧЕТЧИК ДЕСЯТКОВ МИНУТSTOP_MH, F; ИНКРЕМЕНТИРОВАТЬ СТАРШИЙ СЧЕТЧИК МИНУТSTATUS, ZSTOP_MH, W; СЧЕТЧИК ДОСЧИТАЛ ДО 6

XORLW0x06STATUS, Z

GOTOSET_REG_LCD1; НЕТ - ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ

; ВРЕМЕНИ ВЫКЛЮЧЕНИЯ НА ИНДИКАЦИЮSTOP_MH; ДА - ОЧИСТИТЬ СТАРШИЙ СЧЕТЧИК МИНУТSET_REG_LCD1; ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ

; ВРЕМЕНИ ВЫКЛЮЧЕНИЯ НА ИНДИКАЦИЮ

;-

PORTB, 7; НАЖАТА КНОПКА «- 1»STOP_TMR2_3; ПЕРЕХОД НА ПОДПРОГРАММУ ОСТАНОВКИ ТАЙМЕРА TMR2

;-

; СЧЕТЧИК ЕДИНИЦ МИНУТSTATUS, CSTOP_ML, F; ДЕКРЕМЕНТИРОВАТЬ МЛАДШИЙ СЧЕТЧИК МИНУТSTATUS, C; ПРОИЗОШЕЛ ЗАЕМSET_REG_LCD1; НЕТ - ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ

; ВРЕМЕНИ ВЫКЛЮЧЕНИЯ НА ИНДИКАЦИЮSTATUS, C0x09; ДА - ЗАГРУЗКА НАЧАЛЬНОГО ЗНАЧЕНИЯSTOP_ML

;-

; СЧЕТЧИК ДЕСЯТКОВ МИНУТSTOP_MH, F; ДЕКРЕМЕНТИРОВАТЬ СТАРШИЙ СЧЕТЧИК МИНУТSTATUS, C; ПРОИЗОШЕЛ ЗАЕМSET_REG_LCD1; НЕТ - ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ

; ВРЕМЕНИ ВЫКЛЮЧЕНИЯ НА ИНДИКАЦИЮSTATUS, C0x05; ДА - ЗАПИСАТЬ НАЧАЛЬНОЕ ЗНАЧЕНИЕSTOP_MHSET_REG_LCD1; НЕТ - ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ

; ВРЕМЕНИ ВЫКЛЮЧЕНИЯ НА ИНДИКАЦИЮ

;-

FLAG_R, 4; РЕЖИМ УСТАНОВКИ ЧАСОВ ВКЛЮЧЕНSTOP_TMR2_3; ПЕРЕХОД НА ПОДПРОГРАММУ ОСТАНОВКИ ТАЙМЕРА TMR2

;-PORTB, 6; НАЖАТА КНОПКА «+1»M11; НЕТ - ПЕРЕХОД К ПРОВЕРКЕ НАЖАТИЯ КНОПКИ «- 1»


; СЧЕТЧИКИ ЧАСОВSTOP_HL, F; ИНКРЕМЕНТИРОВАТЬ МЛАДШИЙ СЧЕТЧИК ЧАСОВSTATUS, ZSTOP_HH, W; СТАРШИЙ СЧЕТЧИК ДОСЧИТАЛ ДО 20x02STATUS, ZM12; НЕТ - ПЕРЕХОД НА ПРОВЕРКУ МЛАДШЕГО СЧЕТЧИКА

BCFSTATUS, ZSTOP_HL, W0x04STATUS, ZM12STATUS, ZSTOP_HL; ДА - ОЧИСТИТЬ МЛАДШИЙ СЧЕТЧИК ЧАСОВ

CLRFSTOP_HHSET_REG_LCD1; НЕТ - ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ

; ВРЕМЕНИ ВЫКЛЮЧЕНИЯ НА ИНДИКАЦИЮSTOP_HL, W0x0A; СЧЕТЧИК ДОСЧИТАЛ ДО 10STATUS, ZSET_REG_LCD1; НЕТ - ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ

; ВРЕМЕНИ ВЫКЛЮЧЕНИЯ НА ИНДИКАЦИЮSTOP_HL; ДА - ОЧИСТИТЬ МЛАДШИЙ СЧЕТЧИК ЧАСОВSTOP_HH; ИНКРЕМЕНТИРОВАТЬ СТАРШИЙ СЧЕТЧИК ЧАСОВSET_REG_LCD1; ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ

; ВРЕМЕНИ ВЫКЛЮЧЕНИЯ НА ИНДИКАЦИЮ

;-PORTB, 6; НАЖАТА КНОПКА «- 1»STOP_TMR2_3; ПЕРЕХОД НА ПОДПРОГРАММУ ОСТАНОВКИ ТАЙМЕРА TMR2

; СЧЕТЧИК ЕДИНИЦ ЧАСОВSTATUS, CSTOP_HL, F; ДЕКРЕМЕНТИРОВАТЬ МЛАДШИЙ СЧЕТЧИК ЧАСОВSTATUS, C; ПРОИЗОШЕЛ ЗАЕМSET_REG_LCD1; НЕТ - ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ

; ВРЕМЕНИ ВЫКЛЮЧЕНИЯ НА ИНДИКАЦИЮSTATUS, C0x09; ДА - ЗАГРУЗИТЬ НАЧАЛЬНОЕ ЗНАЧЕНИЕSTOP_HL

;-

; СЧЕТЧИК ДЕСЯТКОВ ЧАСОВSTOP_HH, F; ДЕКРЕМЕНТИРОВАТЬ СТАРШИЙ СЧЕТЧИК ЧАСОВSTATUS, C; ПРОИЗОШЕЛ ЗАЕМSET_REG_LCD1; НЕТ - ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ

; ВРЕМЕНИ ВЫКЛЮЧЕНИЯ НА ИНДИКАЦИЮSTATUS, C0x02; ДА - ЗАГРУЗИТЬ НАЧАЛЬНЫЕ ЗНАЧЕНИЯ В СЧЕТЧИКИ

MOVWFSTOP_HH0x04

MOVWFSTOP_HLSET_REG_LCD1; НЕТ - ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ

; ВРЕМЕНИ ВЫКЛЮЧЕНИЯ НА ИНДИКАЦИЮ

;-_TMR2_3T2CON, TMR2ON; ОСТАНОВКА ТАЙМЕРА TMR2

SET_REG_LCD1STOP_ML, WIND_0STOP_MH, WIND_1STOP_HL, WIND_2STOP_HH, W

MOVWFIND_3POINT, 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, ZMIN_L, W; СЧЕТЧИК ДОСЧИТАЛ ДО 100x0ASTATUS, ZSET_REG_LCD2; НЕТ - ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ

; ТЕКУЩЕГО ВРЕМЕНИ НА ИНДИКАЦИЮMIN_L; ДА - ОЧИСТИТЬ МЛАДШИЙ СЧЕТЧИК МИНУТ

;-

; СЧЕТЧИК ДЕСЯТКОВ МИНУТMIN_H, F; ИНКРЕМЕНТИРОВАТЬ СТАРШИЙ СЧЕТЧИК МИНУТSTATUS, ZMIN_H, W; СЧЕТЧИК ДОСЧИТАЛ ДО 6

XORLW0x06STATUS, Z

GOTOSET_REG_LCD2; НЕТ - ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ

; ТЕКУЩЕГО ВРЕМЕНИ НА ИНДИКАЦИЮMIN_H; ДА - ОЧИСТИТЬ СТАРШИЙ СЧЕТЧИК МИНУТSET_REG_LCD2; НЕТ - ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ

; ТЕКУЩЕГО ВРЕМЕНИ НА ИНДИКАЦИЮ

;-

PORTB, 7; НАЖАТА КНОПКА «- 1»STOP_TMR2_4; ПЕРЕХОД НА ПОДПРОГРАММУ ОСТАНОВКИ ТАЙМЕРА TMR2

;-

; СЧЕТЧИК ЕДИНИЦ МИНУТSTATUS, CMIN_L, F; ДЕКРЕМЕНТИРОВАТЬ МЛАДШИЙ СЧЕТЧИК МИНУТSTATUS, C; ПРОИЗОШЕЛ ЗАЕМSET_REG_LCD2; НЕТ - ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ

; ТЕКУЩЕГО ВРЕМЕНИ НА ИНДИКАЦИЮSTATUS, C0x09; ДА - ЗАГРУЗКА НАЧАЛЬНОГО ЗНАЧЕНИЯMIN_L

;-

; СЧЕТЧИК ДЕСЯТКОВ МИНУТMIN_H, F; ДЕКРЕМЕНТИРОВАТЬ СТАРШИЙ СЧЕТЧИК МИНУТSTATUS, C; ПРОИЗОШЕЛ ЗАЕМSET_REG_LCD2; НЕТ - ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ

; ТЕКУЩЕГО ВРЕМЕНИ НА ИНДИКАЦИЮSTATUS, C0x05; ДА - ЗАПИСАТЬ НАЧАЛЬНОЕ ЗНАЧЕНИЕMIN_HSET_REG_LCD2; НЕТ - ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ

; ВЫВОДОМ ВРЕМЕНИ ВКЛЮЧЕНИЯ НА ИНДИКАЦИЮ

;-

FLAG_R, 4; РЕЖИМ УСТАНОВКИ ЧАСОВ ВКЛЮЧЕНSTOP_TMR2_4; ПЕРЕХОД НА ПОДПРОГРАММУ ОСТАНОВКИ ТАЙМЕРА TMR2

;-PORTB, 6; НАЖАТА КНОПКА «+1»M14; НЕТ - ПЕРЕХОД К ПРОВЕРКЕ НАЖАТИЯ КНОПКИ «- 1»

_HOUR

; СЧЕТЧИКИ ЧАСОВHOUR_L, F; ИНКРЕМЕНТИРОВАТЬ МЛАДШИЙ СЧЕТЧИК ЧАСОВSTATUS, ZHOUR_H, W; СТАРШИЙ СЧЕТЧИК ДОСЧИТАЛ ДО 20x02STATUS, ZM15; НЕТ - ПЕРЕХОД НА ПРОВЕРКУ МЛАДШЕГО СЧЕТЧИКА

BCFSTATUS, ZHOUR_L, W0x04STATUS, ZM15STATUS, ZHOUR_L; ДА - ОЧИСТИТЬ МЛАДШИЙ СЧЕТЧИК ЧАСОВ

CLRFHOUR_HSET_REG_LCD2; ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ

; ТЕКУЩЕГО ВРЕМЕНИ НА ИНДИКАЦИЮHOUR_L, W0x0A; СЧЕТЧИК ДОСЧИТАЛ ДО 10STATUS, ZSET_REG_LCD2; НЕТ - ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ

; ВЫВОДОМ ВРЕМЕНИ ВКЛЮЧЕНИЯ НА ИНДИКАЦИЮHOUR_L; ДА - ОЧИСТИТЬ МЛАДШИЙ СЧЕТЧИК ЧАСОВHOUR_H; ИНКРЕМЕНТИРОВАТЬ СТАРШИЙ СЧЕТЧИК ЧАСОВSET_REG_LCD2; НЕТ - ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ

; ВЫВОДОМ ВРЕМЕНИ ВКЛЮЧЕНИЯ НА ИНДИКАЦИЮ

;-PORTB, 6; НАЖАТА КНОПКА «- 1»SET_REG_LCD2; ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ

; ВРЕМЕНИ ВКЛЮЧЕНИЯ НА ИНДИКАЦИЮ

; СЧЕТЧИК ЕДИНИЦ ЧАСОВSTATUS, CHOUR_L, F; ДЕКРЕМЕНТИРОВАТЬ МЛАДШИЙ СЧЕТЧИК ЧАСОВSTATUS, C; ПРОИЗОШЕЛ ЗАЕМSET_REG_LCD2; НЕТ - ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ

; ВЫВОДОМ ВРЕМЕНИ ВКЛЮЧЕНИЯ НА ИНДИКАЦИЮSTATUS, C0x09; ДА - ЗАГРУЗИТЬ НАЧАЛЬНОЕ ЗНАЧЕНИЕHOUR_L

;-

; СЧЕТЧИК ДЕСЯТКОВ ЧАСОВHOUR_H, F; ДЕКРЕМЕНТИРОВАТЬ СТАРШИЙ СЧЕТЧИК ЧАСОВSTATUS, C; ПРОИЗОШЕЛ ЗАЕМSET_REG_LCD2; НЕТ - ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ

; ВЫВОДОМ ВРЕМЕНИ ВКЛЮЧЕНИЯ НА ИНДИКАЦИЮSTATUS, C0x02; ДА - ЗАГРУЗИТЬ НАЧАЛЬНЫЕ ЗНАЧЕНИЯ В СЧЕТЧИКИ

MOVWFHOUR_H0x04

MOVWFHOUR_LSET_REG_LCD2; НЕТ - ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ

; ВЫВОДОМ ВРЕМЕНИ ВКЛЮЧЕНИЯ НА ИНДИКАЦИЮ

;-_TMR2_4T2CON, TMR2ON; ОСТАНОВКА ТАЙМЕРА TMR2

SET_REG_LCD2MIN_L, WIND_0MIN_H, WIND_1HOUR_L, WIND_2HOUR_H, W

MOVWFIND_3POINT, 2; ВЫКЛЮЧИТЬ ТОЧКУ ВО 2-М РАЗРЯДЕPOINT, 1; ВКЛЮЧИТЬ ТОЧКУ В 1-М РАЗРЯДЕINT_SOURCE; ВЕРНУТЬСЯ К ПОИСКУ ИСТОЧНИКОВ ПРЕРЫВАНИЙ

;-


Подпрограмма обработки прерываний по входу INT

Данная подпрограмма проверяет нажатие кнопок выбора режима. При первом нажатии кнопки включается соответствующий режим и разрешаются прерывания по входам <RB4:RB7> от кнопок «Установка часов», «Установка минут», «+1» и «-1». При повторном нажатии этой же кнопки происходит выключение соответствующего режима, запрет прерываний по входам <RB4:RB7> и, при необходимости, производится запись установленных значений в EEPROM память данных.


;-

INT_INT; ОБРАБОТЧИК ПРЕРЫВАНИЙ ПО ВХОДУ INT

;-

BCFINTCON, INTF; СБРОСИТЬ ФЛАГ ПРЕРЫВАНИЯ ПО ВХОДУ INT

BTFSCPORTA, 2; НАЖАТА КНОПКА «УСТАНОВКА ТЕМПЕРАТУРЫ»

GOTOB_TIME_START; НЕТ - ПЕРЕХОД К ПРОВЕРКЕ НАЖАТИЯ КНОПКИ

; «УСТАНОВКА ВРЕМЕНИ ВКЛЮЧЕНИЯ»

BTFSSFLAG_R, 0; РЕЖИМ УСТАНОВКИ ТЕМПЕРАТУРЫ ВКЛЮЧЕН

GOTOSTART_UST_T; НЕТ - ПЕРЕХОД НА ПОДПРОГРАММУ ВКЛЮЧЕНИЯ РЕЖИМА

; УСТАНОВКИ ТЕМПЕРАТУРЫ

BCFFLAG_R, 0; ВЫКЛЮЧИТЬ РЕЖИМ УСТАНОВКИ ТЕМПЕРАТУРЫ

BSFFLAG_R, 6; ВКЛЮЧИТЬ РЕЖИМ ОТОБРАЖЕНИЯ ТЕКУЩЕГО ВРЕМЕНИ

BCFINTCON, RBIE; ЗАПРЕТИТЬ ПРЕРЫВАНИЯ ПО ВХОДАМ <RB4:RB7>

;-

; ЗАПИСЬ В EEPROM

BANC2

CLRFEEADR; УСТАНОВКА НАЧАЛЬНОГО АДРЕСА 00h


BANC3

BTFSCEECON1, WR; ПРОВЕРКА ОКОНЧАНИЯ ЗАПИСИ В EEPROM

GOTO$+1

BANC0

MOVFMAX_TL, W; ЧТЕНИЕ ДАННЫХ ИЗ РЕГИСТРА MAX_TL

BANC2

MOVWFEEDATA

BANC3

BCFEECON1, EEPGD; ЗАПИСЬ БУДЕТ ПРОИЗВОДИТЬСЯ В EEPROM

BSFEECON1, WREN; РАЗРЕШЕНИЕ ЗАПИСИ В EEPROM

MOVLW0x55EECON20xAAEECON2

BSFEECON1, WR; ИНИЦИАЛИЗАЦИЯ ЗАПИСИ

BCFEECON1, WREN; ЗАПРЕТ ЗАПИСИ ВEEPROM

BANC2

INCFEEADR, F; УВЕЛИЧИТЬ АДРЕС НА 1


BANC3

BTFSCEECON1, WR; ПРОВЕРКА ОКОНЧАНИЯ ЗАПИСИ В EEPROM

GOTO$+1

BANC0

MOVFMAX_TH, W; ЧТЕНИЕ ДАННЫХ ИЗ РЕГИСТРА MAX_TH

BANC2

MOVWFEEDATA

BANC3

BCFEECON1, EEPGD; ЗАПИСЬ БУДЕТ ПРОИЗВОДИТЬСЯ В EEPROM

BSFEECON1, WREN; РАЗРЕШЕНИЕ ЗАПИСИ В EEPROM

MOVLW0x55EECON20xAAEECON2

BSFEECON1, WR; ИНИЦИАЛИЗАЦИЯ ЗАПИСИ

BCFEECON1, WREN; ЗАПРЕТ ЗАПИСИ ВEEPROM

BANC0

GOTOINT_SOURCE; ВЕРНУТЬСЯ К ПОИСКУ ИСТОЧНИКОВ ПРЕРЫВАНИЙ


;-

START_UST_T; ПОДПРОГРАММА ВКЛЮЧЕНИЯ РЕЖИМА УСТАНОВКИ ТЕМПЕРАТУРЫ

MOVLWB'00000001'; ВКЛЮЧИТЬ РЕЖИМ УСТАНОВКИ ТЕМПЕРАТУРЫ

MOVWFFLAG_R; ОСТАЛЬНЫЕ ВЫКЛЮЧИТЬ

BSFINTCON, RBIE; РАЗРЕШИТЬ ПРЕРЫВАНИЯ ПО ВХОДАМ <RB4:RB7>

GOTOINT_SOURCE; ВЕРНУТЬСЯ К ПОИСКУ ИСТОЧНИКОВ ПРЕРЫВАНИЙ

;-

B_TIME_START; ПРОВЕРКА НАЖАТИЯ КНОПКИ «УСТАНОВКА ВРЕМЕНИ

; ВКЛЮЧЕНИЯ»

BTFSCPORTA, 2; НАЖАТА КНОПКА «УСТАНОВКА ВРЕМЕНИ ВКЛЮЧЕНИЯ»

GOTOB_TIME_STOP; НЕТ - ПЕРЕХОД К ПРОВЕРКЕ НАЖАТИЯ КНОПКИ

; «УСТАНОВКА ВРЕМЕНИ ВЫКЛЮЧЕНИЯ»

BTFSSFLAG_R, 1; РЕЖИМ УСТАНОВКИ ВРЕМЕНИ ВКЛЮЧЕНИЯ ВКЛЮЧЕН

GOTOSTART_UST_T_ST; НЕТ - ПЕРЕХОД НА ПОДПРОГРАММУ ВКЛЮЧЕНИЯ РЕЖИМА

; УСТАНОВКИ ВРЕМЕНИ ВКЛЮЧЕНИЯ

BCFFLAG_R, 1; ВЫКЛЮЧИТЬ РЕЖИМ УСТАНОВКИ ВРЕМЕНИ ВЫКЛЮЧЕНИЯ

BSFFLAG_R, 6; ВКЛЮЧИТЬ РЕЖИМ ОТОБРАЖЕНИЯ ТЕКУЩЕГО ВРЕМЕНИ

BCFINTCON, RBIE; ЗАПРЕТИТЬ ПРЕРЫВАНИЯ ПО ВХОДАМ <RB4:RB7>

;-

; ЗАПИСЬ В EEPROM

BANC2

MOVLW0x02

MOVWFEEADR; УСТАНОВКА НАЧАЛЬНОГО АДРЕСА 02h


BANC3

BTFSCEECON1, WR; ПРОВЕРКА ОКОНЧАНИЯ ЗАПИСИ В EEPROM

GOTO$+1

BANC0

MOVFSTART_ML, W; ЧТЕНИЕ ДАННЫХ ИЗ РЕГИСТРА START_ML

BANC2

MOVWFEEDATA

BANC3

BCFEECON1, EEPGD; ЗАПИСЬ БУДЕТ ПРОИЗВОДИТЬСЯ В EEPROM

BSFEECON1, WREN; РАЗРЕШЕНИЕ ЗАПИСИ В EEPROM

MOVLW0x55EECON20xAAEECON2

BSFEECON1, WR; ИНИЦИАЛИЗАЦИЯ ЗАПИСИ

BCFEECON1, WREN; ЗАПРЕТ ЗАПИСИ ВEEPROM

BANC2

INCFEEADR, F; УВЕЛИЧИТЬ АДРЕС НА 1


BANC3

BTFSCEECON1, WR; ПРОВЕРКА ОКОНЧАНИЯ ЗАПИСИ В EEPROM

GOTO$+1

BANC0

MOVFSTART_MH, W; ЧТЕНИЕ ДАННЫХ ИЗ РЕГИСТРА START_MH

BANC2

MOVWFEEDATA

BANC3

BCFEECON1, EEPGD; ЗАПИСЬ БУДЕТ ПРОИЗВОДИТЬСЯ В EEPROM

BSFEECON1, WREN; РАЗРЕШЕНИЕ ЗАПИСИ В EEPROM

MOVLW0x55EECON20xAAEECON2

BSFEECON1, WR; ИНИЦИАЛИЗАЦИЯ ЗАПИСИ

BCFEECON1, WREN; ЗАПРЕТ ЗАПИСИ ВEEPROM

BANC2

INCFEEADR, F; УВЕЛИЧИТЬ АДРЕС НА 1


BANC3

BTFSCEECON1, WR; ПРОВЕРКА ОКОНЧАНИЯ ЗАПИСИ В EEPROM

GOTO$+1

BANC0

MOVFSTART_HL, W; ЧТЕНИЕ ДАННЫХ ИЗ РЕГИСТРА START_HL

BANC2

MOVWFEEDATA

BANC3

BCFEECON1, EEPGD; ЗАПИСЬ БУДЕТ ПРОИЗВОДИТЬСЯ В EEPROM

BSFEECON1, WREN; РАЗРЕШЕНИЕ ЗАПИСИ В EEPROM

MOVLW0x55EECON20xAAEECON2

BSFEECON1, WR; ИНИЦИАЛИЗАЦИЯ ЗАПИСИ

BCFEECON1, WREN; ЗАПРЕТ ЗАПИСИ ВEEPROM

BANC2

INCFEEADR, F; УВЕЛИЧИТЬ АДРЕС НА 1


BANC3

BTFSCEECON1, WR; ПРОВЕРКА ОКОНЧАНИЯ ЗАПИСИ В EEPROM

GOTO$+1

BANC0

MOVFSTART_HH, W; ЧТЕНИЕ ДАННЫХ ИЗ РЕГИСТРА START_HH

BANC2

MOVWFEEDATA

BANC3

BCFEECON1, EEPGD; ЗАПИСЬ БУДЕТ ПРОИЗВОДИТЬСЯ В EEPROM

BSFEECON1, WREN; РАЗРЕШЕНИЕ ЗАПИСИ В EEPROM

MOVLW0x55EECON20xAAEECON2

BSFEECON1, WR; ИНИЦИАЛИЗАЦИЯ ЗАПИСИ

BCFEECON1, WREN; ЗАПРЕТ ЗАПИСИ ВEEPROM


BANC0

GOTOINT_SOURCE; ВЕРНУТЬСЯ К ПОИСКУ ИСТОЧНИКОВ ПРЕРЫВАНИЙ


;-

START_UST_T_ST; ПОДПРОГРАММА ВКЛЮЧЕНИЯ РЕЖИМА УСТАНОВКИ ВРЕМЕНИ ВКЛЮЧЕНИЯ

MOVLWB'00000010'; ВКЛЮЧИТЬ РЕЖИМ УСТАНОВКИ ВРЕМЕНИ ВКЛЮЧЕНИЯ

MOVWFFLAG_R; ОСТАЛЬНЫЕ ВЫКЛЮЧИТЬ

BSFINTCON, RBIE; РАЗРЕШИТЬ ПРЕРЫВАНИЯ ПО ВХОДАМ <RB4:RB7>

GOTOINT_SOURCE; ВЕРНУТЬСЯ К ПОИСКУ ИСТОЧНИКОВ ПРЕРЫВАНИЙ

;-

B_TIME_STOP; ПРОВЕРКА НАЖАТИЯ КНОПКИ «УСТАНОВКА ВРЕМЕНИ

; ВЫКЛЮЧЕНИЯ»

BTFSCPORTA, 3; НАЖАТА КНОПКА «УСТАНОВКА ВРЕМЕНИ ВЫКЛЮЧЕНИЯ»

GOTOB_TIME_CURR; НЕТ - ПЕРЕХОД К ПРОВЕРКЕ НАЖАТИЯ КНОПКИ

; «УСТАНОВКА ТЕКУЩЕГО ВРЕМЕНИ»

BTFSSFLAG_R, 2; РЕЖИМ УСТАНОВКИ ВРЕМЕНИ ВЫКЛЮЧЕНИЯ ВКЛЮЧЕН

GOTOSTART_UST_T_SP; НЕТ - ПЕРЕХОД НА ПОДПРОГРАММУ ВКЛЮЧЕНИЯ РЕЖИМА

; УСТАНОВКИ ВРЕМЕНИ ВЫКЛЮЧЕНИЯ

BCFFLAG_R, 2; ВЫКЛЮЧИТЬ РЕЖИМ УСТАНОВКИ ВРЕМЕНИ ВЫКЛЮЧЕНИЯ

BSFFLAG_R, 6; ВКЛЮЧИТЬ РЕЖИМ ОТОБРАЖЕНИЯ ТЕКУЩЕГО ВРЕМЕНИ

BCFINTCON, RBIE; ЗАПРЕТИТЬ ПРЕРЫВАНИЯ ПО ВХОДАМ <RB4:RB7>

;-

; ЗАПИСЬ В EEPROM

BANC2

MOVLW0x06

MOVWFEEADR; УСТАНОВКА НАЧАЛЬНОГО АДРЕСА 06h


BANC3

BTFSCEECON1, WR; ПРОВЕРКА ОКОНЧАНИЯ ЗАПИСИ В EEPROM

GOTO$+1

BANC0

MOVFSTOP_ML, W; ЧТЕНИЕ ДАННЫХ ИЗ РЕГИСТРА STOP_ML

BANC2

MOVWFEEDATA

BANC3

BCFEECON1, EEPGD; ЗАПИСЬ БУДЕТ ПРОИЗВОДИТЬСЯ В EEPROM

BSFEECON1, WREN; РАЗРЕШЕНИЕ ЗАПИСИ В EEPROM

MOVLW0x55EECON20xAAEECON2

BSFEECON1, WR; ИНИЦИАЛИЗАЦИЯ ЗАПИСИ

BCFEECON1, WREN; ЗАПРЕТ ЗАПИСИ ВEEPROM

BANC2

INCFEEADR, F; УВЕЛИЧИТЬ АДРЕС НА 1


BANC3

BTFSCEECON1, WR; ПРОВЕРКА ОКОНЧАНИЯ ЗАПИСИ В EEPROM

GOTO$+1

BANC0

MOVFSTOP_MH, W; ЧТЕНИЕ ДАННЫХ ИЗ РЕГИСТРА STOP_MH

BANC2

MOVWFEEDATA

BANC3

BCFEECON1, EEPGD; ЗАПИСЬ БУДЕТ ПРОИЗВОДИТЬСЯ В EEPROM

BSFEECON1, WREN; РАЗРЕШЕНИЕ ЗАПИСИ В EEPROM

MOVLW0x55EECON20xAAEECON2

BSFEECON1, WR; ИНИЦИАЛИЗАЦИЯ ЗАПИСИ

BCFEECON1, WREN; ЗАПРЕТ ЗАПИСИ ВEEPROM

BANC2

INCFEEADR, F; УВЕЛИЧИТЬ АДРЕС НА 1


BANC3

BTFSCEECON1, WR; ПРОВЕРКА ОКОНЧАНИЯ ЗАПИСИ В EEPROM

GOTO$+1

BANC0

MOVFSTOP_HL, W; ЧТЕНИЕ ДАННЫХ ИЗ РЕГИСТРА STOP_HL

BANC2

MOVWFEEDATA

BANC3

BCFEECON1, EEPGD; ЗАПИСЬ БУДЕТ ПРОИЗВОДИТЬСЯ В EEPROM

BSFEECON1, WREN; РАЗРЕШЕНИЕ ЗАПИСИ В EEPROM

MOVLW0x55EECON20xAAEECON2

BSFEECON1, WR; ИНИЦИАЛИЗАЦИЯ ЗАПИСИ

BCFEECON1, WREN; ЗАПРЕТ ЗАПИСИ ВEEPROM

BANC2

INCFEEADR, F; УВЕЛИЧИТЬ АДРЕС НА 1


BANC3

BTFSCEECON1, WR; ПРОВЕРКА ОКОНЧАНИЯ ЗАПИСИ В EEPROM

GOTO$+1

BANC0

MOVFSTOP_HH, W; ЧТЕНИЕ ДАННЫХ ИЗ РЕГИСТРА STOP_HH

BANC2

MOVWFEEDATA

BANC3

BCFEECON1, EEPGD; ЗАПИСЬ БУДЕТ ПРОИЗВОДИТЬСЯ В EEPROM

BSFEECON1, WREN; РАЗРЕШЕНИЕ ЗАПИСИ В EEPROM

MOVLW0x55EECON20xAAEECON2

BSFEECON1, WR; ИНИЦИАЛИЗАЦИЯ ЗАПИСИ

BCFEECON1, WREN; ЗАПРЕТ ЗАПИСИ ВEEPROM


BANC0

GOTOINT_SOURCE; ВЕРНУТЬСЯ К ПОИСКУ ИСТОЧНИКОВ ПРЕРЫВАНИЙ


;-

START_UST_T_SP; ПОДПРОГРАММА ВКЛЮЧЕНИЯ РЕЖИМА УСТАНОВКИ ВРЕМЕНИ

; ВЫКЛЮЧЕНИЯ

MOVLWB'00000100'; ВКЛЮЧИТЬ РЕЖИМ УСТАНОВКИ ВРЕМЕНИ ВЫКЛЮЧЕНИЯ

MOVWFFLAG_R; ОСТАЛЬНЫЕ ВЫКЛЮЧИТЬ

BSFINTCON, RBIE; РАЗРЕШИТЬ ПРЕРЫВАНИЯ ПО ВХОДАМ <RB4:RB7>

GOTOINT_SOURCE; ВЕРНУТЬСЯ К ПОИСКУ ИСТОЧНИКОВ ПРЕРЫВАНИЙ

;-

B_TIME_CURR; ПРОВЕРКА НАЖАТИЯ КНОПКИ «УСТАНОВКА ТЕКУЩЕГО

; ВРЕМЕНИ»

BTFSCPORTA, 4; НАЖАТА КНОПКА «УСТАНОВКА ТЕКУЩЕГО ВРЕМЕНИ»

GOTOINT_SOURCE; ВЕРНУТЬСЯ К ПОИСКУ ИСТОЧНИКОВ ПРЕРЫВАНИЙ

BTFSSFLAG_R, 3; РЕЖИМ УСТАНОВКИ ТЕКУЩЕГО ВРЕМЕНИ ВКЛЮЧЕН

GOTOSTART_UST_T_CUR; НЕТ - ПЕРЕХОД НА ПОДПРОГРАММУ ВКЛЮЧЕНИЯ РЕЖИМА

; УСТАНОВКИ ТЕКУЩЕГО ВРЕМЕНИ

BCFFLAG_R, 3; ВЫКЛЮЧИТЬ РЕЖИМ УСТАНОВКИ ТЕКУЩЕГО ВРЕМЕНИ

BSFFLAG_R, 6; ВКЛЮЧИТЬ РЕЖИМ ОТОБРАЖЕНИЯ ТЕКУЩЕГО ВРЕМЕНИ

MOVLWB'00001011'; ВКЛЮЧИТЬ МОДУЛЬ CCP1

MOVWFCCP1CON

BCFINTCON, RBIE; ЗАПРЕТИТЬ ПРЕРЫВАНИЯ ПО ВХОДАМ <RB4:RB7>


;-

START_UST_T_CUR; ПОДПРОГРАММА ВКЛЮЧЕНИЯ РЕЖИМА УСТАНОВКИ ТЕКУЩЕГО ВРЕМЕНИ

CLRFCCP1CON; ВЫКЛЮЧИТЬ МОДУЛЬ CCP1

MOVLWB'00001000'; ВКЛЮЧИТЬ РЕЖИМ УСТАНОВКИ ТЕКУЩЕГО ВРЕМЕНИ

MOVWFFLAG_R; ОСТАЛЬНЫЕ ВЫКЛЮЧИТЬ

CLRFSEC_L; ОЧИСТИТЬ СЧЕТЧИКИ СЕКУНД

CLRFSEC_H

BSFINTCON, RBIE; РАЗРЕШИТЬ ПРЕРЫВАНИЯ ПО ВХОДАМ <RB4:RB7>

GOTOINT_SOURCE; ВЕРНУТЬСЯ К ПОИСКУ ИСТОЧНИКОВ ПРЕРЫВАНИЙ

;-


Подпрограмма обработки прерываний по входам <RB4:RB7>

Данная подпрограмма проверяет нажатие кнопок «Установка часов», «Установка минут», «+1» и «-1». Если нажата кнопка «+1» или «-1», происходит запуск таймера TMR2 и переход к установке соответствующей величины (температуры, времени включения, времени выключения, текущего времени). Если же обе кнопки отпущены, происходит остановка таймера TMR2. Нажатие кнопок «Установка часов» и «Установка минут» приводит к включению соответствующего режима.

Листинг подпрограммы приведен ниже.


;-_RB; ОБРАБОТЧИК ПРЕРЫВАНИЙ ПО ВХОДАМ <RB4:RB7>INTCON, RBIF; СБРОСИТЬ ФЛАГ ПРЕРЫВАНИЯ ПО ВХОДАМ <RB4:RB7>PORTB, 5; НАЖАТА КНОПКА «УСТАНОВКА МИНУТ»$+4FLAG_R, 5; ДА - ВКЛЮЧИТЬ РЕЖИМ УСТАНОВКИ МИНУТFLAG_R, 4; ВЫКЛЮЧИТЬ РЕЖИМ УСТАНОВКИ ЧАСОВ$+5PORTB, 4; НАЖАТА КНОПКА «УСТАНОВКА ЧАСОВ»$+3FLAG_R, 4; ДА - ВКЛЮЧИТЬ РЕЖИМ УСТАНОВКИ ЧАСОВFLAG_R, 5; ВЫКЛЮЧИТЬ РЕЖИМ УСТАНОВКИ МИНУТ

PORTB, 6; НАЖАТА КНОПКА «+1»$+2$+3PORTB, 7$+3T2CON, TMR2ON; ЗАПУСК ТАЙМЕРА TMR2DOWN_BUTT; ПЕРЕХОД НА ПРОВЕРКУ СОСТОЯНИЙ КНОПОКT2CON, TMR2ON; ОСТАНОВКА ТАЙМЕРА TMR2COUNTERINT_SOURCE; ВЕРНУТЬСЯ К ПОИСКУ ИСТОЧНИКОВ ПРЕРЫВАНИЙ

;-

Подпрограмма приема / передачи данных через USART

Данная подпрограмма проверяет данные, записанные в буфер приемника USART, и, если они соответствуют коду запроса чтения EEPROM (константа CONST_COD), читает данные из EEPROM, а затем осуществляет передачу этих данных во внешнее устройство, используя модуль USART.


;-_PRT; ПОДПРОГРАММА ПРИЕМА/ПЕРЕДАЧИ ДАННЫХ ЧЕРЕЗ USARTPIE1, RCIE; ЗАПРЕТИТЬ ПРЕРЫВАНИЯ ОТ ПРИЕМНИКА USART

;-

; ПРОВЕРКА НА ОТСУТСТВИЕ ОШИБОК КАДРАRCSTA, OERR; ПРОИЗОШЛА ОШИБКА КАДРА$+3; НЕТ - ПЕРЕХОД К ИДЕНТИФИКАЦИИ КОДА ЗАПРОСА

; ПЕРЕДАЧИ ДАННЫХRCSTA, OERR; СБРОСИТЬ ФЛАГ ОШИБКИ КАДРАINT_SOURCE; ВЕРНУТЬСЯ К ПОИСКУ ИСТОЧНИКОВ ПРЕРЫВАНИЙ

;-

; ИДЕНТИФИКАЦИЯ КОДА ЗАПРОСА ПЕРЕДАЧИ ДАННЫХSTATUS, ZRCREG, W; ЧТЕНИЕ ДАННЫХ ИЗ БУФЕРА ПРИЕМНИКАPIR1, RCIF; СБРОСИТЬ ФЛАГ ПРЕРЫВАНИЯ ОТ ПРИЕМНИКА USARTCONST_COD; СРАВНИТЬ КОДSTATUS, Z; КОД ВЕРНЫЙINT_SOURCE; ВЕРНУТЬСЯ К ПОИСКУ ИСТОЧНИКОВ ПРЕРЫВАНИЙ


;-

; ЧТЕНИЕ ДАННЫХ ИЗ EEPROM И ПЕРЕДАЧА ЧЕРЕЗ USARTEEADR; ОЧИСТИТЬ РЕГИСТР АДРЕСАEECON1, EEPGD; УСТАНОВИТЬ ЧТЕНИЕ ИЗ EEPROMEECON1, RD; НАЧАТЬ ЧТЕНИЕEEDATA, W; ПРОЧИТАТЬ РЕГИСТР ДАННЫХTXREG; ПОМЕСТИТЬ СОДЕРЖИМОЕ ТЕКУЩЕЙ ЯЧЕЙКИ ПАМЯТИ

; В БУФЕР ПЕРЕДАТЧИКАTXSTA, TXEN; РАЗРЕШИТЬ ПЕРЕДАЧУEEADR, F; УВЕЛИЧИТЬ НА 1 АДРЕС ТЕКУЩЕЙ ЯЧЕЙКИ ПАМЯТИ

MOVFEEADR, W0x0A

BTFSCPIR1, TXIF; ОЖИДАТЬ ОКОНЧАНИЕ ПЕРЕДАЧИ

GOTO$-1STATUS, ZREAD

GOTOINT_SOURCE; ВЕРНУТЬСЯ К ПОИСКУ ИСТОЧНИКОВ ПРЕРЫВАНИЙ


;-


Подпрограмма восстановления контекста

Данная подпрограмма осуществляет восстановление содержимого аккумулятора и регистра STATUS перед выходом из обработчиков прерываний.

Листинг программы приведен ниже.


;-_INT; ВОССТАНОВЛЕНИЕ АККУМУЛЯТОРА И РЕГИСТРА STATUSPIE1, RCIE; РАЗРЕШИТЬ ПРЕРЫВАНИЯ ОТ ПРИЕМНИКА USART

BANC0STATUS_TEMP, W; ВОССТАНОВИТЬ РЕГИСТР STATUS

MOVWFSTATUSSTATUS, RP0; ОПРЕДЕЛЕНИЕ ТЕКУЩЕГО БАНКА

GOTOREST_WREGSTATUS, RP0; ВЫБОР БАНКА 0W_TEMP, F; ВОССТАНОВИТЬ АККУМУЛЯТОР

SWAPFW_TEMP, WSTATUS, RP0; ВЫБОР БАНКА 1_WREGW_TEMP, F; ВОССТАНОВИТЬ АККУМУЛЯТОРW_TEMP, W

RETURN; ВЕРНУТЬСЯ ИЗ ПРЕРЫВАНИЯ

;-


3. Расчет электрических параметров МПС


Рассчитаем мощность, потребляемую микроконтроллером:


;

программа микропроцессорный управление датчик

где - напряжение относительно ;

- максимальный ток вывода ;

- выходное напряжение высокого уровня;

- ток I/O канала;

- выходное напряжение низкого уровня;

- ток I/O канала.

Рассчитаем мощность, рассеиваемую всеми резисторами схемы:


;


где - напряжение на i-м резисторе;

- сопротивление i-го резистора.

;

Рассчитаем мощность, рассеиваемую светодиодами:


;


где - напряжение на i-м светодиоде;

- ток в i-м светодиоде.

;

Рассчитаем мощность, рассеиваемую светодиодными индикаторами:


;


где - напряжение на i-м индикаторе;

- ток в i-м индикаторе.

Ток определяется суммой токов всех сегментов, .

;

Токи, потребляемые микросхемами, приведены в таблице 3.


Таблица 3 - Токи, потребляемые микросхемами

Напряжение питания, ВМикросхемаПотребляемый ток, мАОбозначениеНаименование+15DA2AD21050Итого50+5DD1К155ЛН133DD2PIC16F87343DD3MAX6958150DD4MXL1543150DA1АОТ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


Введение Микропроцессорные и информационно-управляющие системы, в настоящее время, стали одним из наиболее дешевых и быстрых способов обработки информаци

Больше работ по теме:

КОНТАКТНЫЙ EMAIL: [email protected]

Скачать реферат © 2019 | Пользовательское соглашение

Скачать      Реферат

ПРОФЕССИОНАЛЬНАЯ ПОМОЩЬ СТУДЕНТАМ