Возможности подключить осциллограф прямщас нет, гляньте в код 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:
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
;выход: 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.
Во избежание недоразумений - порт изначально настроен на ввод, все на макетке, схемка подключения вот:
