Перейти к содержанию
    

Как правильно организовать архитектуру программы?

Как правильно организовать архитектуру программы для часов?

Часы должны показывать время дату и температуру, по очереди с определённой задержкой.

Как организовать настройку времени?

Контроллер: Mega8;

IDE: Atmel Studio.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Архитектура программная, по-моему, сильно зависит от архитектуры аппаратной. Тут уж сами думайте, раз одна только Mega8 участвует...

Настройка времени,к примеру, автоматическая: http://www.ptb.de/cms/en/ptb/fachabteilung...time/dcf77.html

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как правильно организовать архитектуру программы для часов?..настройку времени?..

 

Архитектура программы под МК, как правило лучше делать придерживаясь ОО подхода.

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

обзывают "драйвера". Если задача не крупная - то над этим слоем достаточно одного цикла с не большим кол-вом специфики. Если есть

пользовательский интерфейс, протоколы верхнего уровня и иже - то код уже группируется по логическим сущностям, с требуемым к ним

программным интерфейсам. В принципе этот слой уже ничем не отличается от стандартного подхода ООА и ООП. При программировании

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

 

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

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

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как правильно организовать архитектуру программы для часов?

Часы должны показывать время дату и температуру, по очереди с определённой задержкой.

Как организовать настройку времени?

 

Ну, идете, например на радиокота или еще куда, скачиваете 100500 проектов разных часов с описаниями и исходниками и изучаете.

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

 

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

Изменено пользователем CrimsonPig

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как правильно организовать архитектуру программы для часов?

Часы должны показывать время дату и температуру, по очереди с определённой задержкой.

Как организовать настройку времени?

Контроллер: Mega8;

IDE: Atmel Studio.

 

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

И некоторые другие функции.

 

Разделите вашу задачу на независимые подзадачи, которые условно не связаны друг с другом. Например:

- ведение часов (например опрос ds1337 с заданным периодом или внутренний таймер атмеги),

- задача индикации - отображение информации в зависимости от состояния или режима работы устройства

- опрос термодатчика с заданным периодом

- опрос кнопок управления

- задача динамической индикации - отображение данных на индикаторе

- какие-либо остальные задачи

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

И некоторые другие функции.

 

Разделите вашу задачу на независимые подзадачи, которые условно не связаны друг с другом. Например:

- ведение часов (например опрос ds1337 с заданным периодом или внутренний таймер атмеги),

- задача индикации - отображение информации в зависимости от состояния или режима работы устройства

- опрос термодатчика с заданным периодом

- опрос кнопок управления

- задача динамической индикации - отображение данных на индикаторе

- какие-либо остальные задачи

 

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

Не могли бы вы скинуть исходник? Просто Ваш случай, практически, в точности копирует мой.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не могли бы вы скинуть исходник? Просто Ваш случай, практически, в точности копирует мой.

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

 

зы google.ru->"atmega8 часы"

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 - Модульность программ.

Опрос кнопок.

Вывод информации. Аппаратный. Семисегментник, дисплей. Его задача - вывод из буфера.

Меню.

Счетчик времени.

Взаимодействие человек-программа.

2 - Псевдопараллельность процессов. Никаких долгих циклов. Разбиение задачи-модуля на подзадачи. Условия, флаги, автоматное программирование. Добиться того, чтобы каждая задача за итерацию основного цикла выполняла часть кода. Этим мы добиваемся псевдопараллельности процессов. Грубое сравнение - windows. Как работают много программ в windows? Есть диспетчер, который каждой программе выделяет определенное время выполнения. Закончилось время, диспетчер переключается на следующую программу. Это происходит очень быстро. Для пользователя это выглядит, как будто все программы работают одновременно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не могли бы вы скинуть исходник? Просто Ваш случай, практически, в точности копирует мой.

 

Я думал сообщение не отправилось.... Оно и не дописано...

Скину Вам исходник, но там нет настроек времени т.к. я использую GPS-модуль для синхронизации времени.

проект под IAR AVR 5.10a

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я думал сообщение не отправилось.... Оно и не дописано...

Скину Вам исходник, но там нет настроек времени т.к. я использую GPS-модуль для синхронизации времени.

проект под IAR AVR 5.10a

Спасибо огромное!

Подскажите, пожалуйста.Как реализовать такой режим отображения?

1)Время-отображается 20сек;

2)Дата-отображается 10сек;

и так по кругу.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо огромное!

Подскажите, пожалуйста.Как реализовать такой режим отображения?

1)Время-отображается 20сек;

2)Дата-отображается 10сек;

и так по кругу.

 

Посмотрите как это сделано в моём проекте. Там есть 3 режима отображения.

Если вопрос как это сделать в принципе - то заведите таймер длительности отображения. Отображаете время, устанавливаете таймер длительности отображения на 20 секунд. Мониторите таймер каждую секунду попутно обновляя время (если есть отображение секунд). Если вышел таймаут отображения времени, отображаете дату, устанавливаете таймер длительности отображения на 10 секунд. Мониторите истечение таймаута. Далее опять переходите на отображение времени.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

порядок гуглим "AVR. Учебный курс. Операционная система. Введение.", и не пугайтесь слов "операционная система" - это просто опыт нескольких десятилетий по программированию мелких мк, очень полезная и очень очень простая инфа.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Крайне вредный совет и цикл статей. В этой "операционной системе" занесен большущий дамоклов меч. Мина непредсказуемого замедленного действия. Я о таймерной службе в этом опусе.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Крайне вредный совет и цикл статей. В этой "операционной системе" занесен большущий дамоклов меч. Мина непредсказуемого замедленного действия. Я о таймерной службе в этом опусе.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Конкретика? Пожалуйста: очередь таймеров, которая к тому же работает в прерывании. Такой способ вполне работоспособен, если устройство заточено на то, что задачи в очереди задач всегда одни и те же. И все действия которые будут происходить всегда предсказуемы. Но если у нас к примеру управляющее устройство. С разными режимами и так далее. Тем более, если еще есть аварийный режим. Представим, что мы положили в очередь задачу на исполнение через некоторое время. И тут аварийная ситуация, или просто режим сменился. Устройство работает себе, а тут срабатывает задача из очереди, которая в этом режиме никак не предусмотрена. Приплыли. Вы скажете, будем придумывать убийц задач. А откуда нам известно, какая задача должна работать в какой-то момент времени? Тем более, если задачи зависят от режима работы и так далее.

Так что, то что слямзено у моторолы - это никак не показатель.

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

Итог, я составил себе определенные правила ниписания проектов. И до нынешнего момента мне не потребовались ни подобные недодиспетчеры ни РТОС.

Пример основного цикла из действующего проекта:

 

//========================================================================
__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 ();
  }
}
//========================================================================

 

Запуск процесса каждое определенное время, на этом примере можно посмотреть, как запускать процессы периодически или через определенное время:

//========================================================================
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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...