|
|
  |
Чтение Touch memory (IButton) Help! |
|
|
|
Apr 3 2009, 16:32
|
Группа: Новичок
Сообщений: 9
Регистрация: 3-04-09
Пользователь №: 47 128

|
Помогите пожалуйста с чтением IButton! Собираю схему системы доступа на основе Touch Memory (микроконтроллер at89c2051). За основу брал следующие статьи: 1. http://www.ibutton.ru/about/applications/ - применение устройств ibutton 2. http://www.radioland.net.ua/sxemaid-116.html - “Электронный замок с ключами ibutton” 3. Журнал «Схемотехника» №12, 2001 4. Журнал «Радио» №3, 2001 5. Журнал «Радио» №2, 2001 Немного изменил схему электронного замка (добавил MAX232 для связи с COM портом, поменял немного элементов). Реализовал обмен с COM-портом без проблем, но никак не могу считать данные с ds1990A. Пытался найти процедуру для чтения в файлах прошивок исходных статей, но они там громоздкие и в них практически невозможно разобраться такому дилетанту как мне. Симулирую работу микроконтроллера в протеусе. Подскажите, плиз, можно где-нибудь найти отдельно простенькую подпрограмму чтения ibutton на ассемблере? Помогите плиз, уже несколько недель бьюсь над этим вопросом, но никак не получается!
|
|
|
|
|
Apr 8 2009, 07:08
|
Участник

Группа: Участник
Сообщений: 63
Регистрация: 21-09-07
Из: СССР
Пользователь №: 30 719

|
То же мне проблема! Даллас сам дает такой пример. CODE ; The following 8051 code uses a bi-directional port pin (specified by ; DATA_BIT) for 1-wire I/O. This code was written for an 11.0592 MHz ; crystal. ; ; Procedure TouchReset ; ; This procedure transmits the Reset signal to the Touch ; Memory and watches for a presence pulse. On return, ; the Carry bit is set if a presence pulse was detected, ; otherwise the Carry is cleared. The code is timed for ; an 11.0592 MHz crystal. ; PUBLIC TOUCHRESET,DATA_IN,TOUCHBYTE,TOUCHBIT,BIT_IO DATA_BIT BIT P0.0 ; TOUCHRESET: PUSH B ; Save the B register. PUSH ACC ; Save the accumulator. MOV A, #4 ; Load outer loop variable. CLR DATA_BIT ; Start the reset pulse. MOV B, #221 ; 2. Set time interval. DJNZ B, $ ; 442. Wait with Data low. SETB DATA_BIT ; 1. Release Data line. MOV B, #6 ; 2. Set time interval. CLR C ; 1. Clear presence flag. WAITLOW: JB DATA_BIT, WH ; Exit loop if line high. DJNZ B, WAITLOW ; Hang around for 3360 DJNZ ACC, WAITLOW ; us if line is low. SJMP SHORT ; Line could not go high. WH: MOV B, #111 ; Delay for presence detect. HL: ORL C, /DATA_BIT ; 222. Catch presence pulse. DJNZ B, HL ; 222. Wait with Data high. SHORT: POP ACC ; Restore accumulator. POP B ; Restore B register. RET ; Return. ; ; Procedures Data_In and TouchByte ; ; The procedure TouchByte sends the byte in the accumulator ; to the Touch Memory, and the procedure Data_In returns a ; byte from the Touch Memory in the accumulator. Note that ; the NOPs in the following code are intended to give the ; optimum performance when using a 11.0592 MHz crystal. ; Their purpose is to make the pulses as long as ; possible consistent with the Touch Memory timing ; constraints. When using other crystal frequencies, ; the delays in this code should be adjusted to conform ; to the timing requirements of the Touch Memory. ; BIT_IO: RRC A ; Get bit to send in carry. CALL TOUCHBIT ; Send bit. RLC A ; Collect returned bit in ACC. RET ; Return to caller. DATA_IN: MOV A, #0FFH ; Initialize for input. TOUCHBYTE: PUSH B ; Save the B register. MOV B, #8 ; Setup for 8 bits. BIT_LOOP: RRC A ; 1. Get bit in carry. CALL TOUCHBIT ; 2. Send bit. DJNZ B, BIT_LOOP ; 2. Get next bit. RRC A ; Get final bit in ACC. POP B ; Restore B register. RET ; Return to caller. TOUCHBIT: CLR DATA_BIT ; 1. Start the time slot. NOP ; 1. Delay to make sure NOP ; 1. that the Touch Memory NOP ; 1. sees a low for at NOP ; 1. least 1 microsecond. MOV DATA_BIT, C ; 2. Send out the data bit. NOP ; 1. Delay to give the NOP ; 1. data returned from NOP ; 1. the Touch Memory NOP ; 1. time to settle NOP ; 1. before reading NOP ; 1. the bit. MOV C, DATA_BIT ; 1. Sample input data bit. PUSH B ; 2. Save B register. MOV B, #12H ; 2. Delay until the end DJNZ B, $ ; 36. of the time slot. POP B ; Restore B register. SETB DATA_BIT ; Terminate time slot. RET ; Return to caller. ; END ; End of module.
--------------------
Сомневаюсь, и вам советую!
|
|
|
|
|
Apr 14 2009, 16:19
|
Группа: Новичок
Сообщений: 9
Регистрация: 3-04-09
Пользователь №: 47 128

