07.08.2009

Доступ к СМП по USB

Итак, представляю устройство чтения-записи картриджей сменной памяти СМП/МПО для микроэвм Электроника МК-90.

Ключевые особенности разработанного устройства:
  • совместимо с шиной USB 1.0;
  • читает и записывает образы картриджа СМП;
  • измеряет напряжение внутренней батареи;
  • легко повторяется самостоятельно.
Основу устройства составляет МК ATmega8-16PU, для программной поддержки USB использована реализация V-USB от Objective Development. Для управления с PC используется хост-программа smpusb, которая позволяет:
  • читать содержимое СМП в файл
  • записывать образ из файла в СМП с проверкой
  • показывать напряжение батареи и предупреждать о разряде
  • работать через интерфейс командной строки
  • выводить сообщения на stdout (описаны все коды завершения)
  • работать с с Windows XP, Vista, потенциально переносима на Linux
Для Linux требуется установка libusb, для Windows - libusb-win32,

Предупреждение: на Vista ставить в режиме совместимости с Windows XP, иначе сразу "лишитесь" всех USB-устройств.

Как всегда, начинаю с результата: smpreaderusb_1.0.zip (исходники и бинарники firmware и software).

Схема:



Список деталей:

Part Value Device Package Library

C1 22 pF C5/2.5 C5B2.5 capacitor-wima
C2 22 pF C5/2.5 C5B2.5 capacitor-wima
C3 100 nF C5/2.5 C5B2.5 capacitor-wima
C4 47 uF CPOL-EUTT2D5 TT2D5 rcl
C5 100 nF C5/2.5 C5B2.5 capacitor-wima
D1 3V6 BZX55 DO35Z10 diode
D2 3V6 BZX55 DO35Z10 diode
D3 LM385-1.2 LM385-1.2 TO-92 lm385
IC1 MEGA8-P MEGA8-P DIL28-3 atmel
JP2 PINHD-1X6 1X06 pinhead
LED1 PWR LED3MM LED3MM led
LED2 RX LED3MM LED3MM led
LED3 TX LED3MM LED3MM led
Q1 12 MHz CRYSTALHC49U-V HC49U-V crystal
R1 10K R-EU_0204/7 0204/7 resistor
R2 68 R-EU_0204/7 0204/7 resistor
R3 1K R-EU_0204/7 0204/7 resistor
R4 1K R-EU_0204/7 0204/7 resistor
R5 1K R-EU_0204/7 0204/7 resistor
R6 68 R-EU_0204/7 0204/7 resistor
R7 1K5 R-EU_0204/7 0204/7 resistor
R8 1M R-EU_0204/7 0204/7 resistor
R9 22K R-EU_0204/7 0204/7 resistor
X1 PN61729 PN61729 con-berg
X3 PINHD-2X3 2X03 pinhead


Пояснения к схеме

Если под рукой нет ATmega8-16PU, без изменений в схеме можно использовать ATmega48-16PU, ATmega168-20PU, ATmega328P-PU (однако, потребуется перекомпиляция firmware и другие значения фьюз-битов). Важная особенность тактирования: подходит только кварц, заменять его на калиброванные RC-цепочки и керамические резонаторы нельзя. Если нет кварца на 12 МГц, можно использовать 16, 18 и 20, но в этом случае надо исправить значение константы F_CPU в файле make_config.h и перекомпилировать firmware.

Потенциально возможно использование ATtiny2313-20PU, если пожертвовать функцией измерения напряжения батареи (в этом МК нет АЦП, да и памяти у него всего 2К).

МК питается от напряжения +5В, при этом согласование с сигнальной шиной обеспечивают стабилитроны D1, D2, которые должны быть 3V6 и не более 0,5Вт. Перенебрежение этими условиями может сделать обнаружение и обмен по шине нестабильными, более подробно можно почитать здесь и еще рекомендую обратиться к стандарту USB.

Мощность всех резисторов – 0,25 Вт, допустима погрешность ±5%. Резисторы R3, R4 и R5 – токоограничительные, для обычных светодиодов подойдут 330, 470, 1К. Конденсатор C4 фильтрует помеху по питанию, при использовании внутреннего супервизора питания ATmega, его емкость может колебаться в пределах 10...100 мкФ, устанавливайте максимально близко к разъему USB.

Для формирования напряжения 1,235 В с точностью ±1% используется элемент D3, LM385-1.2. Будьте бдительны: микросхема выполнена в корпусе TO-92, использованы два вывода из трех. Тем не менее, в некоторых даташитах дано неверное расположение выводов, например нарисованы 1 и 2, а на самом деле надо брать 2 и 3 (можно легко определить при помощи вольтметра). Поскольку этот элемент способен работать при токах до 10 мкА, номинал R9 может быть 10..47К.

Разъем программирования ICSP стоит устанавливать исключительно по желанию: не исключаю, что будут обновления firmware. Поэтому, если паяете МК без панельки – настоятлельно рекомендую ;)

После прошивки МК не забудьте установить фьюзы согласно документации.

Пояснения к работе с host-программой

Если все собрано правильно, то после подключения к шине USB Windows радостно сообщит об обнаружении нового устройства. Самое время установить драйвер libusb-win32, который существует в двух вариантах (выбирайте один из двух!):

1. Фильтр. Скачиваете установочный файл libusb-win32-filter-bin-x.x.x.x.exe и запускаете его на выполнение – для Vista надо сначала открыть его свойства и выбрать "Режим совместимости с Windows XP SP2" и "запуск от имени Администратора". Если вы из тех, кто читает мануалы, когда что-то не получается, то сейчас должны наблюдать печальную картину: все устройства USB, как один, перестали работать. К счастью, это не смертельно: через меню программ можно сделать uninstall и повторить установку согласно описанию выше.

