Продолжение: Закрываем комп на амбарный замок

Начало статьи

Сборка

Плату я делал методом ЛУТ. Он уже упоминался на страницах журнала (см. материалы к статье «Dl HALT'a» в номере ) ( 118, октябрь 2008 года). Технология довольно проста и дает неплохие результаты. Плата для этого устройства должна получиться у тебя с первого раза. Ну, или со второго. Если нет желания заморачиваться с утюгом, то можешь собрать схему на макетной плате, благо деталей там совсем немного. Корпус можно сделать из чего угодно. Мой когда-то был корпусом от блока питания. Если ты решил поставить устройство в корпус компа, то можешь использовать в качестве основы заглушку от флоппивода или дисковода. В приложении к статье есть плата, нарисованная под заглушку от FDD. Посмотреть эту схему можно в бесплатной программе ViewLayout (qoo.gl/kRKXE).

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

Алгоритм работы

В качестве языка разработки я выбрал Паскаль. Вообще, 95% программ под МК пишутся на Си или ассемблере, но первый я на AVR не пользую, а второй только в виде вставок по ходу программы. За компилятор сойдет MikroPascal for AVR (буква «к» — не баг, а фича). У него ограничение до 2 КБ кода в бесплатной версии. Этого нам более чем достаточно — у Tiny13 всего 1 КБ флеш-памяти. В начале, при подаче питания нужно инициализировать периферию. Большая часть устройств не используется, поэтому мы их не трогаем.

ACSR.ACD := 1; //Отключаем аналоговый компаратор
DDRB := %00010001; //Переключаем на выход //пины: В4 (транзистор) и В0 (светодиод) PORTB := %00001001; //Включаем подтягивающий резистор на кнопке MCUCR.SM0 1; //Тип спящего режима - power down MCUCR.SE := 1; //Спящий режим разрешен asm sei end; //Глобально разрешаем прерывания

После того, как МК настроит периферию, он продолжает работать в обычном режиме.

GIFR.INTF0 := 1; //Сбрасываем флаг прерывания GIMSK.INT0 := 1; //Разрешаем прерывание asm sleep end; //Отбой!

Настраивает прерывание INTO (которое висит на ножке В1) и переходит в спящий режим.

Обрати внимание, что остальной код (чтение ключа, сравнение и включение компа) идет сразу после команды sleep. Когда произойдет прерывание, МК проснется и бросится в обработчик INT0_rq. В этом обработчике только одна команда — отключение прерывания, чтобы оно не возникало во время обмена данными с ключом. После обработчика МК вернется к тому месту, откуда он прыгнул в прерывание (к команде sleep) и начнет выполнять код дальше.

Delay_ms(2); //Задержка, чтобы ключ успел //выйти в рабочий режим DDRB.1 := 1; //Даем RESET Delay_us(500); DDRB.1 := 0; Delay_us(50); //) пGосле этого линия должна быть прижата //к земле PRESENCE-сигналом if PINB.1=1 then continue; // Если PRESENCE нет, то прерываем процесс Delay_us(250); //Ждем еще немного //PRESENCE-сигнал должен закончиться ReadiButton; //Читаем ключик if CRC_OK о 0 then continue; //Если CRC не совпало - попробуем еще раз

Сначала он ждет несколько миллисекунд. Нужно это для того, чтобы конденсатор в ключе полностью зарядился, и он вошел в рабочий режим. Потом МК подает RESET-сигнал. Для этого он переключает бит 1 в регистре DDRB. Каждый бит этого регистра отвечает за соответствующую ножку МК. Единица означает, что ножка настроена на выход, а логический уровень на ней (проще говоря, напряжение) задается битом в регистре P0RTB (у нас туда записан ноль). Ноль в DDRB значит, что ножка настроена на вход. Вот и получается, что записав в DDRB 1, МК прижимает ножку к земле, а записав 0 — отпускает, и ножка висит на внешнем pull-up-резисторе. После RESET-сигнала МК проверяет, есть ли сигнал PRESENCE. Если нет, то идет снова спать — это был не ключ, а какая-то помеха. Если же ключ ответил, то МК выполняет процедуру чтения. Ее код я приводить не буду, ибо он довольно большой. В этой процедуре происходит вот что:

  1. Сначала подается команда на чтение ROM-памяти — 0x33.
  2. После этого МК читает 8 байт, попутно считая CRC: результат этих подсчетов он запишет в переменную CRC_0K.
  3. Прочитанные байты складываются в массив R0M_Data.

Для расчета CRC используется табличка на 256 байт. Вначале переменная CRC обнуляется, и с каждым байтом кода проводится такое действие — CRC := CRC_Table[CRC xor DataByte];. В результате, если все байты передались верно, в конце CRC будет = 0. CRC вычисляется при каждом чтении ключа, «на лету». После выполнения функции ReadROM-программе остается только посмотреть на переменную CRCJDK. Если она = 0. то ключ пропитался верно. Если тебе интересен «нормальный» алгоритм расчета CRC, без таблицы, то можешь заглянуть в документацию на iButton (есть на диске) или в «Википедию» (CRC8).

Далее МК проверяет нажата ли кнопка «learn». Если нажата, то только что прочитанный ключ записывается в EEPR0M, после чего МК снова идет спать. Если кнопка не нажата, то МК сверяет то, что он прочитал, с тем, что записано в EEPR0M. И если коды совпали — врубает комп. Потом пройдет небольшая пауза, цикл повторится снова, и МК заснет в ожидании ключа.

Программатор и прошивка

Наверное, самый важный вопрос связан с прошивкой микроконтроллера — как, чем, куда? Если у тебя есть рабочий программатор, который ты вполне успешно используешь, то эту часть можно невозбранно пропустить: здесь рассказывается о том, как собрать простенький программатор для AVR и прошить с его помощью МК.
Программаторов для AVR существует целая куча. Но здесь мы рассмотрим одну из самых простых и «дубовых» моделей — программатор Громова.
Этот программатор подключается к СОМ-порту. Со всякими переходниками USB-COM работает очень плохо. Гораздо лучше с переходниками PCIoCOM или «железным» портом. Если на заднице компа ничего похожего на СОМ-порт не заметно, это не значит, что его нет. Возможно, разъем просто не распаян на плате, а место под него есть. В таком случае можно либо попытаться запаять разъем на место, либо забить и не рисковать материнкой :).
Для сборки программатора тебе понадобятся семь резисторов и три диода. Немного, правда? :) Резисторы можно взять номиналом от 1 до 10 килоом, диоды — любые из маломощных.
Схему программатора ты можешь видеть на рис. 5. Собрать его можно хоть на макетке, хоть просто навесным монтажом. Обрати внимание, что питание для МК при прошивке нужно брать из отдельного источника. Если этот источник связан с компом (например, +5 В от USB), то достаточно просто подключить его к ножке Vcc МК. Если же источник это какой-то внешний БП или батарейка, то нужно прицепить к МК не только питание, но и землю (Gnd).
Для работы с этим программатором используется программка Uniprof. Ее ты можешь найти на диске. При запуске Uniprof автоматически проверяет, подключен ли МК, и показывает его название. Подключив к программатору ATTiny13, ты должен увидеть над окошком flash синюю надпись «(1 К, 64) Tiny13» — 1 килобайт флеш-памяти и 64 байта EEPR0M. Если вместо этого программка выкидывает тебе сообщение об ошибке, то проверяй сборку (замыкания или непропай) и правильность подключения. Перед прошивкой флеш-память надо очистить кнопкой «Erase».