|
Спасибо большое!
|
|
|
|
|
Apr 14 2009, 17:45
|
Группа: Новичок
Сообщений: 9
Регистрация: 3-04-09
Пользователь №: 47 128

|
Вот появился еще вопрос: программу скомпилил, проверил в протеусе. Сразу пришлось заменить команду 0FFH на 033H, так как видимо новые таблетки 0FFH не читает. В результате проверил осцилограмму, получилось в общем вот что: (прикрепил два скрина). На полном цикле вроде виден сначала сигнал reset от микроконтроллера, он получился где-то 450uc. Затем вроде ответ от таблетки presence (нулевой уровень) ~ 120 uc (причем перед этим единичный уровень ~23uc). Но тут все вроде понятно и работает. А вот непонятно дальше: идет единичный сигнал длительностью 350uc и передаются какие то 8 бит. причем, как я понял, это 11001100. Если предположить, что это код команды (33H), то 33H(16)=110011. Откуда еще 00? И где информационные то символы, ведь после передачи команды таблетка должна выдать 64 бита данных таблетки. Как их то считать?
Эскизы прикрепленных изображений
|
|
|
|
|
Apr 15 2009, 07:52
|

Гуру
     
Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954

|
Цитата(opv88 @ Apr 14 2009, 20:45)  ...и передаются какие то 8 бит. причем, как я понял, это 11001100. Если предположить, что это код команды (33H), то 33H(16)=110011. Откуда еще 00? Передача - байтами; младшими битами "вперёд". Т.е. 11001100 - это команда 33h Цитата(opv88 @ Apr 14 2009, 20:45)  И где информационные то символы, ведь после передачи команды таблетка должна выдать 64 бита данных таблетки. Как их то считать? В документации, вроде, нормально написано как происходит чтение. Для каждого бита опускаете сигнал на линии в ноль на 1-15 мкс, а ещё через 45-60 мкс проверяете уровень на линии. И так - для всех битов - всех байтов... Или - вопрос не об этом?
|
|
|
|
|
Apr 15 2009, 12:05
|
Группа: Новичок
Сообщений: 9
Регистрация: 3-04-09
Пользователь №: 47 128

|
Цитата(Палыч @ Apr 15 2009, 11:52)  Передача - байтами; младшими битами "вперёд". Т.е. 11001100 - это команда 33h
В документации, вроде, нормально написано как происходит чтение. Для каждого бита опускаете сигнал на линии в ноль на 1-15 мкс, а ещё через 45-60 мкс проверяете уровень на линии. И так - для всех битов - всех байтов... Или - вопрос не об этом? Спасибо. Попробую реализовать чтение битов...
|
|
|
|
|
Apr 15 2009, 16:07
|
Группа: Новичок
Сообщений: 9
Регистрация: 3-04-09
Пользователь №: 47 128

|
Опять таки в коде обозначенном mungo есть процедура считывания: ; Procedures Data_In and TouchByte ; ; The procedure TouchByte sends the byte in the accumulator ; to the Touch Memory, and the procedure Data_In returns a ; byte from the Touch Memory in the accumulator. Note that ; the NOPs in the following code are intended to give the ; optimum performance when using a 11.0592 MHz crystal. ; Their purpose is to make the pulses as long as ; possible consistent with the Touch Memory timing ; constraints. When using other crystal frequencies, ; the delays in this code should be adjusted to conform ; to the timing requirements of the Touch Memory. BIT_IO: RRC A ; Get bit to send in carry. CALL TOUCHBIT ; Send bit. RLC A ; Collect returned bit in ACC. RET ; Return to caller. DATA_IN: MOV A, #033H ; Initialize for input. TOUCHBYTE: PUSH B ; Save the B register. MOV B, #8 ; Setup for 8 bits. BIT_LOOP: RRC A ; 1. Get bit in carry. CALL TOUCHBIT ; 2. Send bit. DJNZ B, BIT_LOOP ; 2. Get next bit. RRC A ; Get final bit in ACC. POP B ; Restore B register. RET ; Return to caller. TOUCHBIT: CLR DATA_BIT ; 1. Start the time slot. NOP ; 1. Delay to make sure NOP ; 1. that the Touch Memory NOP ; 1. sees a low for at NOP ; 1. least 1 microsecond. MOV DATA_BIT, C ; 2. Send out the data bit. NOP ; 1. Delay to give the NOP ; 1. data returned from NOP ; 1. the Touch Memory NOP ; 1. time to settle NOP ; 1. before reading NOP ; 1. the bit. MOV C, DATA_BIT ; 1. Sample input data bit. PUSH B ; 2. Save B register. MOV B, #12H ; 2. Delay until the end DJNZ B, $ ; 36. of the time slot. POP B ; Restore B register. SETB DATA_BIT ; Terminate time slot. RET ; Return to caller.
Как я понял, здесь: DATA_IN - запись кода в аккумулятор BIT_LOOP - посылка этого кода на ibutton TOUCHBIT - непосредственно прием данных от таблетки Что же такое BIT_IO и почему эта процедура не работает может кто знает????
|
|
|
|
|
Apr 15 2009, 17:41
|
Группа: Новичок
Сообщений: 9
Регистрация: 3-04-09
Пользователь №: 47 128

