реклама на сайте
подробности

 
 
> Отслеживание нескольких событий по времени
SZ0
сообщение Mar 11 2009, 19:40
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 326
Регистрация: 14-02-06
Пользователь №: 14 331



Не могу сообразить, как правильнее распределить программные ресурсы
(структурировать программу) при следующей задаче:

Есть микроконтроллер, он управляет несколькими выходами. Их работа зависит
от состояние клавиш и времени. Т.е. при нажатии той или иной клавиши выход
переключается в заданное состояние и может запускаться отчёт по времени, по
прошествии которого выход изменит своё состояние. Или же выход может
срабатывать в зависимости от выставленного будильника по RTC.

В прерывания хочу вынести отчёт времени, периодическое чтение RTC и естественно
опрос клавиш.

А как правильнее проводить сравение выставленных будильников с RTC? В основной
части программы или по периодическим прерываниям (например раз в 1 сек) и
выставляя флаги сработки реагировать в основной части программы?

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

Как можно обеспечить нахождение в режиме программирования устройства
(выставление) пользователем условий сработки для одного выхода и при этом
чтобы одновременно продолжалась работа и управление другими выходами?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
rezident
сообщение Mar 11 2009, 20:19
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Если не предполагается восстановление всех параметров работы после пропадания/появления питания и максимальный период отсчета времени не нужен более 1,5 месяцев, то для данной задачи RTC вообще не нужен. А нужен всего один таймер, работающий от кварцованной частоты и настроенный так, чтобы генерировать прерывания с периодом, с минимально требуемым разрешением. В АСУ и ТП редко когда требуются воздействия с длительностью менее 100мс. Но можно сделать период генерации прерываний даже 10мс или 1 мс. В прерывании от таймера нужно какую-то глобальную беззнаковую 32-х битную переменную целого типа инкрементировать на число равное периоду в единицах мс. Т.е. если период прерываний будет 100мс, то в каждом прерывании от таймера увеличиваем переменную счетчика тиков на число 100, при периоде 10мс - на число 10 и т.п. Таким образом в этой переменной будет храниться относительное время в единицах мс с периодом переполнения примерно 0xFFFFFFFF/(1000мс*60с*60мин*24ч*30дн)=1,65 месяца.
В main-е в "вечном цикле" пускай "крутится" две основные задачи, которые выполняются поочередно.
1. HUI (интерфейс пользователя)
2. управление выходами.
Первая задача обеспечивает взаимодействие с клавиатурой и дисплеем, а также редактирование значений переменных, определяющих параметры управления выходами (описание функций выходов). Клавиатуры и дисплея может и не быть, а все параметры могут загружаться через какой-либо интерфейс. Это не суть важно.
Вторая задача, в соответствии с описанием функций каждого выхода (нормально замкнут, нормально разомкнут, время на которое выход должен быть включен и т.п.) управляет ими. Для отсчета интервалов времени должна иметься для каждого выхода своя переменная "временнОй засечки" той же рамерности, что и переменная "миллисекундных тиков". Берем беззнаковую разность между значением глобальной переменной миллисекундных тиков и временной засечки и сравниваем с переменной из описания конкретного выхода. Если разность меньше, то переходим к следующему выходу. Если же разность "больше или равно", то выполняем действие с выходом в соответствии с его описанием (включить/выключить) и запоминаем новое значение "временнОй засечки" для данного выхода.
Это все, что требуется для данной задачи. Описание функций выходов нужно хранить в энергонезависимой памяти (EEPROM внутренней или внешней или во Flash). Если же нужно, чтобы прибор продолжал функционировать с отсчетом всех временных интервалов даже и при пропадании питания, либо нужны временные интервалы более 1,5 месяцев, только тогда нужна м/с RTC с резервным питанием.
Забыл еще уточнить, что обе основные задачи "общаются" через область глобальных переменных, в которые загружаются из энергонезависимой памяти при включении прибора описания функций выходов.
И второй момент. При считывании значения переменной миллисекундных тиков нужно специальными методами обеспечить атомарность доступа к ней, если архитектура МК не обеспечивает этого условия (разрядность МК меньше 32-х бит).
Go to the top of the page
 
+Quote Post
SZ0
сообщение Mar 11 2009, 21:02
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 326
Регистрация: 14-02-06
Пользователь №: 14 331



Благодарю за столь развёрнутый ответ!

Делал систему, когда пользователь всё программирует и только потом происходит запуск. Но здесь пока не знаю как правильно "выкрутиться" с одновременным программированием и продолжением работы. Наверное нужно запоминать номер меню/блока который обрабатывается в режиме программирования, и при каждом последовательном проходе заходить в него и выполнять соответствующие действия пользователся?
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 19:09
Рейтинг@Mail.ru


Страница сгенерированна за 0.01398 секунд с 7
ELECTRONIX ©2004-2016