2. Драйвер. Скачиваете архив с драйвером libusb-win32-device-bin-x.x.x.x.tar.gz, распаковываете. Подключите готовое устройство к шине и запустите inf-wizard.exe, который выкинет список устройств, ищите в нем VendorId= 0x16c0 и ProductId=0x5dc. Пройдите все шаги до конца, сохранив необходимый inf-файл под каким-нибудь именем. Теперь зайдите в Device Manager, удалите устройства, которые обозначены вопросиком и вновь отсканируйте шину (или просто переподключите устройство). Вот тут-то на риторический вопрос Windows "Что делать?" по поводу нового устройства, предложите ему сделанный на предыдущих шагах inf-файл.

Совсем подробные инструкции расписаны в секции Installation, в будущем постараюсь включить драйвер в один архив с проектом.

Запустите команду чтения напряжения:

smpusb voltage

в ответ вы должны получить текущее значение, положительное число от 0 до 3 В. Далее, чтобы прочитать образ картриджа:

smpusb read –f mk90.bin

Соответственно, чтобы записать:

smpusb write –f mk90.bin

При записи и чтении горят соответствующие светодиоды RX и TX.

Возможные неприятности:

USB error – проверьте, установлено ли у вас libusb-win32 и насколько корректно это сделано.

Could not find USB device "SMPreader" with vid= 0x16c0 pid=0x5dc – проверьте еще раз корректность сборки устройства и надежность его подключения к шине USB.

Поскольку я лицензировал поддержку USB у Objective Development по бесплатной схеме, то используется общее для всех устройств VID и PID, хост-программа пытается выбрать то, у которого строка названия продукта возвращается как "SMPReader". Кстати, из этого вытекает, что два SMPReader-а нельзя использовать одновременно, но кому такое может понадобиться?..

Остальные ошибки связаны с файловым вводом-выводом и относительно понятны, длинные имена файлов, особенно с пробелами, надо заключать в двойные кавычки.

В случае необходимости, можно попробовать добавить ключ –d, выводящий дополнительные отладочные сообщения.

Производитель СМП указывает, что минимальное напряжение, которое гарантированно обеспечивает хранение информации в СМП составляет 2.6 В, поэтому программа будет выдавать предупреждение о том, что оно ниже 2.7 и 2.6 В. Но по практике у меня случалось, что оно опускалось и до 1.8 В с сохранением информации, поэтому можно выключить это предупреждение ключом –p.

Поскольку я являюсь поклонником командной строки, то предоставляю возможность написать GUI желающим, все коды выхода описаны исходнике программы.

Пользуясь случаем, хочу поблагодарить Piotr Piatek-а за хак и публикование алгоритма обмена с картриджем СПМ МК-90. Если вы находите мой вариант устройства сложноватым, можете попробовать более простой вариант, который подключается к LPT-порту. Более подробно можно почитать здесь и здесь.

В заключение пара слов про минусы проекта:
  • отсутствие GUI
  • нет печатной платы
  • драйвер надо ставить отдельно
  • недостаточная проработка вопроса совместимости c Linux
  • не помешал бы консольный Makefile для сборки через nmake.
Постараюсь постепенно добавить все это в будущем, но буду признателен за любую помощь от энтузиастов ;)

11 комментариев:

  1. Я бы купил USB-программатор СМП, как отладите, а там и с драйвером, Makefile и прочим помог.

    ОтветитьУдалить
  2. Собственно, оно вполне рабочее, сейчас я готовлю вторую версию - действительно, кое-что пришлось скорректировать, плюс хочу, чтобы прошивка по USB заливалась.

    Встречный вопрос - а почему не хотите собрать самостоятельно - ведь вся документация опубликована? ;)

    ОтветитьУдалить
  3. Определенная нехватка времени и инструментов. ;)

    ОтветитьУдалить
  4. Не могу запустить smpusb. Окно программы на секунду появляется и тут же гаснет. Стоит ХР, программатор в устройствах определился. Ещё я не понял какие ставить фьюзы и поставил галочку только у SUTO=0.

    ОтветитьУдалить
  5. Программа - консольная. Без параметров она не запустится. Либо добавьте параметры, либо запустите cmd, а потом уже из него - программу.

    ОтветитьУдалить
  6. Программу запустил, батарейку меряет, правда я не нашёл LM385-1.2 без неё показывает 0.76в. При попытке записать или считать пишет file name needed for this operation. Образ называл mk90 и ложил в папку с программой.
    D:\>smpusb write –f mk90.bin

    ОтветитьУдалить
  7. Мистика... я скопировал строчку "smpusb write –f mk90.bin" из этого поста и вставил в программу, результат в предыдущем посте. Но тоже самое набраное вручную работает.

    ОтветитьУдалить
  8. Уважаемый автор, подскажите, пожалуйста, возможно заменить резисторы:
    68 Ом на 47 или 100 Ом;
    1,5 кОм на 1 или 2 кОм;
    22 кОм на 20кОм.

    ОтветитьУдалить
  9. 22К заменить на 20К вполне можно, играет роль подтягивающего. А вот перед тем, как экспериментировать с обвязкой линий USB, почитайте первоисточник.

    ОтветитьУдалить
  10. Хм, мало что понял), но лучше поищу номинальные =)
    Подскажите обновления более не планируются?)

    ОтветитьУдалить
    Ответы
    1. Ну там объясняется, почему номиналы именно такие - это связано с корректностью работы USB. Если будут ошибки - будут и обновления. Пока никто не сообщал...

      Удалить