Потом загружаем файл с прошивкой кнопкой «открыть» с надписью «hex» (он лежит в приложении к статье, в папке firmware). Слева появляется содержимое файла в шестнадцатеричном виде. Осталось только нажать «PROG» для начала прошивки. Если в процессе прошивки возникнут ошибки, то стоит попробовать укоротить провода от программатора до МК. В идеале их длина должна быть не больше 10 см. Также стоит прозвонить схему тестером на предмет замыканий или разрывов. Предлагается водосточная система кровли цена недорого. .
Для правильной работы программы тебе потребуется выставить fuse-биты. Это специальные настроечные флаги, позволяющие менять частоту МК, источник тактового сигнала и другие параметры. Здесь надо соблюдать осторожность — если неправильно выставить фьюзы, то можно заблокировать МК.
Тебе надо отключить флаг CK0IV8, который отвечает за делитель тактовой частоты. По умолчанию он включен, и МК работает на частоте 1,2 МГц, а нам нужно 9,6 МГц. Для работы с fuse есть кнопка с соответствующим названием. В окошке fuse ты увидишь список всех фью- зов для этого МК. Перед тем как что-то менять, надо нажать кнопку «Read» под нужной колонкой, чтобы прочитались текущие значения флагов. Фьюзы в AVR инверсные, то есть пустой квадратик напротив CKDIV8 значит, что делитель включен. Для того чтобы его отключить, ставь галочку напротив фьюза и нажимай кнопку «Write», под нужной колонкой. Все, флаг выставлен и начнет действовать после перезапуска МК.

Заключение

Устройство получилось довольно простое, но вместе с тем полезное. Конечно, какой-либо надежной защиты компьютеру оно не дает, но спасти от посягательств младшего брата вполне может :). Да и создавалось оно мной, в первую очередь, для изучения AVR и протокола 1-wire. Впрочем, замок можно использовать не только для включения компа. Ты можешь подключить к нему реле и управлять электромагнитным замком, или сервомашинку — для того, чтобы открывать и закрывать дверь. Главное — твоя фантазия и умение применить возможности МК.

Похожие статьи