реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Чтение Touch memory (IButton) Help!
opv88
сообщение Apr 3 2009, 16:32
Сообщение #1





Группа: Новичок
Сообщений: 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 на ассемблере? Помогите плиз, уже несколько недель бьюсь над этим вопросом, но никак не получается!
Go to the top of the page
 
+Quote Post
mungo
сообщение Apr 8 2009, 07:08
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 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.


--------------------
Сомневаюсь, и вам советую!
Go to the top of the page
 
+Quote Post
opv88
сообщение Apr 14 2009, 16:19
Сообщение #3





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



Спасибо большое!
Go to the top of the page
 
+Quote Post
opv88
сообщение Apr 14 2009, 17:45
Сообщение #4





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



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


Гуру
******

Группа: Свой
Сообщений: 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 мкс проверяете уровень на линии. И так - для всех битов - всех байтов... Или - вопрос не об этом?
Go to the top of the page
 
+Quote Post
opv88
сообщение Apr 15 2009, 12:05
Сообщение #6





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



Цитата(Палыч @ Apr 15 2009, 11:52) *
Передача - байтами; младшими битами "вперёд". Т.е. 11001100 - это команда 33h

В документации, вроде, нормально написано как происходит чтение. Для каждого бита опускаете сигнал на линии в ноль на 1-15 мкс, а ещё через 45-60 мкс проверяете уровень на линии. И так - для всех битов - всех байтов... Или - вопрос не об этом?


Спасибо. Попробую реализовать чтение битов...
Go to the top of the page
 
+Quote Post
opv88
сообщение Apr 15 2009, 16:07
Сообщение #7





Группа: Новичок
Сообщений: 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 и почему эта процедура не работает может кто знает????
Go to the top of the page
 
+Quote Post
Палыч
сообщение Apr 15 2009, 16:48
Сообщение #8


Гуру
******

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



Цитата(opv88 @ Apr 15 2009, 19:07) *
Что же такое BIT_IO и почему эта процедура не работает может кто знает????
Бегло просмотрел программу... Если не ошибся, то процедура BIT_IO осуществляет вывод и ввод данных: при выводе в аккумуляторе должно лежать выводимое значение; при вводе - в аккумулятор нужно положить FF, а после работы этой процедуры там будет введённое число. Ещё меня смутило количество NOP'ов - каждый NOP при указанной частоте - примерно 1 мкс... Первая задержка - 4 мкс - вроде в норме; вторая - 6 мкс - кажется маловато (нужно свериться с документацией)...
Go to the top of the page
 
+Quote Post
opv88
сообщение Apr 15 2009, 17:41
Сообщение #9





Группа: Новичок
Сообщений: 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мкс. Так что что то странное, но может я не так вычисляю...
Go to the top of the page
 
+Quote Post
Nemo2000
сообщение Apr 15 2009, 19:05
Сообщение #10


Частый гость
**

Группа: Свой
Сообщений: 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мкс
Go to the top of the page
 
+Quote Post
opv88
сообщение Apr 15 2009, 19:35
Сообщение #11





Группа: Новичок
Сообщений: 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мкс


Спасибо, с этим стало понятно smile.gif
Go to the top of the page
 
+Quote Post
opv88
сообщение Apr 17 2009, 11:48
Сообщение #12





Группа: Новичок
Сообщений: 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.
На осциллограмме все ОК. Код верный, только в обратном порядке как и команда, но так вроде и надо.
Go to the top of the page
 
+Quote Post
Палыч
сообщение Apr 17 2009, 12:54
Сообщение #13


Гуру
******

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



Цитата(opv88 @ Apr 17 2009, 14:48) *
Вот, написал код... На осциллограмме все ОК. Код верный, только в обратном порядке как и команда, но так вроде и надо.
На осциллограмме может быть и всё ОК. Только я не виже: где же Вы в своей программе производите считывание состояния линии и занесение считанной информации в память или регистр?
Go to the top of the page
 
+Quote Post
opv88
сообщение Apr 17 2009, 14:24
Сообщение #14





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



Цитата(Палыч @ Apr 17 2009, 16:54) *
На осциллограмме может быть и всё ОК. Только я не виже: где же Вы в своей программе производите считывание состояния линии и занесение считанной информации в память или регистр?


Пока не заношу сам ко в регистр, но это не проблема уже. Главное было разобраться с самим 1-wire, а занести в регистр думаю получится, но код естественно, побольше будет. Но мне кажется что это вряд ли вызовет проблему. Только придется наверное интервал разбивать на 2 и читать состояние таблетки где-то в середине...

Сообщение отредактировал opv88 - Apr 17 2009, 14:34
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 25th July 2025 - 22:49
Рейтинг@Mail.ru


Страница сгенерированна за 0.01461 секунд с 7
ELECTRONIX ©2004-2016