Перейти к содержанию
    

Помогиття побороть ibutton plz...

Не первый день бьюсь с 1-wire. Все делаю по 126 аппноту от Далласа и даташиту на DS1990A, iButton на ресет откликается, но при попытке прочитать с него сигнатуру - упорно в ответе вылезает ff,7f,7f,7f,7f,7f,7f,7f. DS1990A - живые (пробовал разные), задержки - в норме (раздвигаю-сдвигаю время - девайс перестает откликаться), прерывания на время опроса и tx/rx - отключаю.

Возможности подключить осциллограф прямщас нет, гляньте в код plz - может проглядел что-то...

Опрос:

;###### опрос 1-wire (времянка)
        cli            ;запрещаем прерывания
        rcall    owreset;ibutton обнаружен ?
        brts    ow_no;нет - обход
        rcall    ibutton;принимаем сигнатуру
        sei
        mlcdadr    $40
        ldi        tmp2, 8
        ldi        yh, high(ibuffer*2)
        ldi        yl, low(ibuffer*2)
ib000:    ld        tmp, y+
        rcall    lcdhex2
        dec        tmp2
        brne    ib000
        ldi        cntbeep, 50
        rcall    wait1s
        mprintf    $40, "                "
ow_no:    sei
ow_out:

 

Подпрограммки:

 

;проверка на наличие девайса 1-wire
;выход:    T=1 - девайс не обнаружен
;        T=0 - девайс обнаружен
owreset:clt            ;изначально ставим признак "1wire девайс обнаружен"
        sbi        ddrd, owport;1wire на вывод
        cbi        portd, owport;приземляем линию
        rcall    owait_h
        sbi        portd, owport;отпускаем линию
        cbi        ddrd, owport;1wire на ввод
        rcall    owait_i    ;ждем 70 мкс
        sbic     pind, owport;девайс приземлил линию ?
        set            ;нет - девайс не обнаружен
        rcall    owait_j
        ret

;прием серийника iButton
;выход:    [ibbuffer] - 8 байт от ibutton
ibutton:ldi        yh, high(ibuffer*2)
        ldi        yl, low(ibuffer*2)
        ldi        tmpl, 8        ;принимаем 8 байт
        ldi        tmp, $33
        mov        owdata, tmp
        rcall    owtxb
ibut00:    rcall    owrxb
        st        y+, owdata
        dec        tmpl
        brne    ibut00
        ret

;передача байта по onewire
;вход:    [owdata] - байт
owtxb:
        sbi        ddrd, owport;1wire на вывод
        ldi        tmp2, 8        ;счетчик бит
owtxb0:    sbrc    owdata, 0
        rjmp    owt_1
;передаем "0"
owt_0:    cbi        portd, owport;приземляем линию
        rcall    owait_c
        sbi        portd, owport;отпускаем линию
        rcall    owait_d
        rjmp    owtnext
;передаем "1"
owt_1:    cbi        portd, owport;приземляем линию
        rcall    owait_a
        sbi        portd, owport;отпускаем линию
        rcall    owait_b
owtnext:ror        owdata
        dec        tmp2
        brne    owtxb0
        cbi        ddrd, owport;1wire на ввод
        ret

;прием байта по onewire
;выход:    [owdata] - байт
owrxb:
        clr        owdata
        ldi        tmp2, 8        ;счетчик бит
        sbi        ddrd, owport;1wire на вывод
owrxb0:    cbi        portd, owport;приземляем линию
        rcall    owait_a
        sbi        portd, owport;отпускаем линию
        cbi        ddrd, owport;1wire на ввод
        rcall    owait_e
        sec                    ;ставим C
        sbis     pind, owport;на линии 1 ?
        clc                    ;нет - сбрасываем C
        rol        owdata        ;пишем C в бит 0[owdata]
        rcall    owait_f
        dec        tmp2
        brne    owrxb0
        ret

 

