среда, 20 февраля 2013 г.

Полезные ссылки собранные годами

Обычно разработка устройства начинается с железной части, а потом уже к железу пишется программа. Но мы все делали одновременно: и паяли железо, и писали ПО.
Однако принципы построения аппаратной части были заложены еще на этапе идеи. Для начала надо очертить круг задач, которые мы поставили, изготавливая этот логгер. Задача перед нами стояла следующая: создать устройство, вставляемое в разрыв провода клавиатуры и отслеживающие нажатие клавиш. Дальше это устройство, в зависимости от конфигурации программы, должно было быть способно сохранять нажатые клавиши в энергонезависимую память. Затем надо было реализовать возможность снятия этого лога через компьютерный интерфейс, например USB. Важно было учесть и различные варианты развития этого устройства: подключение радиопередатчика, сохранение больших массивов данных, перевод в ASCII-код на ходу, сопряжение с множеством компьютерных интерфейсов. Забегая вперед, скажу, что в нашем устройстве реализованы все возможные способы расширения его функциональности. Мы выбрали процессоры семейства AVR. Они идеально подходят для поставленной задачи: они недорогие, весьма простые в освоении (смотри сентябрьский номер ][ за 2006 год – там я писал, как начать с ними работать), у них обильная периферия, есть оперативная и, что самое главное, энергонезависимая память – EPROM. Из семейства мы отобрали наиболее простой и дешевый ATtiny2313. Этот камушек стоит всего $1,5-2 имеет на своем борту 2 Кб программной памяти, 128 байт оперативки и столько же энергонезависимой памяти. Также у него есть важные для нас последовательные интерфейсы SPI и UART. По SPI мы можем подключать внешнюю память (например, MMC-карточку на 4 Гб) или с помощью программатора, прямо не отключая наш девайс от клавиатуры, сливать содержимое энергонезависимой памяти. UART – это асинхронный приемопередатчик, расширенная версия протокола RS-232. Он послужит нам для связи контроллера с компьютером через согласующие схемы. Но главное, что наш процессор может обрабатывать внешнее прерывание. Есть ножка контроллера, которая может реагировать на смену сигнала. Например, если у нас сигнал в логической единице, то будет обрабатываться прерывание. Нам необходимо настроить устройство так, чтобы прерывание срабатывало по спаду (то есть переходу с логической единицы на ноль) сигнала CLOCK в клавиатуре. Проводок Data мы подсоединим к ножке INT1. Прерывание он обрабатывать не будет. Это сделано для того, чтобы, не сильно изменяя код, можно было легко перенести его под другой процессор – INT0 и INT1 всегда находятся на одних и тех же пинах порта D на любом процессоре семейства AVR: PD2 и PD3. Сливать данные из EPROM можно двумя способами. Первый способ – скачивать неперекодированные данные с помощью программатора, а затем перекодировать своей программой. Такой способ хорош тем, что не нужно морочиться с всевозможными интерфейсами и т.п. Просто несколько проводов на LPT-порт и все. Второй вариант - сливать уже подготовленный текст в ASCII-кодах по порту RS-232. Для этого у процессора предусмотрены ножки RX и TX, как у COM-порта. Но не торопись сразу подключать процессор напрямую к компьютеру – ты его просто спалишь. Дело в том, что уровень сигналов СОМ-порта отличен от такового у процессора. Логический ноль у COM-порта кодируется как -15 вольт, а единица - как +15 вольт. А у процессора - от нуля до +5 вольт. Существуют схемы согласования, множество которых ты найдешь в интернете и радиожурналах. Самый простой путь – это использовать шнурок для мобильника, который на рынке стоит всего 30 рублей. Он на USB, но на конце его есть заветные контакты RX и TX, которые должны подсоединяться к мобильнику. Если ты подключишь его к USB и поставишь все необходимые драйверы, то у тебя в системе появится еще один СОМ-порт. Распиновки таких шнурков можешь найти у нас на диске. Сигнал RX означает прием, а TX – передачу. Поэтому сигнал RX микросхемы следует цеплять на TX ножку процессора и, наоборот, TX микрушки - на RX МК. Процесс разработки Любую микропроцессорную разработку надо начинать с проверенных временем решений. Для начала надо отладить наше устройство на готовых поделках, например, с дисплеем, с сопряжением с компьютером и т.д. Поэтому мы взяли макетную плату с уже встроенным дисплеем и с полностью отлаженной процедурой работы с ним. Это необходимо было для того, чтобы убедиться, что клавиатуру мы видим и отслеживаем. Первым делом мы подали на клавиатуру питание и посмотрели на осциллографе процесс передачи данных от нее. Это важный момент, поскольку на этом этапе можно выявить некоторые недокументированные возможности протокола, которые потом создадут большие грабли. К примеру, у разных типов клавиатур может отсутствовать или неверно отображаться бит четности. Но в нашем случае было все в порядке. Дальше мы подключили клавиатуру к процессору и попробовали просто ловить прерывание, не преобразуя в скан-код. Поначалу были некоторые проблемы: то не ловилось, то появлялся FFh. Оказалось, что при запайке мы поменяли местами сигналы Clock и Data. После их перестановки все встало на свои места. Нажатия клавиш сразу отображались на дисплее. Первые две цифры – сколько байт было принято с момента подачи питания. Вторая пара цифр - последний принятый байт, третья и четвертая - предпоследний и последний байт соответственно. Эта задача, весьма простая на первый взгляд, решалась целых три дня. Сначала лезли непонятные глюки - как оказалось, фирменный программатор просто портил код.

 Когда решили эту проблему, начались траблы с компилятором. В общем, разработка - медленное и нудное занятие, но оно того стоит! Дальше была прикручена давно написанная библиотека работы с UARTом для сопряжения с компьютером. Для подключения процессора к компьютеру использовался DATA-кабель от мобильного телефона, и от него питалась вся наша схема. Для этого потребовалось разобрать сам кабелек, найти документацию на распиновку кабелей для мобильников и все грамотно распаять. Когда все было сделано и программный код заработал вместе с аппаратной частью, мы увидели нажимаемые клавиши в терминальной программе. Последим этапом стала работа с встроенной в процессор энергонезависимой памятью. В нашем распоряжении было всего 128 байт памяти, а если учесть, что каждая клавиша занимает минимум 3 байта (нажатие, код отжатия и код отжатой клавиши), то ее должно было хватить ровно на пароль от операционки, не более. У Меги8 512 байт EPROM, что в 4 раза больше, чем у Тини2313, и, быть может, ты успеешь захватить какие-то моменты из асечной переписки. В эту память процедура записи изначально была циклическая: мы пишем в память, доходим до конца и снова пишем сначала. Получалось, что исходный текст затирается. Последним штрихом была дописанная часть программы, которая определяла конец памяти и больше не продолжала запись.

 Дальше мы стали приводить отладочный вариант в божеский вид. Сначала была сделана плата, в которой после запайки обнаружились ошибки, и она была забракована – пришлось делать все заново. Потом мы сняли лишние отладочные функции, отточили код и исправили ошибки. Напоследок код был перенесен на более крутой и дорогой процессор ATmega8 для увеличения EPROM. Сделано это было отчасти еще из-за того, что в свое время я уже делал подобную разработку, но не довел ее до ума, а плата осталась. И чтобы добру не пропадать, я заморочился и перенес код, благо это было несложно. На момент выхода статьи можно сливать данные через UART, но только в виде скан-кодов, и дальше по бумажке их перекодировать (абсолютно хакерский подход - выучить все скан-коды клавиатуры и делать всю процедуру в уме), или использовать нашу программу на паскале. Надеюсь, в конечном продукте будут реализованы все возможные функции. Сейчас данные сливаются посылкой любого символа в порт, к которому подключен контроллер. Для этого удобно пользоваться специальной терминальной программой, которая лежит на нашем диске.
Blog Widget by LinkWithin

Комментариев нет:

Отправить комментарий