|
Как правильно организовать архитектуру программы?, Архитектура для часов |
|
|
|
Aug 3 2015, 17:50
|
Группа: Участник
Сообщений: 9
Регистрация: 28-07-15
Пользователь №: 87 751

|
Как правильно организовать архитектуру программы для часов? Часы должны показывать время дату и температуру, по очереди с определённой задержкой. Как организовать настройку времени? Контроллер: Mega8; IDE: Atmel Studio.
|
|
|
|
|
Aug 4 2015, 11:00
|
практикующий тех. волшебник
    
Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417

|
Цитата(Maxi_Man @ Aug 3 2015, 20:50)  Как правильно организовать архитектуру программы для часов?..настройку времени?.. Архитектура программы под МК, как правило лучше делать придерживаясь ОО подхода. на "нижнем уровне" - ярко выраженная зависимость от периферии и тех действий которые требуются делать с этой периферией. Иногда этот слой обзывают "драйвера". Если задача не крупная - то над этим слоем достаточно одного цикла с не большим кол-вом специфики. Если есть пользовательский интерфейс, протоколы верхнего уровня и иже - то код уже группируется по логическим сущностям, с требуемым к ним программным интерфейсам. В принципе этот слой уже ничем не отличается от стандартного подхода ООА и ООП. При программировании выбираете необходимый язык, от этого принципиально ничего меняться не должно. при настройке времени вы даёте пользователю как то ввести необходимые значения, при этом обозначая режим коррекции значений часов. К примеру можно мигать тем разрядом, на который сейчас воздействуют кнопки вверх-вниз.
|
|
|
|
|
Aug 4 2015, 11:37
|

Местный
  
Группа: Участник
Сообщений: 329
Регистрация: 23-04-14
Пользователь №: 81 502

|
Цитата(Maxi_Man @ Aug 3 2015, 18:50)  Как правильно организовать архитектуру программы для часов? Часы должны показывать время дату и температуру, по очереди с определённой задержкой. Как организовать настройку времени? Ну, идете, например на радиокота или еще куда, скачиваете 100500 проектов разных часов с описаниями и исходниками и изучаете. Идете на easyelectronics и читаете статьи DiHalt'а по организации программ на микроконтроллерах (ну там, как сделать события по таймеру итп). Вам могут надавать кучу абсолютно правильных абстрактных советов на все случаи, только они вам не пригодятся, поскольку, если вы бы смогли им следовать, то вышеозначенных вопросов бы не возникло
Сообщение отредактировал CrimsonPig - Aug 4 2015, 11:38
|
|
|
|
|
Aug 4 2015, 12:44
|

Профессионал
    
Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409

|
Цитата(Maxi_Man @ Aug 3 2015, 20:50)  Как правильно организовать архитектуру программы для часов? Часы должны показывать время дату и температуру, по очереди с определённой задержкой. Как организовать настройку времени? Контроллер: Mega8; IDE: Atmel Studio. Делал недавно для ссебя такую программу на atmega16. Отображение времени на ин14, отображение даты, температуры. Настройка вариантов отображения - время, время-дата, время-дата-температура. И некоторые другие функции. Разделите вашу задачу на независимые подзадачи, которые условно не связаны друг с другом. Например: - ведение часов (например опрос ds1337 с заданным периодом или внутренний таймер атмеги), - задача индикации - отображение информации в зависимости от состояния или режима работы устройства - опрос термодатчика с заданным периодом - опрос кнопок управления - задача динамической индикации - отображение данных на индикаторе - какие-либо остальные задачи Свяжите эти задачи друг с другом через глобальные флаги. Например - если в данны
|
|
|
|
|
Aug 4 2015, 14:56
|
Группа: Участник
Сообщений: 9
Регистрация: 28-07-15
Пользователь №: 87 751

|
Цитата(mempfis_ @ Aug 4 2015, 15:44)  Делал недавно для ссебя такую программу на atmega16. Отображение времени на ин14, отображение даты, температуры. Настройка вариантов отображения - время, время-дата, время-дата-температура. И некоторые другие функции.
Разделите вашу задачу на независимые подзадачи, которые условно не связаны друг с другом. Например: - ведение часов (например опрос ds1337 с заданным периодом или внутренний таймер атмеги), - задача индикации - отображение информации в зависимости от состояния или режима работы устройства - опрос термодатчика с заданным периодом - опрос кнопок управления - задача динамической индикации - отображение данных на индикаторе - какие-либо остальные задачи
Свяжите эти задачи друг с другом через глобальные флаги. Например - если в данны Не могли бы вы скинуть исходник? Просто Ваш случай, практически, в точности копирует мой.
|
|
|
|
|
Aug 4 2015, 19:07
|
Знающий
   
