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

RTOS + LCD CX65 + Menu

Всем доброго времени суток!

не буду сиськи мять, перейду к сути:

есть контроллер AtMega 32A. Дисплей от телефона Siemens CX65 на чипе L2F50.

всё это удовольствие подключено к отладочной плате PinBoardII rev.2

задачу которую я поставил перед собой:

сделать плату-модуль для доступа к настройкам n количества других контроллеров. то есть клавиатура, экран, контроллер, разъём.

чего сейчас достиг на контроллере запустил RTOS от DiHalt'а. в составе RTOS работают вывод симоволов и строк на экран. сообщения UART пока для отладки

конкретно сейчас работаю на реализацией древовидного меню.

за праобраз и подобие взял статью и исходники http://geektimes.ru/post/255020/ с автором активно переписываюсь.

 

что сейчас могёт код:

инициализировать дисплей.

вывести 10 строк на дисплей.

по приёму символов "2" и "8" через UART двигать курсор по этим 10 строкам упираясь в "край" экрана.

каждое движение курсора - перерисовывание текущих 10 строк заново с инверсией цвета фона и шрифта при текущем положении курсора.

сейчас затык длиной в неделю(с перерывом на работу и отмечание др) на таком моменте:

как быть если элементов меню больше чем 10 строк что может показать экран? на ум приходит только "страницы"

то есть отображаются на первой странице элементы от 0 до 9, на вротой странице 10-19 и так далее...

в голову приходит только какая-то дикая математика с делением количества элементов в меню на количество строк на экране... и всё.

кто может подсказать как сделать или в какую сторону рыть??

 

полная тема работы http://forum.easyelectronics.ru/viewtopic....=56&t=23957

Clock_2_LCD_IR_RTOS_V2.7z

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

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


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

Предлагаю два разных варианта:

 

1. Скроллинг (как было предложено и на форуме по ссылке). Кнопки вверх-вниз выбирают конкретный пункт меню, а кнопки вправо-влево листают список с шагом +\-10 от текущей позиции в списке.

Сбоку ползунок, для визуализации текущего положения экрана в списке. Если во всём списке менее 10 пунктов, то ползунок отсутствует, или рисуется в виде сплошной линии.

 

2. Отказаться от количества пунктов меню >10 вообще - меню-то замышляется древовидное! Даже глубина "дерева" в 3 уровня по 10 пунктов - позволяет получать доступ к 1000 конечным функциям (10^3=1000). 4 уровня по 10, это 10 000 конечных функций. И так далее...

В этом случае кнопки вверх-вниз для выбора одного из 10 пунктов меню, а влево-вправо для перехода на предыдущий\следующий уровень.

 

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


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

Предлагаю два разных варианта:

 

1. Скроллинг (как было предложено и на форуме по ссылке). Кнопки вверх-вниз выбирают конкретный пункт меню, а кнопки вправо-влево листают список с шагом +\-10 от текущей позиции в списке.

Сбоку ползунок, для визуализации текущего положения экрана в списке. Если во всём списке менее 10 пунктов, то ползунок отсутствует, или рисуется в виде сплошной линии.

 

2. Отказаться от количества пунктов меню >10 вообще - меню-то замышляется древовидное! Даже глубина "дерева" в 3 уровня по 10 пунктов - позволяет получать доступ к 1000 конечным функциям (10^3=1000). 4 уровня по 10, это 10 000 конечных функций. И так далее...

В этом случае кнопки вверх-вниз для выбора одного из 10 пунктов меню, а влево-вправо для перехода на предыдущий\следующий уровень.

выбрал первый вариант и активно его проработал. благодарю за ценный совет!

 

нус... очередной промежуточный отчёт!

что есть сейчас и какие проблемы

есть сейчас:

1) страницы. если пунктов меню в два/три/n раз больше чем может отобразить экран то цикл прорисовки сам сориентируется и выведет курсор на нужной странице.

2) навигация по страницам. прикрутил дополнительно перелистиывание страниц по кнопкам вправо/влево (6/4). каждый раз при перелистывании курсор становится на первый пункт меню текущей страниц.

проблема:пример. 35 пунктов меню. 4 страницы соответственно. цикл рисует от 0 до 10 строк на экране. каждый раз строки перерисвоваются. но! на последней страницы рисуются только 5 строк из 10. то есть 5 элементов четвёртой страницы нарисовались но при этом нижние пять элементов предыдущей страницы остались и видны. было озвучено предложение очищать экран каждый раз перед отрисовкой строк. но это приводит к тому что экран очень неприятно моргает.

как быть господа?

 

кто попросит - могу снять видео работы и запостить ссыль

 

форумы собсуждения этой темы

http://forum.easyelectronics.ru/posting.ph...b0c2c9d780f337f

http://www.radiohlam.ru/forum/viewtopic.ph...09ae390218434ef

http://forum.cxem.net/index.php?showtopic=157723&hl=

http://electronix.ru/forum/index.php?showt...;p=1393328&

Clock_2_LCD_IR_RTOS_V2.7z

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

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


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

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

Пусть программа отрисовки строк, при завершении списка посередине экрана - продолжает рисовать строки заполненные символом пробела (ASCII код 20h).

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

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


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

