Здравсвуйте Господа.
Долго собирался, и тут на днях всё таки решил разобраться с 1-Wire.
Настрочил код, отладил, зашил, и О ЧУДО!!!, девайс работает.
Но, блин, даже самому стало стыдно, когда не смог разобраться с такой штукой:
ds-ка всё корректно получает, и передаёт, но по какой-то странной причине, Tiny2313 пишет в память полученное значение не один раз, а столько, сколько ему нравится.
Если кто усмотрит в приведённом ниже куске кода какой грешок, отпишитесь пожалуйста.
И ещо вопрос:
код этот я придумал сам, и как мне кажется, его так сказать оптимизация оставляет желать лучьшего.
Если кто занимался таким вопросом, и удалось вам удалось добиться хороших результатаов, то будьте добры, поделитесь исходничками.
заранее благдарен.
Tim0:
rcall long_delay
in tmp, PinB
sbrs tmp, Pinb0 ;кнопка нажата?
rcall CycleOfRead ;общаемся с ds-кой
wdr
reti
;****************************************************
CycleOfRead:
rcall dsReset ;посылаем reset
ldi data, 0x33 ;просим сер.№
rcall OutToDevice
ldi tmp, 50 ;задержечка
rcall loop
clr indata
rcall ReadFromDevice ;получаем данные
ret
;****************************************************
ReadFromDevice:
cli
clr indata
clr Kount
clr eepKount
read: ldi tmp, 0
out Portb, tmp
nop
nop
nop
ldi tmp, 0b01000001
out PortB, tmp
ldi tmp, 7
rcall loop
in indatatmp, PinB
cbr indatatmp,1
cbr indatatmp,64
or indata, IndataTmp
inc Kount
cpi Kount, 8
breq noShift
lsr indata
ldi tmp, 20
rcall loop
noShift: cpi Kount, 8
brne read
inc eepKount
cpi indata, 0xff
breq end
;********************************************************
;запись данных в EEPROM
;********************************************************
EEWrite:
sbic EECR, EEWE
rjmp EEWrite
out EEAR, eepKount
out EEDR, indata
sbi EECR, EEMWE
sbi EECR, EEWE
clr Kount
cpi eepKount, 8
brne read
rcall dsreset
end:
sei
ret
Код лучше оформить вложением. Aheir
Долго собирался, и тут на днях всё таки решил разобраться с 1-Wire.
Настрочил код, отладил, зашил, и О ЧУДО!!!, девайс работает.
Но, блин, даже самому стало стыдно, когда не смог разобраться с такой штукой:
ds-ка всё корректно получает, и передаёт, но по какой-то странной причине, Tiny2313 пишет в память полученное значение не один раз, а столько, сколько ему нравится.
Если кто усмотрит в приведённом ниже куске кода какой грешок, отпишитесь пожалуйста.
И ещо вопрос:
код этот я придумал сам, и как мне кажется, его так сказать оптимизация оставляет желать лучьшего.
Если кто занимался таким вопросом, и удалось вам удалось добиться хороших результатаов, то будьте добры, поделитесь исходничками.
заранее благдарен.
Tim0:
rcall long_delay
in tmp, PinB
sbrs tmp, Pinb0 ;кнопка нажата?
rcall CycleOfRead ;общаемся с ds-кой
wdr
reti
;****************************************************
CycleOfRead:
rcall dsReset ;посылаем reset
ldi data, 0x33 ;просим сер.№
rcall OutToDevice
ldi tmp, 50 ;задержечка
rcall loop
clr indata
rcall ReadFromDevice ;получаем данные
ret
;****************************************************
ReadFromDevice:
cli
clr indata
clr Kount
clr eepKount
read: ldi tmp, 0
out Portb, tmp
nop
nop
nop
ldi tmp, 0b01000001
out PortB, tmp
ldi tmp, 7
rcall loop
in indatatmp, PinB
cbr indatatmp,1
cbr indatatmp,64
or indata, IndataTmp
inc Kount
cpi Kount, 8
breq noShift
lsr indata
ldi tmp, 20
rcall loop
noShift: cpi Kount, 8
brne read
inc eepKount
cpi indata, 0xff
breq end
;********************************************************
;запись данных в EEPROM
;********************************************************
EEWrite:
sbic EECR, EEWE
rjmp EEWrite
out EEAR, eepKount
out EEDR, indata
sbi EECR, EEMWE
sbi EECR, EEWE
clr Kount
cpi eepKount, 8
brne read
rcall dsreset
end:
sei
ret
Код лучше оформить вложением. Aheir