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

 
 
> Отслеживание нескольких событий по времени
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
Ответов
Vavan4ik
сообщение Mar 24 2009, 07:23
Сообщение #2





Группа: Участник
Сообщений: 13
Регистрация: 23-12-08
Из: Украина, Днепропетровск
Пользователь №: 42 690



Спасибо мужики за тему, я тоже сейчас борюсь с временными интервалами от несколько секунд до 24 часов, причем одновременно нужно и отображать, и расчитывать, и опрашивать, и выводить, уже хотел спрашивать про многозадачность, но идея с большой переменной очень клевая, только вот нужно придумать чтобы ее обнулять безболезненно, чтобы не получилось переполнения (в случае если устройство будет включено более времени переполнения).
Спасибо!
Go to the top of the page
 
+Quote Post
rezident
сообщение Mar 24 2009, 18:28
Сообщение #3


Гуру
******

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



Цитата(Vavan4ik @ Mar 24 2009, 12:23) *
только вот нужно придумать чтобы ее обнулять безболезненно, чтобы не получилось переполнения (в случае если устройство будет включено более времени переполнения).
Вы видимо не поняли сути, раз опасаетесь переполнения и собираетесь принудительно обнулять переменную. cranky.gif Я же не зря выделял слова про беззнаковую разность. Допустим, что переменная "системных тиков" 8-ми разрядная и изменяется на 1 каждую секунду. С помощью такой переменной можно отмерить интервал времени 4 с четвертью минуты. Допустим нам нужно отмерить 10 секунд, а текущее значение переменной "тиков" timeTick равно 250. Запомним это значение во временной статической переменной. С первого взгляда может показаться что возникнет ошибка, ведь 250+10=260 и превышает разрядность выбранной переменной (255 max). Но в этом нет ничего страшного! Мы ведь берем беззнаковую разность. А при таком счислении условие типа
Код
if ((timeTick-time)>=10)

будет истинно тогда, когда значение переменной timeTick достигнет значения 4. Т.е. при беззнаковом вычитании 8-ми разрядных переменных 4-250=10. Проверяем действительно ли 10 секунд? Счетчик timeTick принимает последовательно такие значения
0 - 250 <<--- исходное значение, от которого начинаем отсчет/сравнение
1 - 251
2 - 252
3 - 253
4 - 254
5 - 255
6 - 0 <<--- вот это "естественное" переполнение, которого вы почему-то боитесь smile.gif
7 - 1
8 - 2
9 - 3
10 - 4
Видим, что интервал между 250 и 4 действительно из 10 отсчетов состоит, а каждый отсчет у нас по условию это 1 секунда. 10*1 сек=10 секунд, хоть при этом произошло совсем не опасное переполнение счетчика. smile.gif
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 24th July 2025 - 02:01
Рейтинг@Mail.ru


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