Пусть программа отрисовки строк, при завершении списка посередине экрана - продолжает рисовать строки заполненные символом пробела (ASCII код 20h).

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

в принципе реализуемо но решил задачу "в лоб":

завести глобальную переменную где хранится текущая страница. при прорисовке сткрок идёт сравнение текущей локальной переменной с глобадбной переменной текущей страници. если НЕРАВНО то чистим экран и присваиваем глабальной переменной значение локальной.

//очистка экрана если происходит смена страницы.

if (MENU_Page_Current != MENU_previous_page)

{

MENU_previous_page = MENU_Page_Current;

fill_screen(0xFFFF);

}

 

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


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

Можно попробовать еще один вариант.

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

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


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

ОДнако, доброго времени суток!

спешу доложить о результатах трудов что я наделал.

что есть сейчас в проекте:

RTOS.

примитивная работа с экраном cx65 на чипе L2F50 (строки, очистка экрана, немного цветов.)

пока псевдоменю. реализована навигация по папкам.

 

 

мои "фишки":

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

лёгкость добавления элемента в структуру меню: обозначить тип, папку в которой будет логично смотрется, задать параметры и сделать +1 к дефайну количества "файлов" - элементов в структуре меню.

 

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

вот видео как работает

 

http://www.youtube.com/watch?v=w2a-AIhhP2k

исходник прикладываю

Clock_2_LCD_IR_RTOS_V2.7z

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

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


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

...

Если стоит недо"RTOS" с easyelectronics.ru, весь проект можно смело выкидывать в помойку.

Автоматное программирование, программные таймеры и будет вам счастье.

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


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

Если стоит недо"RTOS" с easyelectronics.ru,
стоит

весь проект можно смело выкидывать в помойку.
почему?

Автоматное программирование, программные таймеры и будет вам счастье.
ссылки на статьи и примеры, пожалуйста

 

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


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

...

Я знаю что стоит. Скачал и посмотрел архив.

 

Потому что подобные недоRTOS и недодиспетчеры - это как сумасшедшая обезьяна с гранатой. Никогда не знаешь, рванет ли и когда. Объясню на примере световых эффектов. Задачи - режимы эффектов. При смене эффектов в таймерной очереди остаются задачи от предыдущего режима. И по истечении заданного времени они сработают. Потому что задачи не удалили.

 

1) "RTOS" таймерная служба работает в прерывании. Если таймеров много, то долго сидим в прерывании таймера.

2) "Дамоклов меч". Если смена режимов, аварийные ситуации, в очереди будут болтаться задачи, которые по истечении заданного времени сработают. Придумывать "убийц задач"? Но мы не знаем какие задачи удалять в определенные моменты.

3) По сути, эта РТОС и диспетчеры простенькие карусельки, задача которых проста до безобразия - прокручивать задачи процессы, что создает ложное впечатление легкости создания проектов. И таймерная служба в этой "РТОС", это не фича, а самая настоящая мина замедленного действия.

 

Решение - соблюдение правил написания проектов:

Модульность. Программа состоит из самостоятельных модулей. Определение "программных модулей": Мо́дуль — функционально законченный фрагмент программы, оформленный в виде отдельного файла с исходным кодом или поименованной непрерывной её части, предназначенный для использования в других программах. Модули позволяют разбивать сложные задачи на более мелкие в соответствии с принципом модульности.

Никаких долгих циклов. Вход, выполнение кода, выход. Вход, проверка условий, в зависимости от условий соответствующее выполнение кода, выход.

Дробление сложных, долгих по выполнению процессов. Дробление процессов осуществляется условиями, флагами, состояниями конечных автоматов.

 

Цикл статей Татарчевского.

 

Статья. Но реализация автора мне не совсем нравится. Лучше взять за основу оригинал. MicroMenu v2. Лично я считаю такую реализацию меню лучшей. Меню собирается как конструктор.

 

Видео одного моего проекта. Используется MicroMenu.

 

Моя реализация программных таймеров.

 

Теперь смотрим на целесообразность применения "RTOS", "диспетчеров". Так как роль этих лисапедов тупое переключение процессов, то какой от них смысл? Только такты на переключение зря терять.

 

У меня main выглядит так (просто список функций):

//========================================================================
__C_task main (void)
{
  wdt_enable (WDTO_15_MS);

  init_sys_timer ();

  Init_Events ();

  __enable_interrupt ();

  while (1)
  {
  __watchdog_reset ();

  service_timers ();

  kbd_drv ();

  drv_char_dsp ();

  proc_nrf24l01 ();

  tui_service ();

  Process_Events ();
  }
}
//========================================================================

Изменено пользователем IgorKossak
[codebox] для длинного кода, [code] - для короткого!!!

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


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

Я знаю что стоит. Скачал и посмотрел архив.

в принципе понятно. дело вкуса.

в некритичных любительских поделках - прекрасно канает. для высокоточных систем, наподобие тех что стоят в частотниках для управления мощными двигателями, стоят ПЛИСы без всяких диспетчеров. жёсткая логика.

 

а так...

очередной промежуточный результат

оформлена работа с приложениями.

сделано приложение настройки времени микросхемы pcf8583

видео

https://youtu.be/bkH1xA1OGmA

Clock_2_LCD_IR_RTOS_V2.7z

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


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

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

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

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

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

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

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

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

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

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