Если не предполагается восстановление всех параметров работы после пропадания/появления питания и максимальный период отсчета времени не нужен более 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-х бит).
|