Нужна помощь в прочистке мозгов по поводу реализации UI и использования RTOS(+)
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено bialix 07 марта 2003 г. 11:08

Проект довольно простой, но возникли (пока не решенные) трудности при организации вывода информации на экран при одновременном снятии информации по СОМ-порту.

Есть пульт, который имеет ЖКИ 16*2, 4 кнопки управления менюшками и УАРТ для обмена с другим контроллером.
Задача - реализовать несколько режимов работы, основная задача которых - провести некий обмен по УАРТ с другим дивайсом и записать в него/получить из него какие-то данные.
Реализация - без RTOS (текущая):
проц АТ89S8252 (клон 51)
задействован таймер0 для генерации прерываний каждые 25 мс
в обработчике прерываний таймера выполняется работа по обработке сигналов с кнопок - подавление дребезга контактов + реализация автоповтора
задействован стандартный УАРТ - возможна работа на скоростях 19200, 28800, 57600. Какая конкретно скорость - заранее не известно, реализуется автоподбор скорости для дивайса по принципу перебора всех вариантов, пока внешнее устройство не откликнется. Обработка приема/передачи через прерывание.

Имеем реализацию меню - управление по 4 кнопкам "<-" "->" "ВВОД" "СБРОС" (аналогично сотовым телефонам)
При выборе пункта при нажатии ВВОД переход к субменю или запуск функции-обработчика выбранного режима.

В этих обработчиках также реализуется некое взаимодействие с пользователем для ввода неких параметров. Так есть обработчики, позволяющие запрограммировать сетевые параметры внешнего дивайса (сетевой номер и скорость работы). Пользователь вводит данные - пульт передает эти данные в дивайс, получает от дивайса квитанцию ОК и все действительно ОК. При этом через УАРТ передаются/принимаются небольшие массивы данных (16-20 байт), все нормально работает, однако во время обмена по УАРТ интерфейс пользователя замораживается, на экран выводится сообщение "ЖДИТЕ..." пока опреация не будет завершена (успешно или нет).

Проблема возникла при реализации текущего съема большого объема информации с дивайса, который нужно порциями отображать на экране. Имеем массив 12*6 значений float, который нужно периодически запрашивать от дивайса. При этом на экране нужно отображать один из элементов массива. Пользователь кнопками может выбирать нужный элемент массива так сказать он-лайн. Выход из режима по нажатию СБРОС.
В моей программе пользовательский интерфейс работает вполне корректно, а вот получить массив от дивайса я не могу. При этом тут какая сложность - после посылки запроса в дивайс проходит время (до 1-3 секунд) пока дивайс думает, а затем выдает мне этот массив. Допустим, что скорость обмена по УАРТ мы уже определили. Но обмен все равно не идет. Причем я не вижу на осцилле, чтобы даже шли посылки-запросы от пульта. Очевидно, что в данной системе нужно было реализовать таймаут. Я это сделал, включив в обработчик того же таймера0 еще и функцию таймера - из основной программы задается начальное значение (флаг таймаута при этом сбрасывается), в прерывании таймер уменьшается до 0. Дойдя до 0, счетчик останавливается и выкидывает флаг "Таймаут!". В основной программе я слежу за этим флагом в цикле, где реализовано также слежение за кнопками, и когда таймаут истек по идее должен делать перезапрос. Но это не работает.

Подробнее о реализации приема/передачи. Передача запускается из основного тела программы через функцию, аргументом которой является тип запроса. В обработчике прерывания УАРТа по окончании передачи всего пакета включается прием ответа. После принятия пакета ( включая и проверку CRC) устанавливается флаг "Прием окончен!". Такая логика вполне успешно работает при обмене другими пакетами. Но почему-то не срабатывает в случае с большим массивом. КОНЕЧНО, может где-то маленькая ошибка сидит в программе, я ее пока не нашел. Но меня всегда убивает когда один и тот же модуль в одних случаях работает, а в других нет. Очевидно ошибка сидит в нем с самого начала, просто раньше на эти грабли я не наступал. Сейчас пробую отсимулировать прием БОЛЬШИХ пакетов (очень нудно это).


НАКОНЕЦ ВОПРОС:
как подобная система могла бы быть реализована с помощью RTOS, если нужно учесть, что сообщения от кнопок должны поступать или в модуль реализации меню, или в один из модулей-обработчиков выбранного пункта меню. Затем - как организовать одновременно интерфейс пользователя (выбор индекса массива) и постоянное получение информации от дивайса с учетом таймаутов при обмене. Причем на экран необходимо все же выводить какое-то значение - либо 0 (по умолчанию), либо последнее принятое от дивайса.

Спасибо, если у вас хватило терпения дочитать до конца.
Буду благодарен за любые ответы.

Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru