Объявление

Свернуть
Пока нет объявлений.

Touch Memory - электронный идентификатор

Свернуть
X
Свернуть

  • Touch Memory - электронный идентификатор

    Введение

    В системах автоматической идентификации персонала, технических изделий, товаров наиболее популярными являются такие традиционные идентификаторы, как штриховой код и магнитная полоска.
    Однако, несмотря на простоту и дешевизну, эти идентификаторы имеют ряд существенных ограничений. К их недостаткам можно отнести незначительную информационную емкость, невозможность оперативного изменения записанных данных, большую зависимость от условий эксплуатации, а также необходимость использования специальных считывающих устройств, преобразующих оптические или магнитные сигналы в цифровой код.
    Широкое внедрение информационных систем в производстве, управленческой деятельности, финансовой области, торговле, социальной сфере потребовало создания более совершенных средств автоматической идентификации.
    К таким средствам можно с полным основанием отнести принципиально новый тип электронных идентификаторов американской компании "Dallas Semiconductor". Приборы семейства DS199X, получившие название Touch Memory, обладают целым рядом уникальных особенностей.
    Touch Memory представляет собой энергонезависимую память, размещенную в металлическом корпусе, с одним сигнальным контактом и одним контактом земли. Корпус, по виду напоминающий миниатюрную пуговичную батарейку, легко крепится на изделии либо на носителе (карточка, брелок). Информация записывается и считывается из памяти прибора простым касанием считывающего устройства корпуса Touch Memory.

    Организация памяти

    В семейство Touch Memory входят 5 приборов, идентичных по конструкции корпуса, но отличающихся функциональными возможностями, объемом памяти, а также методом доступа к ней (табл. 1).

    Тип прибора Уникальный серийный номер Объем блокнотной памяти в байтах Часы/ таймер Объем основной памяти в байтах Защита доступа к памяти Конструкция корпуса
    DS1990A + - - - - F5/F3
    DS1991 + 64 - 192 + F5
    DS1992 + 32 - 128 - F5
    DS1993 + 32 - 512 - F5
    DS1994 + 32 + 512 - F5
    В структуре Touch Memory можно выделить четыре основных блока: постоянное запоминающее устройство, блокнотную память, оперативное запоминающее устройство, часы реального времени (для DS1994), а также элемент питания - встроенную миниатюрную литиевую батарейку (рис. 1).


    Pис. 1
    Постоянное запоминающее устройство

    Каждый прибор Touch Memory содержит постоянное запоминающее устройство (ПЗУ), в котором хранится 64-разрядный код, состоящий из 8-разрядного кода типа прибора, 48-разрядного уникального серийного номера и 8-разрядной контрольной суммы (рис. 2).


    Pис. 2 Размещаемые в ПЗУ данные представляют собой уникальную кодовую комбинацию, которая записывается в прибор с помощью лазерной установки во время его изготовления и не может быть изменена в течение всего срока службы прибора. В процессе записи и тестирования на заводе гарантируется, что не будет изготовлено двух приборов с одинаковыми номерами.
    Так как при чтении данных из ПЗУ в любой момент возможно нарушение электрического контакта считывающего устройства с корпусом прибора, то необходимо контролировать целостность считываемых данных. Для этой цели в Touch Memory используется контроль циклически избыточным кодом (CRC).
    Предварительно рассчитанная контрольная сумма младших 7 байтов содержимого ПЗУ хранится в старшем байте. При чтении данных из ПЗУ в считывающем устройстве (персональная ЭВМ, микропроцессорный контроллер) вычисляется контрольная сумма, которая сравнивается с контрольным кодом, записанным в старшем байте. В том случае, если коды совпали, серийный номер считан верно. В противном случае выполняется повторное чтение данных из ПЗУ.
    Напряжение питания ПЗУ подается по сигнальной линии данных, что позволяет, во-первых, сэкономить , энергию встроенной литиевой батарейки, и во-вторых, считывать память всегда независимо от энергии батарейки.

    Оперативное запоминающее устройство

    Самый простой прибор семейства DS1990 содержит только постоянную память. Все остальные приборы имеют в своем составе также статическую оперативную память. Число циклов записи-чтения в эту память не ограничено. Питание памяти обеспечивается миниатюрной литиевой батарейкой, срок службы которой - 10 лет.
    Вся оперативная память разделена на отдельные страницы объемом по 32 байта. DS1992 содержит 4 страницы, которые обеспечивают хранение 256 байтов, DS1993 и DS1994 - 16 страниц, что позволяет хранить 512 байтов. DS1994 содержит дополнительную 17-ю страницу, которая имеет объем 30 байтов и предназначена для работы часов реального времени (рис. 3).


    Pис. 3 Так как данные записываются в память в момент касания считывающего устройства и корпуса прибора, то нарушение электрического контакта в этот момент может привести к разрушению информации в памяти.
    Чтобы предотвратить разрушение информации, в структуре Touch Memory предусмотрена дополнительная буферная память, которая выполняет функцию блокнотной области. Эта память защищает прибор от случайной записи новых данных на место имеющихся или от записи не по тому адресу. Объем блокнотной памяти равен объему страницы оперативной памяти - 32 байта для DS1992-94.
    Рассмотрим принцип работы блокнотной памяти. Все поступающие в прибор данные первоначально записываются в блокнотную память. Затем они передаются из нее в считывающее устройство, где сравниваются с данными, которые необходимо было записать. После верификации выполняется операция копирования содержимого блокнотной памяти в основную. Так как копирование выполняется внутри Touch Memory, то гарантируется целостность информации даже в случае нарушения внешнего контакта.

    Оперативное запоминающее устройство с защитой доступа

    Приборы DS1992-94 имеют идентичную по структуре оперативную память, любая страница которой доступна как по чтению (непосредственно), так и по записи (через блокнотную память).
    Прибор DS1991 имеет более сложную архитектуру оперативной памяти. В нем реализована на аппаратном уровне защита памяти от несанкционированного доступа. Вся энергонезависимая память разделена на четыре независимых страницы по 64 байта, одна из страниц - блокнотная память. Каждая страница основной памяти состоит из 48 байтов, предназначенных для хранения данных, и двух служебных полей по 8 байтов для хранения идентификатора и пароля (рис. 4).


    Pис. 4 Механизм доступа к памяти реализован с помощью двух ключей: открытого, хранящегося в поле идентификатора, и закрытого, записанного в поле пароля. Открытый ключ записывается и считывается, закрытый только устанавливается и не может быть прочитан. Закрытый ключ обеспечивает санкционированный доступ к памяти и защищен от случайного изменения с помощью открытого ключа.
    При первоначальном форматировании в служебные поля каждой страницы записываются коды открытого и закрытого ключей данной страницы. При любом обращении к памяти в DS1991 сначала передается закрытый ключ данной страницы. В том случае, если он совпадает с ключом, предварительно записанным в поле пароля, память будет доступна как по записи, так и по чтению. При несовпадении кодов данные в память не записываются, а в режиме чтения из DS1991 считывается последовательность случайных чисел.
    Для записи нового значения закрытого ключа в DS1991 необходимо передать код открытого ключа выбранной страницы. При совпадении этого кода с кодом, ранее записанным в поле идентификатора, в служебное поле данной страницы записываются новые значения обоих ключей, а область данных стирается. При несовпадении кодов значение закрытого ключа не изменяется.
    Реализованный в DS1991 механизм доступа к памяти обеспечивает надежную защиту памяти от несанкционированной записи-чтения, что в ряде применений крайне важно.

    Часы реального времени

    В DS1994 имеется схема часов реального времени.
    Встроенный миниатюрный кварцевый генератор, работающий на частоте 32,768 Гц, вырабатывает стабильные сигналы отсчета времени - 256 импульсов в секунду. Схема содержит три счетчика: 40-разрядный счетчик временных импульсов, 40-разрядный интервальный таймер, подсчитывающий время активного состояния сигнальной линии и 32-разрядный счетчик циклов, подсчитывающий число циклов обмена данными с прибором.
    Старшие байты счетчика временных импульсов и интервального таймера обеспечивают подсчет времени с секундной точностью.
    Помимо этих счетчиков, в схеме имеются три регистра аналогичного назначения. При совпадении текущего значения счетчика с предварительно записанными в регистре данными в статусном регистре устанавливается соответствующий флаг. Если при этом в статусном регистре установлен соответствующий разряд разрешения прерывания, то вырабатывается прерывание, которое может быть считано по сигнальной линии.

    Однопроводной интерфейс

    Отличительной особенностью Touch Memory является разработанный фирмой "Dallas Semiconductor" протокол обмена со считывающим устройством.
    Для приема-передачи информации используется одна двунаправленная сигнальная линия (второй провод - земляной контакт).
    Обмен по одной линии осуществляется в режиме полудуплекса (или прием, или передача). Взаимодействие приборов по однопроводному интерфейсу организовано по принципу "ведущий-ведомый" (master-slave). При этом считывающее устройство всегда ведущее, а один или несколько приборов Touch Memory - ведомые. Взаимодействие нескольких приборов со считывающим устройством по одной двунаправленной линии поддерживается аппаратными средствами Touch Memory.
    Протокол обмена по однопроводному интерфейсу является двухуровневым. На первом -логическом уровне для взаимодействия устройств используются команды обмена с ПЗУ и ОЗУ (табл. 2).

    Тип прибора Команды ПЗУ Команды блокнотной памяти Команды оперативной памяти Команды
    установки
    паролей
    Чтение
    Пропуск
    Сравнение
    Поиск
    Чтение
    Запись
    Копирование
    Чтение Запись Запись
    DS1990A + - - - -
    DS1991 + + + + +
    DS1992 + + + - -
    DS1993 + + + - -
    DS1994 + + + - -
    Группу команд обмена с ПЗУ составляют четыре команды: чтение ПЗУ, пропуск, сравнение и поиск. Две последние команды обеспечивают взаимодействие по одной линии нескольких Touch Memory со считывающим устройством. Команда сравнение инициирует обмен с прибором, серийный номер которого указан. Команда поиск позволяет определить серийный номер одного из приборов, подключенных к двунаправленной линии.
    Команды обмена с блокнотной и основной памятью обрабатываются Touch Memory только после исполнения одной из команд обмена с ПЗУ. Таким образом, при взаимодействии нескольких приборов, подключенных к одной линии, считывающее устройство посылает по линии команду сравнение, по которой выбирается только один прибор, принимающий в дальнейшем команды обмена с памятью.
    Все команды обмена имеют фиксированный размер - один байт, данные представлены 8-разрядными целыми числами. Ведущее устройство всегда инициирует обмен, посылая команды ведомому устройству.
    Протокол физического уровня используется для передачи команд и данных по однопроводному интерфейсу. Команды и данные передаются в последовательном коде. Для обеспечения целостности передаваемой информации протокол обмена на физическом уровне строго регламентирует временные параметры сигналов на линии.
    Протокол обмена данными состоит из трех основных циклов: инициализации, записи и чтения.
    Цикл инициализации является начальным циклом любого информационного обмена с Touch Memory. В этом цикле ведущее устройство опрашивает линию, определяя присутствие на ней Touch Memory. Синхронизация цикла инициализации осуществляется отрицательным импульсом сброса, формируемым ведущим устройством. После посылки сигнала ведущее устройство освобождает линию и переходит в режим приема. В том случае, если к линии подключен прибор Touch Memory, он обнаруживает синхросигнал ведущего и после временной паузы посылает ему сигнал опознания (рис. 5). Этот ответный сигнал информирует ведущее устройство о том, что имеется электрический контакт с Touch Memory и можно начинать обмен.


    Pис. 5 Данные передаются по однопроводной двунаправленной линии в течение дискретных временных интервалов, которые называются временными сегментами (типовая длительность - около 60 мкс). При передаче данных используется широтноимпульсный метод кодирования, напоминающий азбуку Морзе: в течение одного временного сегмента длинные или короткие состояния логического нуля на линии определяют значение передаваемого разряда. Обеспечивается скорость передачи данных до 16,6 кбит/сек.
    Синхронизация временного сегмента при записи осуществляется отрицательным фронтом сигнала, который формирует ведущее устройство. Для передачи в Touch Memory логической единицы ведущее устройство после посылки синхросигнала освобождает линию, для записи логического нуля ведущее устройство поддерживает низкое состояние линии в течение всего временного сегмента (рис. 6а). Описанный цикл записи повторяется для каждого передаваемого разряда команды.


    Pис. 6(а) В начале цикла чтения ведущее устройство также передает в линию синхронизирующий сигнал низкого уровня, после чего освобождает линию и переходит в режим приема. Далее в течение всего временного сегмента состояние однопроводной линии определяется ведомым устройством - Touch Memory. При этом логическая единица передается высоким уровнем, а логический нуль - низким уровнем однопроводной линии в течение всего, временного сегмента. Наилучший момент стробирования данных ведущим устройством - это 8 мкс после начала временного сегмента (рис. 6б). Цикл чтения одного разряда повторяется до тех пор, пока все данные не будут считаны.


    Pис. 6(б) В конце каждого временного сегмента ведущее устройство обеспечивает паузу в обмене (момент восстановления), удерживая линию в высоком состоянии. Возможна приостановка сеанса связи на любое время между временными сегментами, при этом на линии поддерживается высокое состояние. Во всех сеансах связи первым передается младший значащий разряд данных.

    Конструктивные особенности Touch Memory

    Целый ряд уникальных свойств Touch Memory обеспечивается благодаря необычному корпусу прибора. Кристалл памяти и миниатюрная литиевая батарейка смонтированы в герметичном корпусе из нержавеющей стали диаметром 16 мм и толщиной 5,8 мм (корпус F5) или 3,2 мм (корпус F3).
    Стальной корпус используется для осуществления электрических контактов. Корпус прибора аналогичен по конструкции корпусу пуговичной батарейки. Он состоит из ободка с донышком и электрически изолированной крышки. В отличие от обычных микросхем, доступ к содержимому памяти прибора осуществляется только через две линии: земляную и двунаправленную сигнальную. Ободок и донышко представляют собой земляной контакт, а крышечка выполняет функцию сигнального контакта (рис. 7а). Корпус может выдержать свыше 1 млн. механических подключений без заметного износа и стирания.


    Pис. 7а Для считывания данных из приборов Touch Memory используется контактирующее устройство Touch Probe (зонд), которое представляет собой механический узел, состоящий из двух штампованных металлических деталей, разделенных диэлектриком. Форма наконечника зонда сделана такой, чтобы он точно сопрягался с круглым корпусом прибора. При этом углубленная центральная область выполняет функцию сигнального контакта, а его ободок служит земляным контактом (рис. 7б).


    Pис. 7б Малые размеры Touch Probe позволяют встраивать его непосредственно в портативный микропроцессорный контроллер, прикреплять к любой поверхности или использовать в виде отдельного ручного устройства.
    Взаимодействие с прибором обеспечивается моментальным касанием зонда и корпуса Touch Memory таким образом, что донышко прибора контактирует с углубленной центральной областью зонда, а ободок - с боковой поверхностью зонда.
    Использование простого по конструкции электрического интерфейса обеспечивает высокую механическую прочность Touch Memory, поскольку у него отсутствуют штырьки или контакты, которые можно повредить.

    Надежность

    Одним из основных преимуществ Touch Memory по сравнению с идентификаторами других типов является их высокая надежность. Приборы Touch Memory выдерживают механический удар 500 g, падение с высоты 1,5 метра на бетонный пол, 11-килограммовую нагрузку на корпус, не подвержены воздействию магнитных и статических полей, промышленной атмосферы и работают в диапазоне температур от -40'С до +85'С для DS1990 и от -20'С до +85'С для всех остальных приборов семейства.

    Заключение

    Уникальная конструкция корпуса и простой электрический интерфейс Touch Memory позволяют значительно расширить область применения электронного идентификатора по сравнению с традиционными средствами, а в некоторых системах и заменить их.
    Внедрение технологии Touch Memory в СНГ существенно отличается от внедрения систем с обычными идентификаторами. Если системы с магнитными карточками, штрих-кодами и более современные с микропроцессорными карточками закупаются полностью за рубежом, то все оборудование и программное обеспечение для систем с Touch Memory разработано и выпускается отечественными предприятиями. Такой путь является существенно более дешевым и перспективным, так как, с одной стороны, позволяет использовать высокий потенциал отечественных разработчиков и легко адаптировать системы к требованиям конкретных применений, а с другой - дает возможность совершить технологический скачок, внедряя в короткие сроки наиболее передовую технологию.
    Наиболее широкое применение приборы Touch Memory находят в системах управления физическим доступом в помещения, здания и доступом к информационным ресурсам, оборудованию, в системах безналичных электронных платежей, автоматической идентификации изделий, объектов.

      Возможность размещать комментарии к сообщениям отключена.

    Метки статей

    Свернуть

    Меток пока нет.

    Новые статьи

    Свернуть

    • Эссе об авторизации таксофонных карт
      admin
      Путешествуя по рунету в поисках любой информации об эмуляторах смарт карт синхронного режима стандарта ISO7816 заметил интересную особенность: информации почти нет, а то что можно найти списано с одного источника (Phrack Magazine 48 выпуск) в разных вариациях. И ни слова я не нашел об авторизации смарт карт в таксофоне. На самом деле, любой кто подумывал о создании эмулятора...
      04.02.2017, 10:48
    • Устройства бесконтактной идентификации
      admin
      В общем случае система бесконтактной идентификации состоит из двух частей: ключ и считыватель.
      Ключ

      Ключ представляет собой миниатюрный чип и антенну, которые затем запрессовываются в некоторый корпус (пластиковая карточка, авторучка, подошва обуви и т. д.). На рисунке, взятом из технического описания на чип H4100 фирмы EM-Marin показана схема такого ключа. ...
      04.02.2017, 10:48
    • Трактат о проектировании эмуляторов таксофонных карт
      admin
      Я считаю, что было бы совершенно неправильно, если бы вообще кто-либо публиковал рабочую прошивку эмулятора, тем самым обесценивая полученный результат. Потом каждый ламер сможет фыркнуть на вашу работу - "это все из инета скачать можно ...". Если вы трахались над нею более года, вам будет очень обидно. А если учесть, что "золотые" телефонные карты продаются в питере по цене около ста баков за штуку, то и тем более не стоит.
      К тому же, очень многим прошивка не поможет. Такого, чтобы заработало сразу - не бывает. Грабли будут. А грабли обходить - нужно понимать, что ты делаешь, как оно все работает и как оно должно работать. В общем случае, достаточно наличия восхищения двумя книгами - "искусство программирования" кнута и "искусство схемотехники" хоровица / хилла. А большинству читателей этой конфы неплохо бы перечесть школьный курс физики в разделе "электричество". Чтобы было поменьше "гениальных" идей, типа ламинирования магнитной карты.
      А то, к примеру, вам потребуется собрать считыватель телефонных карточек. Вы припаяете правильно все проводки, запустите правильную прогу... А в сетапе компа стоит двунаправленный /eрр/ режим параллельного порта...
      И - жопа...
      Работать не будет. А это даже не грабля, это так - грабелька. В этой конфе постоянно жалуются, что не получается считать карточку. Прикидываю, поля, усеянные граблями, на которых заблудились эти несчастные.
      Но, я прикололся, и хочу показать, как примерно должна выглядеть разработка эмулятора. Дабы было меньше неконкретных вопросов на эту тему. При этом будут использованы ошметки моих первых, порой забавных, попыток в этой области. Ценность их для меня сейчас не велика, поскольку я и сам не знаю можно ли их довести до рабочего результата /то была тупиковая ветвь разработки/, но жалко, если какие-то изюминки пропадут, когда-нибудь, без следа, раздавленные клавишей F8. Пусть будут в эхе.
      Во избежание разглашения know нow я сменю микропроцессорную платформу, при обсуждении. Ее выбор будет более или менее дебильным. Таким, чтобы воспользоваться этим текстом, как инструкцией по сборке, было бы совершенно невозможно. Только, как руководством к действию. На пик процессоре эмулятор вы уж реализуйте на досуге как-нибудь сами...
      Итак, предположим вам втемяшилось в голову разработать эмулятор на самой неподходящей для этого платформе. Например, на однокристалке из семейства mcs-48 фирмы интел i8048, КР1816ВЕ48, i8035, i8039, etc./. Ну уперлись рогом и все тут.
      Процессоры 8048, 8035, при максимальной тактовой частоте 6 mнz исполняют одну команду за 2.5 или 5 мкс. А минимальные времена импульса и промежутка между импульсами сигнала clk при чтении карточки определены в 8 и 10 мкс. На период событий в нашей системе будут приходится 3-7 команд процессора. Ясно, что это недопусимо мало. Процессоры i8049 и i8039 чуть быстрее. К ним можно прилепить кварц 11 Mнz и команда будет выполняться за 1.36 или 2.72 мкс. Поскольку, таксофон, наверняка, работает с карточкой на частоте меньше максимальной (для надежности), может быстродействия нам и хватит. Если Будем экономить каждый такт процессора. Короче говоря, столь странный Камень выбран для того, чтобы сделать более выпуклой битву за быстродействие, которая является непременным спутником разработки любого эмулятора.
      Поскольку таксофон, при отнятии единицы, снимает питание с карточки и перечитывает ее заново, а встроенной энергонезависимой памяти в нашем проце нет, то ясно, что придется сделать внешнее питание. А то, при снятии питания, проц будет забывать сколько осталось единиц. Чтобы батарейка работала подольше, берем кмоп вариант проца. Чтобы никакие дополнительные мелкоcхемы, типа защелки или пзу-хи /27C16/ не потребляли лишнего тока, берем проц со встроенным перешиваемым пзу. Будем лить программу внутрь. Короче говоря, выбираем i87C49 (кажется у него даже есть аналог КР1835ВЕ49). Максимально допустимая частота кварца для этого процессора 11 mнz (одна команда за 1.36 или 2.72 мкс). Но, не забудем, что процессоры можно разгонять. Поэтому эксперименально подберем максимальную частоту кварца, при которой проц будет работать без глюков. Не забудем, при этом, контролировать частоту генерации Частотомером на ноге xtal2. А то, при подключении слишком высокочастотных кварцев, генерация может начаться на паразитных r и c, а не на частоте резонатора. Пик-процессоры, например, разгоняются аж в 2 раза. Мой PIC16C84-04/SO работал на 10 mнz-ах и изредка глючил на 11.7. А PIC16F84-10I/SO еще Пахал на 21mнz-е и напрочь отказался лишь на 24-х.
      Поскольку, эмулятор получается батарейным, то отпадает проблема, которая мучит разработчика эмулятора с питанием от таксофона - минимизация времени старта процессора. Таксофон, после подачи питания, делает жутко малую выдержку прежде, чем начать читать карту. Если, к этому времени поцессор не успел стартовать, исполнить секцию инициализации программы и добраться до главного цикла, то данные, прочитанные таксофоном, будут представлять совершеннейший shit. Но процессору-то надо дать время сброситься, а тактовому генератору раскочегариться и устаканить свои колебания. Напомню, что кварцевый резонатор начинает генерацию вовсе не сразу после подачи на него питания. Пик-процессор, например, при старте отсчитывает 1024 импульса от кварца, в качестве выдержки на стабилизацию его частоты, прежде чем начать ход по программе. Очевидно, что время между подачей напряжения питания и первым импульсом от кварца является просто мертвым временем, бесполезно увеличивающим время прихода процессора в чувство. Мертвое время зависит от величин емкостей, подключенных к выводам кварца и имеет четко выраженный минимум. Оно велико при слишком маленьких и слишком больших емкостях. У керамического резонатора это время порядка десятков микросекунд, а у кварца это - единицы миллисекунд ! Так-что, взяв двухлучевой запоминающий осциллограф, желательно минимум этого мертвого времени, для конкретного экземпляра кварца, найти, перебирая величины подключенных к нему емкостей.
      Опять таки, поскольку эмулятор получается батарейным, нет необходимости оптимизировать секцию инициализации программы. Можно, не торопясь, скопировать все или часть данных из пзу в озу. В нашем случае в озу Будут храниться только изменяемые данные, соответствующие кредиту карты. Неизменяемые данные (серийный номер карты, сертификат и т.п.) будут храниться в пзу. Для ускорения доступа к данным будем, при старте Программы, копировать данные в озу по тем-же адресам, что они лежали в третьей странице пзу. Это позволит использовать один указатель для доступа и к изменяемым и к неизменяемым данным.
      Теперь изобретаем схему. Схему всегда нужно проектировать так, чтобы программа для нее имела максимальное быстродействие. То есть первый этап оптимизации программы - схемотехнический.
      Во первых, смотрим - можно-ли обнаруживать какие-либо события аппаратно (а не программно), заводя сигналы на ноги прерывания микропроцессора. Пусть железо, жесткая логика, вберет в себя часть алгоритма. Нужно максимально использовать аппаратные возможности микросхемы, обрабатывая импульсы по прерываниям, а не опросом линии в цикле.
      Карточка, при чтении, по фронту clk увеличивает на один внутренний адресный счетчик. Но состояние своего выхода не меняет. И выдает новый Бит лишь по спаду сlk. Наш-же эмулятор, обнаружив clk, будет в течение нескольких команд процессора соображать по программе, что к чему и какой бит вывести. Поэтому ясно, что эмулятор должен срабатывать по фронту clk. Он будет выдавать следующий бит с задержкой от фронта. Если таксофон будет очень привередничать можно, вставляя noр-ы, манипулируя частотой кварца, а также выравнивая плечи по временам исполнения, приурочить этот момент как раз на спад clk. Хотя реально такие тонкости вряд-ли понадобятся. То есть необходимо прерывание по фронту clk. Но наш гребаный процессор имеет вход int, который срабатывает по отрицательному перепаду /из 1 в 0/. ну не ставить-же инвертор в самом деле. Волей-неволей с идеей прерываний приходится распрощаться. Будем опрашивать линии сами.
      Куда-же засунуть этот clk. Какой-нибудь программист тут-же ляпнул бы - да на порт ввода-вывода /например р1.0/. И обрабатывал линию бы так :
      in a,р1
      jb0 clock_рrisнel - в 4 такта процессора а если-бы условный переход нужен был бы по отсутствию clk : in a,р1
      cрl a
      jb0 netu_clocka - 5 тактов
      / команды jnb в этой варварской системе команд нету / А вот человек, исповедующий идею аппаратной оптимизации программ, засунул бы линию clk на ногу t0, а линию rst на ногу t1 и ветвился бы в два такта по обоим условиям - jt0, jnt0, jt1, jnt1.
      Вот линию out некуда присоединить, кроме как к какой-нибудь линии порта ввода-вывода. Причем приверженец схемотехничесого вылизывания программ предпочел бы именно нулевой бит какого-нибудь порта /например р1.0/. Почему ? А это предоставляет возможность писать максимально лаконичные куски кода для манипулирования этим выходом. Ниже вы это увидите.
      Но сначала вопрос - как хранить данные карточки, для максимально быстрого оперирования ими. Во первых как их вообще представлять - по биту в байте или упаковать по 8 бит в байт. Если хранить весь дамп Карты в 16-и байтах, то при чтении, а это самая быстрая операция карточки, пришлось бы проверять постоянно - надо ли читать следующийБайт или все еще вращать / сдвигать этот. Зато как легко выполнялся бы Writecarrу - послал в память байт ff и все. Но операция writecarrу будет происходить около 10 мс. Поэтому оптимизируем по быстродействию в пользу read, а уж при writecarrу времени послать 8 байт хватит. То есть храним данные карточки в 128-и байтах, причем смысл данных будет иметь только младший бит в байте. При этом, все операции получаются легко и непринужденно.
      Посылка следующего бита на выход :
      1. Неизменяемых данных из rom
        inc r0 - увеличение на единицу адресного счетчика
        mov a,r0
        movр3 a,@a - чтение байта из встроенного пзу
        outl р1,a - нужный бит данных на выходе р1.0
        остальные бита порта р1 никуда не подключены пусть изменяются как им угодно
      2. Изменяемых данных из ram inc r0 - увеличение на единицу адресного счетчика
        mov a,@r0 - чтение байта из встроенного озу
        outl р1,a - нужный бит данных на выходе р1.0

      Теперь в алгоритме нужно, как-то, определять какой байт читать из озу а какой из пзу. В каждом байте у нас осталось по 7 бесхозных бит. Пусть один из них (например первый) определяет статус данных - если он Сброшен, то данные надо искать в озу, а если выставлен - в пзу :
      inc r0 - увеличение на единицу адресного счетчика
      mov a,r0
      movр3 a,@a - чтение байта из встроенного пзу
      jb1 rom
      RAM: mov a,@r0 - чтение байта из встроенного озу
      ROM: outl р1,a - нужный бит данных на выходе р1.0
      Очень просто получается операция write :
      anl р1,#0feн - сбросить линию out в ноль
      inc @r0 - поскольку до write бит был заведомо выставлен, то после inc он будет заведомо сброшен.
      Операция writecarrу тоже выглядит вполне ничего для 10 мс, отведенных для нее. Поскольку до writecarrу восемь бит были заведомо нулевыми, восемь inc-ов сделают их заведомо единичными -
      mov a,r0 - текущий адресный счетчик
      anl a,#0f8h
      add a,#8 - вычислено начало восьмерки бит /лотка 8-чного абака/
      mov r1,a
      inc @r1
      inc r1
      inc @r1
      inc r1
      inc @r1
      inc r1
      inc @r1
      inc r1
      inc @r1
      inc r1
      inc @r1
      inc r1
      inc @r1
      inc r1
      inc @r1
      Короче говоря, исходный текст того, что получилось вы увидите в хвосте этого документа. В программе сами собой получились фичи, существенно необходимые для эмулятора, например, наличие 512-битного кольца данных. В реальной карте 9-битный адресный счетчик и он запросто переполняется. Правда, у нас получилось 256-битное кольцо. Но раз есть 256-битное, то и 512-битное тоже есть.
      Получившаяся программа обладает вполне не дурными временными характеристиками. По приходу clk, данные на выходе, появляются спустя 9-13 тактов процессора. Для 11 mнz-ового кварца это - спустя 12-18 мкс после фронта clk. Вполне пристойный результат для такой убогой архитектуры. Это лишь в 2-3 раза хуже того, что можно получить на пик-е. Впрочем, для некоторых типов таксофонов этого вполне достаточно. Кстати, у процессора i8049 128 байт встроенного озу, в отличие от 64 байт у i8048. Поэтому, можно, при инициализации программы, переместить все данные в озу. В результате в быстродействии операции чтения можно выиграть еще 2 такта. Переключать чтение данных из пзу в озу и обратно уже будет не нужно. Read: mov a,r0 - текущий адресный счетчик inc a - его увеличение anl a,#7fн - кольцо теперь должно быть 128-битным mov r0,a mov a,@r0 - чтение из озу outl р1,a - бит данных на выход Но я, из принципа, написал код, который бы работал на любом процессоре cемейства mcs-48. А теперь пара нетривиальных советов по программированию однокристалок. Напрочь забудьте то, как вас учили программировать. Программу надо писать так, чтобы дейкстра (основатель структурного программирования), Прочитав ее, #%нулся бы в обморок. И приправить ее солидной порцией шизы. Есть примета, что программы для такого рода вещей, написанные без доли шизы, реально не работают. На некоторых архитектурах, особливо интеловских, без извращений - никак. Например, в нашей программе часть данных, соответствующая кредиту карты копируется в озу. Причем эти данные полностью перекрывают область стека. Но, поскольку, я нигде не вызываю подпрограмм и прерывания у Меня запрещены, то что тут такого ? Дамп карточки в программе лежит не по порядку, а завернувшись в кольцо, используя то обстоятельство, что адресный счетчик r0 переполняется /точнее лежит полузавернувшись в кольцо, или завернувшись в полукольцо, как кому больше нравится/. В результате возможно всего двумя командами mov a,r0 jb7 failure Различать попытку записи в область единиц и попытку записи в Manufacturer area. Таксофон так делает, в качестве противодействия Эмуляторам. Эта изюминка с кольцом, требует волей-неволей организовать другую - адреса 0 и 1 используются одновременно и как рабочие регистры r0 и r1, И как ячейки для хранения двух бит кредита карты. Фокус в том, что приходящиеся на эти ячейки биты дампа карты (два старших бита кредита) всегда должны быть нулевыми, поскольку не бывает карт с кредитом больше Чем 7*4096-1=28671 единица. И всегда, когда к r0 и r1 обращаются, как к хранителям дынных карточки, они оказываются с нулевым младшим битом ! Каким образом так получается ? Регистр r0 используется как адресный счетчик (указатель). Когда ему случится указать на самого себя, он, естественно, будет равен нулю, а значит и младший бит его будет равен нулю. Регистр r1 всегда, по окончании использования, - anl a,#0f8н ; a.0 ...
      04.02.2017, 10:48
    • Тайна карт Московского метрополитена
      admin
      ...
      04.02.2017, 10:48
    • Протокол POCSAG и его применение
      admin
      Формат POCSAG-кода.
      Информация на пейджер в стандарте POCSAG передается в двоичном виде,по битам. Структура посылки изображена рис. 1.
      Преамбула Пакет 1 . . . Пакет N
      рис. 1
      Каждая передача начинается с преамбулы - последовательности битов:10101010... - по этому сигналу производится предварительное включение пейджера и определяется скорость передачи данных ( 512/1200/2400 ). Далее следуют пакеты с данными. Каждый пакет представляет собой последовательность из 17-ти кодовых слов (рис. 2), кодовое слово (CW) - последовательность из 32-х битов. Кодовые слова бывают:
      • синхронизации - для синхронизации фреймов в пакетах.
      • адреса - для передачи САР - кода, рис.3.
      • сообщения - для передачи текста сообщения, рис.4.
      • пустые - для заполнения пустых фреймов.
      Фрейм 0 Фрейм 1 Фрейм 2 Фрейм 3 Фрейм ... Фрейм 7
      ...
      04.02.2017, 10:48
    • Приемники пейджинговых сообщений
      admin
      Телевизор в качестве приёмника...
      04.02.2017, 10:48
    Обработка...
    X