Отладчик µVision2. Отладочные функции:
Имитация клавиатуры
Александр Бельченко
9 декабря 2003
Эта небольшая статья рассказывает о том, как с помощью отладочных функций симулятора µVision2 имитировать работу с клавиатурой. В качестве примера взята клавиатура из 4х клавиш, клавиши которой подключены непосредственно к выводам микроконтроллера.
Если ваше устройство предполагает некоторое, пусть даже минимальное, взаимодействие с пользователем, то оно обязательно будет иметь некоторое устройство для ввода информации от пользователя (например, клавиатуру) и некоторое устройство для отображения информации (например, дисплей на основе ЖКИ экрана). Сумма этих двух устройств образует интерфейс между вашим прибором и пользователем.
Вопросам построения интерфейсов не всегда уделяется серьезное внимание, впрочем и литературы по этой тематике очень мало. И если вопрос построения пользовательского интерфейса для компьютерных программ освещается в той или иной мере часто, то вопрос построения пользовательского интерфейса для встраиваемых систем, а тем более для бытовых приборов, это узкая область знаний высококлассных специалистов.
Если вы читали книгу Джоэля Спольски «User Interface Design for Programmers» («Проектирование пользовательского интерфейса: руководство для программистов» перевод на русский язык), то, возможно, прониклись той мыслью, что хороший пользовательский интерфейс облегчает работу человека с объектом. Плохой же наоборот, затрудняет работу и вызывает раздражение.
Каждый из нас, рано или поздно, сталкивался с раздражающим и откровенно плохим (и даже халтурным) интерфейсом у какого-либо прибора. Мне наиболее запомнившимся образцом такого «ужасного» интерфейса стал пульт ввода параметров для одного из изделий, разработанного и выпускаемого предприятием, на котором я работаю.
Самым раздражающим местом в этом пульте (точнее, в программном обеспечении) была клавиатура. Она понимала только очень-очень быстрые нажатия на клавиши. Стоило нажать на клавишу чуть подольше и программа воспринимала это как многократное нажатие. В результате чего попасть в нужный пункт меню с первого раза становилось практически нереально (со второго, впрочем, тоже). Не думаю, что программист, написавший такую реализацию пользовательского интерфейса, имел настолько развитую координацию движения пальцев рук. На самом деле ему было лень писать нормальную программу, его не заботило, как потом с этим пультом будут работать другие люди.
Поскольку моей работой стало сопровождение и модификация программы для этого пульта и всего изделия в целом, то первым делом я переделал весь пользовательский интерфейс: сделал нормальную обработку клавиатуры и перевел все сообщения с английского на русский язык.
Итак, если вам предстоит разрабатывать программу, реализующую некоторый пользовательский интерфейс, то постарайтесь написать ее так, чтобы пользоваться прибором было удобно. Удобство использования можно оценить только на реальном объекте. Но отладить и проверить логику работы своей программы вы можете и в симуляторе µVision2.
Впрочем, отладка и проверка алгоритма работы с клавиатурой (и всего пользовательского интерфейса в целом) в симуляторе может показаться делом довольно скучным и утомительным, если «нажатия» клавиш вы будете имитировать вручную, например, переводя состояние какого-нибудь вывода процессора из «1» в «0» и обратно. А если вы решите проверить качество подавления дребезга контактов вашим алгоритмом, то скорее всего бросите эксперименты в самом начале не у каждого хватит терпения имитировать шумоподобные сигналы вручную!
Но все становится легче и проще, когда вы начинаете использовать отладочные функции симулятора µVision2. Об этих функциях я уже писал (см. «Пример использования отладочных функций: определение времени выполнения участка программы»). Начинающим рекомендую ознакомиться с главой 6 из документа «Getting Started with µVision2» (или с моим переводом). Я покажу вам пример отладочных функций для имитации работы клавиатуры из 4х клавиш, клавиши которой подключены к выводам порта P1 микроконтроллера.
Итак, в нашем примере клавиатура содержит 4 клавиши: БОЛЬШЕ (или ВПРАВО), МЕНЬШЕ (или ВЛЕВО), ВВОД и СБРОС. Пусть клавиши подключены к выводам порта P1 микроконтроллера, как показано на следующем
рисунке.
Даже такая небольшая клавиатура позволяет организовать сложный и вполне полноценный интерфейс с пользователем, включая возможность ввода чисел любой разрядности.
Нажатому состоянию клавиши соответствует лог. «1» на соответствующем входе порта, отжатому лог. «0». Для имитации однократных нажатий на клавиши можно использовать следующие сигнальные функции:
/*
Имитация клавиатуры из 4х клавиш
Bialix Microlab - Александр Бельченко, 2003
http://bialix.narod.ru/
*/
signal void push_more()
{
PORT1 |= 0x08;
swatch(0.1);
PORT1 ^= 0x08;
}
signal void push_less()
{
PORT1 |= 0x04;
swatch(0.1);
PORT1 ^= 0x04;
}
signal void push_on(void)
{
PORT1 |= 0x01;
swatch(0.1);
PORT1 ^= 0x01;
}
signal void push_esc(void)
{
PORT1 |= 0x02;
swatch(0.1);
PORT1 ^= 0x02;
}
define button "<-", "push_less()"
define button "->", "push_more()"
define button "ВВОД", "push_on()"
define button "СБРОС", "push_esc()"
PORT1 = 0xF0
Рассмотрим внимательнее приведенный пример. Все четыре сигнальных функции, имитирующие сигналы от клавиш, практически идентичны. При имитации нажатия состояние соответствующего вывода переводится в лог. «1», а затем через 100 мс снова в лог. «0». Задержка на 100 мс осуществляется встроенной функцией swatch(float sec).
В приведенном примере взято некое усредненное время нажатия на клавишу. В каждом конкретном реальном приборе средняя длительность однократного нажатия на клавишу будет зависеть от механических свойств кнопок, а также от моторики пальцев конкретного человека пользователя вашего прибора.
Командами define button определяются четыре кнопки на панели Toolbox отладчика µVision2. Нажимая на эти кнопки, вы имитируете нажатия на кнопки клавиатуры.
Обратите внимание на последнюю строчку в приведенном примере. Командой
PORT1 = 0xF0
инициализируется начальное состояние клавиш все клавиши отжаты.
Вы можете использовать приведенный пример как основу для написания своих отладочных функций для имитации клавиатуры вашего конкретного прибора. Изменяя длительность «нажатия» (аргумент функции swatch), можно оценить как ваша программа будет реагировать на короткие и длительные нажатия. Если же вам надо промоделировать ситуацию с одновременным нажатием нескольких клавиш, то это тоже будет легко сделать, поскольку для каждой клавиши написана своя синальная функция. Запустив две или более сигнальных функций во время паузы исполнения отлаживаемой программы, вы сможете пронаблюдать поведение вашего алгоритма в любых ситуациях.