Что я делаю не так, а ?.. :(

 

PS: DS1821 ведет себя ровно так же - в ответ на $AA отдает байт $7F.

Во избежание недоразумений - порт изначально настроен на ввод, все на макетке, схемка подключения вот:

ib.jpg

Изменено пользователем Vlad219i

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вроде никакого "криминала" не видно, если только "времянка" выдержана правильно (осциллограф бы не помешал). Непонятно только зачем:

ibutton:ldi        yh, high(ibuffer*2)
        ldi        yl, low(ibuffer*2)

Если работаем с ОЗУ, то надо:

ibutton:ldi        yh, high(ibuffer)
        ldi        yl, low(ibuffer)

Приведенной схемы подключения не видно, попробуйте прикрепить еще раз.

При считывании бита можно попробовать защиту от дребезга.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

сдается мне что пишете вы ответ от ключей в озу а смотрите с flash,так что давайте макросы ваши в студию.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

сдается мне что пишете вы ответ от ключей в озу а смотрите с flash,так что давайте макросы ваши в студию.

 

Собственно, там макросы относятся только к LCD-модулю и нареканий с моей стороны не вызывают, эта часть отработана давно и не в одном проекте. :-)

mlcdadr - установка адреса отображения, mprintf - печать строки из program memory по заданному адресу LCD. Из внешних процедур здесь мелькает только printhex2 - печать 16-ричного числа на LCD. Вообще - печать здесь только для отладки.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ну а че тада вы пишете в озу а печатаете с flash чтоль?:)

 

Нифига не понял.

OK, давайте так.

Какое конкретно место в листинге Вас смущает ?

 

 

Если работаем с ОЗУ, то надо:

ibutton:ldi        yh, high(ibuffer)
        ldi        yl, low(ibuffer)

 

Да, это мой глюк, спасибо за наводку. :-)

Однако - даже при этом и для записи, и для чтения использовались одни и те же адреса в sram... Вживую завтра на работе посмотрю.

 

Приведенной схемы подключения не видно, попробуйте прикрепить еще раз.

При считывании бита можно попробовать защиту от дребезга.

 

Сервак лежал, сейчас вроде видно.

 

Дребезг - да не похоже. 100%-повторяющийся результат...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

"mprintf - печать строки из program memory по заданному адресу LCD." я так понимаю что проверяете вы что с таблетки прочлось выводя на lcd .... но буффер под таблетку у вас в озу а процедура печатает с флеша,или я чтото не так понял?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

"mprintf - печать строки из program memory по заданному адресу LCD." я так понимаю что проверяете вы что с таблетки прочлось выводя на lcd .... но буффер под таблетку у вас в озу а процедура печатает с флеша,или я чтото не так понял?

 

Угу, не так. Если посмотреть пристально на

mprintf    $40, "                "

то станет очевидным, что в этом месте с адреса $40 печатается 16 пробелов, то есть это просто очистка строки #2 на LCD. :-)

 

Для печати данных из буфера используется "printhex2" - это печать байта из [tmp] в удобочитаемом виде на LCD с текущего знакоместа.

 

Адреса буфера поменял. Как и ожидалось - не помогло. Итого: осциллограф - наше все, но это уже после праздников, наверное. :-)

 

Всех с наступающим !

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если у вас времянки правильные и данные не криво сохраняются, не забывайте, что между битами надо небольшую паузу держать мкс так на 20.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если у вас времянки правильные и данные не криво сохраняются, не забывайте, что между битами надо небольшую паузу держать мкс так на 20.

 

Что-то в описании протокола я такого не нашел... Таймслоты (теоретически :) ) отработаны правильно.

Впрочем - после введения задержек 20 мкс ниччего не изменилось... :-(

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я так делаю - просаживаю линию, на второй мкс вывожу бит на линию, на 13 мкс считываю, жду 60 мкс, подымаю линию, жду 20 мкс. После ресета передается команда 33h, потом считываются 8 байт.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Пока криминального ничего ненашел. Только Вы както жестковто с линиеей работаете:

sbi portd, owport;отпускаем линию

cbi ddrd, owport;1wire на ввод

Мелочь конечно, но все же лучше наоборот:

cbi ddrd.....

sbi portd.....

И хорошо бы еще ваши delay посотреть. Сам собирал, и работал с 1wire(ibutton и термодатчики), писал на асме, таких проблем небыло.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Пока криминального ничего ненашел. Только Вы както жестковто с линиеей работаете:

sbi portd, owport;отпускаем линию

cbi ddrd, owport;1wire на ввод

Мелочь канечно, но все же лучше наоборот:

cbi ddrd.....

sbi portd.....

Тогда получится, что мы начинаем слушать порт, после чего включаем подтяжку. И при следующей перестройке порта на вывод мы сразу будем иметь на выходе "0". Нет ?

И хорошо бы еще ваши delay посотреть. Сам собирал, и работал с 1wire(ibutton и термодатчики), писал на асме, таких проблем небыло.

 

"На асме" - сейчас это встречается все реже, к сожалению... :-)