Группа: Участник
Сообщений: 959
Регистрация: 11-01-06
Из: Санкт-Петербург
Пользователь №: 13 050

|
Цитата(Maxi_Man @ Aug 4 2015, 17:56)  Не могли бы вы скинуть исходник? Просто Ваш случай, практически, в точности копирует мой. как говориться "погуглю за вас. дорого" (С) обитатели форума зы google.ru->"atmega8 часы"
|
|
|
|
|
Aug 6 2015, 10:18
|
Группа: Участник
Сообщений: 9
Регистрация: 28-07-15
Пользователь №: 87 751

|
Цитата(mempfis_ @ Aug 6 2015, 11:09)  Я думал сообщение не отправилось.... Оно и не дописано... Скину Вам исходник, но там нет настроек времени т.к. я использую GPS-модуль для синхронизации времени. проект под IAR AVR 5.10a Спасибо огромное! Подскажите, пожалуйста.Как реализовать такой режим отображения? 1)Время-отображается 20сек; 2)Дата-отображается 10сек; и так по кругу.
|
|
|
|
|
Aug 21 2015, 07:30
|
Местный
  
Группа: Участник
Сообщений: 333
Регистрация: 19-12-13
Из: Новосибирск
Пользователь №: 79 709

|
Конкретика? Пожалуйста: очередь таймеров, которая к тому же работает в прерывании. Такой способ вполне работоспособен, если устройство заточено на то, что задачи в очереди задач всегда одни и те же. И все действия которые будут происходить всегда предсказуемы. Но если у нас к примеру управляющее устройство. С разными режимами и так далее. Тем более, если еще есть аварийный режим. Представим, что мы положили в очередь задачу на исполнение через некоторое время. И тут аварийная ситуация, или просто режим сменился. Устройство работает себе, а тут срабатывает задача из очереди, которая в этом режиме никак не предусмотрена. Приплыли. Вы скажете, будем придумывать убийц задач. А откуда нам известно, какая задача должна работать в какой-то момент времени? Тем более, если задачи зависят от режима работы и так далее. Так что, то что слямзено у моторолы - это никак не показатель. Меня привлек в свое время этот "диспетчер". Но я столкнулся с его этой замедленной миной. В итоге от этого диспетчера у меня осталась таймерная служба, которая работает в ОСНОВНОМ цикле. Идем дальше. Переключение задач происходит гораздо дольше, чем простой список функций. Также примерно в то время мне указали на конечные автоматы. Итог, я составил себе определенные правила ниписания проектов. И до нынешнего момента мне не потребовались ни подобные недодиспетчеры ни РТОС. Пример основного цикла из действующего проекта: CODE //======================================================================== __C_task main () { wdt_enable (WDTO_15_MS);
/* dsp_buf [0] = 1; dsp_buf [1] = 2; dsp_buf [2] = 3; dsp_buf [3] = 4; dsp_buf [4] = 5; dsp_buf [5] = 6; */
init_sys_timer ();
__enable_interrupt ();
Init_Events ();
while (1) { __watchdog_reset ();
service_timers ();
proc_amplifier ();
proc_7_segm_ind ();
Process_Events (); } } //========================================================================
Запуск процесса каждое определенное время, на этом примере можно посмотреть, как запускать процессы периодически или через определенное время: CODE //======================================================================== void proc_7_segm_ind (void) { static u08 _proc_7_segm_ind;
static u08 cnt_7_segm_ind;
switch (_proc_7_segm_ind) { case 0: ANODS_DDR = 0xFF; cnt_7_segm_ind = 0; set_timer (ST_PROC_7_SEGM_IND, NO_RERUN_TIMER, 1); _proc_7_segm_ind = 1; break;
case 1: if (wait (ST_PROC_7_SEGM_IND)) { u08 cnt = cnt_7_segm_ind;
volatile u08 anods; volatile u08 katods;
ANODS_PORT = 0; KATODS_DDR = 0;
cnt_7_segm_ind = tab_index_anods [cnt].i; anods = tab_index_anods [cnt].anod;
katods = table_7_segm_char [dsp_buf [cnt_7_segm_ind]];
ANODS_PORT = anods; KATODS_DDR = katods;
set_timer (ST_PROC_7_SEGM_IND, NO_RERUN_TIMER, 1); } break;
default: _proc_7_segm_ind = 0; break; } } //========================================================================
Сообщение отредактировал demiurg1978 - Aug 21 2015, 07:37
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|