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

 
 
> RTOS + LCD CX65 + Menu, В активном процессе разработки
Arcanum
сообщение Dec 31 2015, 09:56
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 22
Регистрация: 5-02-11
Пользователь №: 62 725



Всем доброго времени суток!
не буду сиськи мять, перейду к сути:
есть контроллер 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

Сообщение отредактировал Arcanum - Dec 31 2015, 09:59
Прикрепленные файлы
Прикрепленный файл  Clock_2_LCD_IR_RTOS_V2.7z ( 55.55 килобайт ) Кол-во скачиваний: 27
 
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 10)
controller_m30
сообщение Dec 31 2015, 21:35
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 356
Регистрация: 24-02-09
Пользователь №: 45 309



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

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

2. Отказаться от количества пунктов меню >10 вообще - меню-то замышляется древовидное! Даже глубина "дерева" в 3 уровня по 10 пунктов - позволяет получать доступ к 1000 конечным функциям (10^3=1000). 4 уровня по 10, это 10 000 конечных функций. И так далее...
В этом случае кнопки вверх-вниз для выбора одного из 10 пунктов меню, а влево-вправо для перехода на предыдущий\следующий уровень.
Go to the top of the page
 
+Quote Post
Arcanum
сообщение Jan 5 2016, 20:43
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 22
Регистрация: 5-02-11
Пользователь №: 62 725



Цитата(controller_m30 @ Jan 1 2016, 00:35) *
Предлагаю два разных варианта:

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&

Сообщение отредактировал Arcanum - Jan 5 2016, 20:44
Прикрепленные файлы
Прикрепленный файл  Clock_2_LCD_IR_RTOS_V2.7z ( 57.73 килобайт ) Кол-во скачиваний: 21
 
Go to the top of the page
 
+Quote Post
controller_m30
сообщение Jan 6 2016, 19:27
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 356
Регистрация: 24-02-09
Пользователь №: 45 309



Цитата(Arcanum @ Jan 5 2016, 23:43) *
было озвучено предложение очищать экран каждый раз перед отрисовкой строк. но это приводит к тому что экран очень неприятно моргает.

Пусть программа отрисовки строк, при завершении списка посередине экрана - продолжает рисовать строки заполненные символом пробела (ASCII код 20h).
Тогда мерцания не будет, т.к. экран будет обновляться только за один проход, а не за два.
Go to the top of the page
 
+Quote Post
Arcanum
сообщение Jan 8 2016, 12:13
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 22
Регистрация: 5-02-11
Пользователь №: 62 725



Цитата(controller_m30 @ Jan 6 2016, 22:27) *
Пусть программа отрисовки строк, при завершении списка посередине экрана - продолжает рисовать строки заполненные символом пробела (ASCII код 20h).
Тогда мерцания не будет, т.к. экран будет обновляться только за один проход, а не за два.

в принципе реализуемо но решил задачу "в лоб":
завести глобальную переменную где хранится текущая страница. при прорисовке сткрок идёт сравнение текущей локальной переменной с глобадбной переменной текущей страници. если НЕРАВНО то чистим экран и присваиваем глабальной переменной значение локальной.
//очистка экрана если происходит смена страницы.
if (MENU_Page_Current != MENU_previous_page)
{
MENU_previous_page = MENU_Page_Current;
fill_screen(0xFFFF);
}
Go to the top of the page
 
+Quote Post
alexeyv
сообщение Jan 11 2016, 04:49
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 298
Регистрация: 26-01-09
Из: Пермь
Пользователь №: 43 940



Можно попробовать еще один вариант.
Всегда количество меню делать кратно количеству строк, Но! Названия не используемых пунктов делать " ", а обработчик делать пустым.
Go to the top of the page
 
+Quote Post
Arcanum
сообщение Jan 18 2016, 22:21
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 22
Регистрация: 5-02-11
Пользователь №: 62 725



ОДнако, доброго времени суток!
спешу доложить о результатах трудов что я наделал.
что есть сейчас в проекте:
RTOS.
примитивная работа с экраном cx65 на чипе L2F50 (строки, очистка экрана, немного цветов.)
пока псевдоменю. реализована навигация по папкам.


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

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

http://www.youtube.com/watch?v=w2a-AIhhP2k
исходник прикладываю


Сообщение отредактировал Arcanum - Jan 18 2016, 22:44
Прикрепленные файлы
Прикрепленный файл  Clock_2_LCD_IR_RTOS_V2.7z ( 78.28 килобайт ) Кол-во скачиваний: 18
 
Go to the top of the page
 
+Quote Post
demiurg1978
сообщение Jan 19 2016, 15:36
Сообщение #8


Местный
***

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



Цитата(Arcanum @ Jan 19 2016, 05:21) *
...

Если стоит недо"RTOS" с easyelectronics.ru, весь проект можно смело выкидывать в помойку.
Автоматное программирование, программные таймеры и будет вам счастье.
Go to the top of the page
 
+Quote Post
Arcanum
сообщение Jan 19 2016, 21:26
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 22
Регистрация: 5-02-11
Пользователь №: 62 725



Цитата(demiurg1978 @ Jan 19 2016, 18:36) *
Если стоит недо"RTOS" с easyelectronics.ru,
стоит
Цитата
весь проект можно смело выкидывать в помойку.
почему?
Цитата
Автоматное программирование, программные таймеры и будет вам счастье.
ссылки на статьи и примеры, пожалуйста
Go to the top of the page
 
+Quote Post
demiurg1978
сообщение Jan 20 2016, 06:52
Сообщение #10


Местный
***

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



Цитата(Arcanum @ Jan 20 2016, 04:26) *
...

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

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

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

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

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

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

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

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

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

У меня main выглядит так (просто список функций):
CODE
//========================================================================
__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 - Jan 30 2016, 20:17
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
Go to the top of the page
 
+Quote Post
Arcanum
сообщение Jan 30 2016, 19:34
Сообщение #11


Участник
*

Группа: Участник
Сообщений: 22
Регистрация: 5-02-11
Пользователь №: 62 725



Цитата(demiurg1978 @ Jan 20 2016, 09:52) *
Я знаю что стоит. Скачал и посмотрел архив.

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

а так...
очередной промежуточный результат
оформлена работа с приложениями.
сделано приложение настройки времени микросхемы pcf8583
видео
https://youtu.be/bkH1xA1OGmA
Прикрепленные файлы
Прикрепленный файл  Clock_2_LCD_IR_RTOS_V2.7z ( 102.44 килобайт ) Кол-во скачиваний: 16
 
Go to the top of the page
 
+Quote Post

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

 


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


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