|
Цитата(Палыч @ Apr 15 2009, 20:48)  Бегло просмотрел программу... Если не ошибся, то процедура BIT_IO осуществляет вывод и ввод данных: при выводе в аккумуляторе должно лежать выводимое значение; при вводе - в аккумулятор нужно положить FF, а после работы этой процедуры там будет введённое число. Ещё меня смутило количество NOP'ов - каждый NOP при указанной частоте - примерно 1 мкс... Первая задержка - 4 мкс - вроде в норме; вторая - 6 мкс - кажется маловато (нужно свериться с документацией)... Да я сам над временем размышлял. Что то непонятно. Там вроде побольше должно быть. Получается просто таблетка не реагирует на команду чтения, может действительно временные параметры неверные. Еще я не совсем понял как удерживают единичный уровень в сигнале сброса (хотя там все работает) - ясно что с помощью DJNZ, но там тоже какой то странный параметр временной, цикл DJNZ выполняет 221 шаг, а в итоге все-таки 450 мкс. Непонятно, как время одного шага цикла вычислялось для кварца ~12Мгц. Ведь по идее T=1/f=1/(12000000)=8*10^(-8)=0.08 мкс (период). То есть 1 выполнение ~0.1мкс, но 0.1*221=22.1мкс. Так что что то странное, но может я не так вычисляю...
|
|
|
|
|
Apr 15 2009, 19:05
|
Частый гость
 
Группа: Свой
Сообщений: 79
Регистрация: 8-04-05
Из: Санк-Петербург
Пользователь №: 3 972

|
Цитата(opv88 @ Apr 15 2009, 21:41)  Непонятно, как время одного шага цикла вычислялось для кварца ~12Мгц. Ведь по идее T=1/f=1/(12000000)=8*10^(-8)=0.08 мкс (период). То есть 1 выполнение ~0.1мкс, но 0.1*221=22.1мкс. Так что что то странное, но может я не так вычисляю... В х51 архитектуре, если не ошибаюсь, один машинный цикл = 12 тактов кварца. DJNZ - 2 машинных цикла. M = (1/12000000 )*12 = 1мкс 221 DJNZ = 2*1мкс *221 = 442мкс
|
|
|
|
|
Apr 15 2009, 19:35
|
Группа: Новичок
Сообщений: 9
Регистрация: 3-04-09
Пользователь №: 47 128

|
Цитата(Nemo2000 @ Apr 15 2009, 23:05)  В х51 архитектуре, если не ошибаюсь, один машинный цикл = 12 тактов кварца. DJNZ - 2 машинных цикла.
M = (1/12000000 )*12 = 1мкс 221 DJNZ = 2*1мкс *221 = 442мкс Спасибо, с этим стало понятно
|
|
|
|
|
Apr 17 2009, 11:48
|
Группа: Новичок
Сообщений: 9
Регистрация: 3-04-09
Пользователь №: 47 128

|
Вроде разобрался, всем кто помогал спасибо. Вот, написал код: READING: CLR DATA_BIT NOP NOP NOP NOP MOV DATA_BIT, C Mov Data,C Mov A,#25 DJNZ A,$ Inc Count64 Mov A,Count64 CJNE A,#01000000B,READING RET ; Return to caller. Count64 - счетчик, в нем изначально 0. Считает до 64. На осциллограмме все ОК. Код верный, только в обратном порядке как и команда, но так вроде и надо.
|
|
|
|
|
Apr 17 2009, 14:24
|
Группа: Новичок
Сообщений: 9
Регистрация: 3-04-09
Пользователь №: 47 128

|
Цитата(Палыч @ Apr 17 2009, 16:54)  На осциллограмме может быть и всё ОК. Только я не виже: где же Вы в своей программе производите считывание состояния линии и занесение считанной информации в память или регистр? Пока не заношу сам ко в регистр, но это не проблема уже. Главное было разобраться с самим 1-wire, а занести в регистр думаю получится, но код естественно, побольше будет. Но мне кажется что это вряд ли вызовет проблему. Только придется наверное интервал разбивать на 2 и читать состояние таблетки где-то в середине...
Сообщение отредактировал opv88 - Apr 17 2009, 14:34
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|