Задержки:

 

;микросекундные задержки для 1wire - изменять код при изменении Tclk !!!
;//Tclk 7.3728MHz, 1такт - ~135нс
owait_a:ldi    tmp, 6        ;6 мкс
        rjmp    ow0
owait_b:ldi    tmp, 64        ;64 мкс
        rjmp    ow0
owait_c:ldi    tmp, 60        ;60 мкс
        rjmp    ow0
owait_d:ldi    tmp, 10        ;10 мкс
        rjmp    ow0
owait_e:ldi    tmp, 9        ;9 мкс
        rjmp    ow0
owait_f:ldi    tmp, 55        ;55 мкс
        rjmp    ow0
owait_h:ldi        tmp, 240;480 мкс
        rcall    ow0
        ldi        tmp, 240
        rjmp    ow0
owait_i:ldi        tmp, 70    ;70 мкс
        rjmp    ow0
owait_j:ldi        tmp, 200;410 мкс
        rcall    ow0
        ldi        tmp, 210
ow0:    rjmp    pc+1    ;2 такта    \~1мкс
        rjmp    pc+1    ;2 такта
        dec        tmp        ;1 такт
        brne    ow0        ;2 такта    /
        ret

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нашел помойму ошибку..:

sbi ddrd, owport;1wire на вывод

owrxb0: cbi portd, owport;приземляем линию

rcall owait_a

sbi portd, owport;отпускаем линию

cbi ddrd, owport;1wire на ввод

Порт ddrb обнуляете но потом неустанавливаете перед синхро уровнем :-) так нет? (отсюда 7f)

зы: всеж таки обмен стоит делать пасивным.

1 = portd в 1, ddrd в 0

0 = portd в 0, ddrd в 1

Тогда получится, что мы начинаем слушать порт, после чего включаем подтяжку. И при следующей перестройке порта на вывод мы сразу будем иметь на выходе "0". Нет ?

"Слушать" порт начинаем здесь:

sbis pind, owport;на линии 1 ?

Удачи! :-)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нашел помойму ошибку..:

sbi ddrd, owport;1wire на вывод

owrxb0: cbi portd, owport;приземляем линию

rcall owait_a

sbi portd, owport;отпускаем линию

cbi ddrd, owport;1wire на ввод

Порт ddrb обнуляете но потом неустанавливаете перед синхро уровнем :-) так нет? (отсюда 7f)

Как не устанавливаю, вот же:

sbi portd, owport;отпускаем линию

зы: всеж таки обмен стоит делать пасивным.

1 = portd в 1, ddrd в 0

0 = portd в 0, ddrd в 1

А вот это (а именно пассивный обмен) помогло.

Первым делом в ресете 1-wire настраиваю порт на вывод, обнуляю и оставляю в таком виде навсегда.

Дальше достаточно играть только направлением, ибо при настройке порта на ввод он отпускает линию.

Спасибо, заработало ! :-)

 

Попутно выяснилось, что девайс отдает байты от старшего бита к младшему (а вроде должен наоборот).

Шаманство какое-то...

"Слушать" порт начинаем здесь:

sbis pind, owport;на линии 1 ?

Удачи! :-)

Не, я не об этом. Неточно выразился. "Слушать"=имелось в виду "настраивать на ввод".

Если настроить пин с помощью ddrd на ввод, а потом в portd на этот пин выдать 1 - включится подтяжка для этого пина, состояние же регистра порта не изменится.

 

PS: если интересно, могу выложить уже рабочий исходник.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...