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

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> Как правильно организовать архитектуру программы?, Архитектура для часов
Maxi_Man
сообщение Aug 3 2015, 17:50
Сообщение #1





Группа: Участник
Сообщений: 9
Регистрация: 28-07-15
Пользователь №: 87 751



Как правильно организовать архитектуру программы для часов?
Часы должны показывать время дату и температуру, по очереди с определённой задержкой.
Как организовать настройку времени?
Контроллер: Mega8;
IDE: Atmel Studio.
Go to the top of the page
 
+Quote Post
RabidRabbit
сообщение Aug 4 2015, 06:22
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 397
Регистрация: 3-12-09
Из: Россия, Москва
Пользователь №: 54 040



Архитектура программная, по-моему, сильно зависит от архитектуры аппаратной. Тут уж сами думайте, раз одна только Mega8 участвует...
Настройка времени,к примеру, автоматическая: http://www.ptb.de/cms/en/ptb/fachabteilung...time/dcf77.html
Go to the top of the page
 
+Quote Post
kolobok0
сообщение Aug 4 2015, 11:00
Сообщение #3


практикующий тех. волшебник
*****

Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417



Цитата(Maxi_Man @ Aug 3 2015, 20:50) *
Как правильно организовать архитектуру программы для часов?..настройку времени?..


Архитектура программы под МК, как правило лучше делать придерживаясь ОО подхода.
на "нижнем уровне" - ярко выраженная зависимость от периферии и тех действий которые требуются делать с этой периферией. Иногда этот слой
обзывают "драйвера". Если задача не крупная - то над этим слоем достаточно одного цикла с не большим кол-вом специфики. Если есть
пользовательский интерфейс, протоколы верхнего уровня и иже - то код уже группируется по логическим сущностям, с требуемым к ним
программным интерфейсам. В принципе этот слой уже ничем не отличается от стандартного подхода ООА и ООП. При программировании
выбираете необходимый язык, от этого принципиально ничего меняться не должно.

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


Go to the top of the page
 
+Quote Post
CrimsonPig
сообщение Aug 4 2015, 11:37
Сообщение #4


Местный
***

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



Цитата(Maxi_Man @ Aug 3 2015, 18:50) *
Как правильно организовать архитектуру программы для часов?
Часы должны показывать время дату и температуру, по очереди с определённой задержкой.
Как организовать настройку времени?


Ну, идете, например на радиокота или еще куда, скачиваете 100500 проектов разных часов с описаниями и исходниками и изучаете.
Идете на easyelectronics и читаете статьи DiHalt'а по организации программ на микроконтроллерах (ну там, как сделать события по таймеру итп).

Вам могут надавать кучу абсолютно правильных абстрактных советов на все случаи, только они вам не пригодятся, поскольку, если вы бы смогли им следовать, то вышеозначенных вопросов бы не возникло sm.gif

Сообщение отредактировал CrimsonPig - Aug 4 2015, 11:38
Go to the top of the page
 
+Quote Post
mempfis_
сообщение Aug 4 2015, 12:44
Сообщение #5


Профессионал
*****

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



Цитата(Maxi_Man @ Aug 3 2015, 20:50) *
Как правильно организовать архитектуру программы для часов?
Часы должны показывать время дату и температуру, по очереди с определённой задержкой.
Как организовать настройку времени?
Контроллер: Mega8;
IDE: Atmel Studio.


Делал недавно для ссебя такую программу на atmega16. Отображение времени на ин14, отображение даты, температуры. Настройка вариантов отображения - время, время-дата, время-дата-температура.
И некоторые другие функции.

Разделите вашу задачу на независимые подзадачи, которые условно не связаны друг с другом. Например:
- ведение часов (например опрос ds1337 с заданным периодом или внутренний таймер атмеги),
- задача индикации - отображение информации в зависимости от состояния или режима работы устройства
- опрос термодатчика с заданным периодом
- опрос кнопок управления
- задача динамической индикации - отображение данных на индикаторе
- какие-либо остальные задачи

Свяжите эти задачи друг с другом через глобальные флаги. Например - если в данны
Go to the top of the page
 
+Quote Post
Maxi_Man
сообщение Aug 4 2015, 14:56
Сообщение #6





Группа: Участник
Сообщений: 9
Регистрация: 28-07-15
Пользователь №: 87 751



Цитата(mempfis_ @ Aug 4 2015, 15:44) *
Делал недавно для ссебя такую программу на atmega16. Отображение времени на ин14, отображение даты, температуры. Настройка вариантов отображения - время, время-дата, время-дата-температура.
И некоторые другие функции.

Разделите вашу задачу на независимые подзадачи, которые условно не связаны друг с другом. Например:
- ведение часов (например опрос ds1337 с заданным периодом или внутренний таймер атмеги),
- задача индикации - отображение информации в зависимости от состояния или режима работы устройства
- опрос термодатчика с заданным периодом
- опрос кнопок управления
- задача динамической индикации - отображение данных на индикаторе
- какие-либо остальные задачи

Свяжите эти задачи друг с другом через глобальные флаги. Например - если в данны

Не могли бы вы скинуть исходник? Просто Ваш случай, практически, в точности копирует мой.
Go to the top of the page
 
+Quote Post
Jury093
сообщение Aug 4 2015, 19:07
Сообщение #7


Знающий
****

Группа: Участник
Сообщений: 959
Регистрация: 11-01-06
Из: Санкт-Петербург
Пользователь №: 13 050



