
- •Оглавление
- •Введение
- •1. Обзор iButton.
- •2.Принципы конструкции iButton и считывающих устройств для них.
- •2.1. Используемый интерфейс iButton
- •2.2. Физическая реализация интерфейса One-Wire
- •2.3. Передача данных в сети One-Wire
- •2.4. Протокол обмена информацией
- •3.Описание протокола эмулятора iButton
- •3.1. Описание работы эмулятора домофонного ключа
- •4. Алгоритм работы эмулятора домофонных ключей.
- •Заключение
- •Список использованных источников
- •Приложение а
- •Приложение б
- •Приложение в
4. Алгоритм работы эмулятора домофонных ключей.
Алгоритм работы устройства,(блок схема указана в приложении А).
Инициализация периферии. Отключение компаратора и проверяем куда подключен переключатель.
Ожидание 50мс. За это время конденсатор должен полностью зарядиться, питание стабилизироваться.
Читаем переключатель и выбираем, с какого адреса начинать чтение. В EEPROM хранятся полные коды ключей, т.е. все 8 байт. Читаем нужный код из EEPROM в оперативную память.
Ожидаем RESET импульса на линии One-Wire. Как только RESET подан, отвечаем PRESENSE.
Принимаем код команды, которую нам сообщает домофон. Если команда 0×00 или 0xFF это значит, что идет процесс записи в память или чтение памяти — переходим к соответствующим функциям.
Домофон находится в стадии приема данных. Выдаём ему код из оперативной памяти состоящий из 64 бит.
На случай, если домофон захочет прочитать ключ ещё раз. После основного алгоритма идут процедуры чтения и записи EEPROM, где при чтении сначала извлекается байт из EEPROM, потом эмулятор даёт его прочитать. При записи принимается байт и записывается в EEPROM. И так будет пока не записана/прочитана вся оперативная память (64 байта).
Заключение
В результате выполнения курсовой работы был реализован прототип программно-аппаратного комплекса эмулятор домофонного ключа
Основная задача комплекса хранение домофонных ключей и открытие домофонных замков.
К недостаткам системы можно отнести ограниченная память микроконтролера и сложность реализации.
Список использованных источников
iButton обзор [Электронный ресурс] http://www.ibutton.ru/about/info/Дата обращения:15.06.2012.
Дурим домофон, или «Ключ от всех дверей-2» [Электронный ресурс] http://www.xakep.ru/magazine/xa/104/026/1.aspДата обращения:15.06.2012.
Интерфейс 1-Wire. [Электронный ресурс] http://www.radiokot.ru/articles/13/Дата обращения: 15.06.2012.
Рынок Микроэлектроники [Электронный ресурс] http://gaw.ru Дата обращения:15.06.2012.
Все для копирования домофонных ключей [Электронный ресурс] http://ikey.ru/ds1990#5-3Дата обращения:15.06.2012.
Приложение а
Блок-схема эмулятора ключей iButton.
Приложение б
Листинг кода программы эмулятора.
.include "tn13def.inc"
.def rKeyAddr = r21
.equ aKey = 0x60
.equ Tumbler_0 = 3
.equ Tumbler_1 = 4
.equ Tumbler_2 = 2
.equ Dq_pin = 0
.cseg
SBI ACSR, ACD ; Отключаем аналоговый компаратор.
ldi r16, 0
out DDRB, r16
ldi r16, (1<<4)|(1<<3)|(1<<2) ;Ставим подтяжку на пины 4,3,2 порта B.
out PORTB, r16
;Задержка в 50mS для подзарядки.
LDI R17, 78
LDI R16, 235
BigDelay0:
DEC R16
BRNE BigDelay0
DEC R17
BRNE BigDelay0
; Читаем переключатель:
in r16, PINB
com r16 ;Инвертируем.
;Исходя из положения переключателей, сопоставляем адрес кода нужного ключа.
;Делаем это, переставляя биты.
ldi rKeyAddr, 0
BST R16, Tumbler_1
BLD rKeyAddr, 4
BST R16, Tumbler_0
BLD rKeyAddr, 3
BST R16, Tumbler_2
BLD rKeyAddr, 5
;Убираем подтяжку с порта B
ldi r16, 0
out PORTB, r16
;Достаём из EEPROM код ключа.
;В оперативке он будет располагаться по адресу aKey и занимать 8 байт.
ldi ZL, aKey
clr ZH
clr R17
FillMemCycle:
mov R16, rKeyAddr
add R16, R17
out EEARL, R16
SBI EECR, EERE
in R16, EEDR
ST Z+, R16
inc R17
cpi R17, 8
brne FillMemCycle
MainCycle: ; Начало основного цикла.
;ждём пока домофон даст reset:
SBIC PINB, Dq_pin
rjmp PC-1
; Пропускаем RESET, Ожидайте окончания импульса.
SBIS PINB, Dq_pin
rjmp PC-1
SBI DDRB, Dq_pin ;Прижимаем линию к земле.
ldi r16, 40 ; Ожидайте 100uS
dec r16 ; Это мы подаём PRESENSE импульс
brne PC-1
CBI DDRB, Dq_pin
ldi r16, 4 ; Ожидайте 10uS
dec r16 ; За это время линия должна подняться после PRESENS импульса.
brne PC-1 ; Длительность взята с большим запасом.
;Принимаем команду, которую даёт нам домофон.
clr R18
ldi R17,8
ReadCommCycle:
SBIC PINB, 0 //Ожидайте \___
rjmp PC-1
ldi r16, 8 ; Ожидайте 25uS
dec r16 ; Если после этого линия поднялась, значит передали единичку
brne PC-1 ; Иначе - ноль
in R16, PINB
LSR R18
BST R16, 0
BLD R18, 7
SBIS PINB, 0 //Ожидайте ___/
rjmp PC-1
dec R17
brne ReadCommCycle
;Проверяем, может это команды для записи/чтения памяти.
cpi r18, 0 ;Сравниваем с командой на чтение.
brne read_skip
rjmp comp_read ;Если совпало, то идем на процедуру чтения
read_skip:
cpi r18, 0xFF ;Сравниваем с командой на запись памяти
brne write_skip
rjmp comp_read ;Если совпало, то идем на процедуру записи
write_skip:
;Теперь домофон, попросит нас предъявить ему код..
ldi R18,0
SelectByteCycle:
clr ZH //Загружаем в Р20 нужный байт кода
ldi ZL, aKey
add ZL, R18
LD R20,Z
ldi R19,8
SendByteCycle:
SBIC PINB, 0 //Ждём, пока домофон не прижмёт линию
rjmp PC-1
SBRS R20, 0 ;Если нужно передать нолик, то
SBI DDRB,0 ;Прижать линию к земле.
LSR R20
ldi r16, 8 ; Ожидайте 30uS
dec r16
brne PC-1
CBI DDRB, 0 //Отпускаем линию
SBIS PINB, 0 //Ждём, пока она поднимется
rjmp PC-1
dec R19 //Тут кончается вложенный цикл
brne SendByteCycle
inc R18 //Тут кончается внешний цикл
cpi R18,8
brne SelectByteCycle
;Идем в начало основного цикла
rjmp MainCycle
;Читаем EEPROM и выдаем её на линию. Все 64 байта подряд.
comp_read:
ldi R18,0
Comp_SelectByteCycle:
out EEARL, R18 //Выцепляем из памяти нужный
SBI EECR, EERE //байт для последующей
in R20, EEDR //отправки
ldi R19,8
Comp_SendByteCycle:
SBIC PINB, 0 //Ждём, пока домофон не прижмёт линию
rjmp PC-1
SBRS R20, 0 //ПРопустить след команду, если бит 0 в Р20 поднят
SBI DDRB,0
LSR R20
ldi r16, 8 ; Ожидайте 30uS
dec r16
brne PC-1
CBI DDRB, 0 //Отпускаем линию
SBIS PINB, 0 //Ждём, пока она поднимется
rjmp PC-1
dec R19 //Тут кончается вложенный цикл
brne Comp_SendByteCycle
inc R18 //Тут кончается внешний цикл
cpi R18,64
brne Comp_SelectByteCycle
rjmp MainCycle
;Принимаем с линии байты и скидываем их в EEPROM
comp_write:
;//Глава, посвещённая получению данных от компа и записи их в ЕЕПРОМ.
clr R18
ldi ZL, 0x60
clr ZH
ldi R19, 0
Comp_recv_q:
ldi R17,8
Comp_recv_byte:
SBIC PINB, 0 //Ожидайте \___
rjmp PC-1
ldi r16, 8 ; Ожидайте 30uS
dec r16
brne PC-1
in R16, PINB
LSL R18
BST R16, 0
BLD R18, 0
SBIS PINB, 0 //Ожидайте ___/
rjmp PC-1
dec R17
brne Comp_recv_byte
ST Z+, R18
inc R19 //Тут кончается внешний цикл
cpi R19,64
brne Comp_recv_q
//Теперь у нас в оперативке куча данных (точнее - 64 байта)
//Их надо записать в ЕЕПРОМ.
ldi ZL, 0x60
clr ZH
ldi R19, 0
Comp_recv_write_mem:
SBIC EECR, EEWE
rjmp PC-1
out EEARL, R19
LD R16, Z+
out EEDR, R16
SBI EECR, EEMWE
SBI EECR, EEWE
inc R19
cpi R19,64
brne Comp_recv_write_mem
rjmp MainCycle