Цитата(Maxi_Man @ Aug 4 2015, 17:56) *
Не могли бы вы скинуть исходник? Просто Ваш случай, практически, в точности копирует мой.

как говориться "погуглю за вас. дорого" (С) обитатели форума

зы google.ru->"atmega8 часы"
Go to the top of the page
 
+Quote Post
demiurg1978
сообщение Aug 5 2015, 07:25
Сообщение #8


Местный
***

Группа: Участник
Сообщений: 333
Регистрация: 19-12-13
Из: Новосибирск
Пользователь №: 79 709



1 - Модульность программ.
Опрос кнопок.
Вывод информации. Аппаратный. Семисегментник, дисплей. Его задача - вывод из буфера.
Меню.
Счетчик времени.
Взаимодействие человек-программа.
2 - Псевдопараллельность процессов. Никаких долгих циклов. Разбиение задачи-модуля на подзадачи. Условия, флаги, автоматное программирование. Добиться того, чтобы каждая задача за итерацию основного цикла выполняла часть кода. Этим мы добиваемся псевдопараллельности процессов. Грубое сравнение - windows. Как работают много программ в windows? Есть диспетчер, который каждой программе выделяет определенное время выполнения. Закончилось время, диспетчер переключается на следующую программу. Это происходит очень быстро. Для пользователя это выглядит, как будто все программы работают одновременно.
Go to the top of the page
 
+Quote Post
mempfis_
сообщение Aug 6 2015, 08:09
Сообщение #9


Профессионал
*****

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



Цитата(Maxi_Man @ Aug 4 2015, 17:56) *
Не могли бы вы скинуть исходник? Просто Ваш случай, практически, в точности копирует мой.


Я думал сообщение не отправилось.... Оно и не дописано...
Скину Вам исходник, но там нет настроек времени т.к. я использую GPS-модуль для синхронизации времени.
проект под IAR AVR 5.10a
Go to the top of the page
 
+Quote Post
Maxi_Man
сообщение Aug 6 2015, 10:18
Сообщение #10





Группа: Участник
Сообщений: 9
Регистрация: 28-07-15
Пользователь №: 87 751



Цитата(mempfis_ @ Aug 6 2015, 11:09) *
Я думал сообщение не отправилось.... Оно и не дописано...
Скину Вам исходник, но там нет настроек времени т.к. я использую GPS-модуль для синхронизации времени.
проект под IAR AVR 5.10a

Спасибо огромное!
Подскажите, пожалуйста.Как реализовать такой режим отображения?
1)Время-отображается 20сек;
2)Дата-отображается 10сек;
и так по кругу.
Go to the top of the page
 
+Quote Post
mempfis_
сообщение Aug 6 2015, 11:06
Сообщение #11


Профессионал
*****

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



Цитата(Maxi_Man @ Aug 6 2015, 13:18) *
Спасибо огромное!
Подскажите, пожалуйста.Как реализовать такой режим отображения?
1)Время-отображается 20сек;
2)Дата-отображается 10сек;
и так по кругу.


Посмотрите как это сделано в моём проекте. Там есть 3 режима отображения.
Если вопрос как это сделать в принципе - то заведите таймер длительности отображения. Отображаете время, устанавливаете таймер длительности отображения на 20 секунд. Мониторите таймер каждую секунду попутно обновляя время (если есть отображение секунд). Если вышел таймаут отображения времени, отображаете дату, устанавливаете таймер длительности отображения на 10 секунд. Мониторите истечение таймаута. Далее опять переходите на отображение времени.
Go to the top of the page
 
+Quote Post
Onkel
сообщение Aug 7 2015, 05:41
Сообщение #12


Знающий
****

Группа: Свой
Сообщений: 708
Регистрация: 8-05-11
Из: Чг
Пользователь №: 64 861



порядок гуглим "AVR. Учебный курс. Операционная система. Введение.", и не пугайтесь слов "операционная система" - это просто опыт нескольких десятилетий по программированию мелких мк, очень полезная и очень очень простая инфа.
Go to the top of the page
 
+Quote Post
demiurg1978
сообщение Aug 7 2015, 10:11
Сообщение #13


Местный
***

Группа: Участник
Сообщений: 333
Регистрация: 19-12-13
Из: Новосибирск
Пользователь №: 79 709



Крайне вредный совет и цикл статей. В этой "операционной системе" занесен большущий дамоклов меч. Мина непредсказуемого замедленного действия. Я о таймерной службе в этом опусе.
Go to the top of the page
 
+Quote Post
Onkel
сообщение Aug 21 2015, 06:37
Сообщение #14


Знающий
****

Группа: Свой
Сообщений: 708
Регистрация: 8-05-11
Из: Чг
Пользователь №: 64 861



Цитата(demiurg1978 @ Aug 7 2015, 13:11) *
Крайне вредный совет и цикл статей. В этой "операционной системе" занесен большущий дамоклов меч. Мина непредсказуемого замедленного действия. Я о таймерной службе в этом опусе.

Эээ, товарищ, если уж ругать - то с конкретикой, плиз. Где тут меч и где тут мина? Неужели моторола писала свои операционки для любимцев новых русских микротаков с мечами и минами?
Go to the top of the page
 
+Quote Post
demiurg1978
сообщение Aug 21 2015, 07:30
Сообщение #15


Местный
***

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 15th June 2025 - 23:45
Рейтинг@Mail.ru


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