Jak to działa?
Klasycznie już zmiana stanu na linii 1-wire realizowana jest poprzez modyfikację bitu (lub bitów) w rejestrze kierunku wybranego portu. Jednak do modyfikacji rejestru nie jest wykorzystywana stała wartość, jak to ma miejsce w większości procedur 1-wire, lecz dedykowana do tego celu jest specjalna zmienna, której poszczególne bity odpowiadają bitom rejestru kierunku. Każda operacja zmiany stanu bitów w rejestrze kierunku realizowana jest poprzez operację iloczynu lub sumy logicznej (w zależności czy chcemy wyzerować czy też ustawić bit w rejestrze) ze wspomnianą zmienną. Przed wywołaniem jakiejkolwiek procedury należy do zmiennej owmask zapisać odpowiednią wartość, która "uaktywnia" poszczególne kanały naszej magistrali. Najczęściej w zmiennej owmask ustawiony będzie tylko jeden bit, ale w pewnych wyjątkowych sytuacjach (zapis tych samych wartośći do kilku układów jednocześnie) wskazane jest ustawienie tylu bitów, do ilu układów ma zostać zapisana ta sama dana. W przypadku układów DS18B20 pozwoli to na jednoczesne zainicjowanie procesu pomiaru temperatury, dzięki czemu nie będzie konieczne wysyłanie tych samych komend do wszystkich układów po kolei.
Procedura opóźniająca
Podstawą działania magistrali 1-wire jest dokładne odmierzanie czasu. Przedstawiona poniżej procedura pozwala na wstrzymanie programu na okres ok owdelay*1us (dla częstotliwości pracy mikrokontrolera 4MHz). Parametr do procedury (ilość mikrosekund) należy przed wywołaniem procedury umieścić w zmiennej owdelay.
Kod: Zaznacz cały
ow_delay:
nop
dec owdelay
brne ow_delay
ret
Kod: Zaznacz cały
ow_delay480us:
ldi count, 3
owd1:
ldi owdelay, 160
rcall ow_delay
dec count
brne owd1
ret
Kod: Zaznacz cały
set_ow_lines:
mov acc, owmask
com acc
in tmp, OWDDR
and acc, tmp
out OWDDR, acc
ret
Ustawienie stanu niskiego na liniach 1-wire realizowanejest poprzez ustawienie odpowiednich bitów w rejestrze kierunku wybranego portu. Dokonywane jest to za pomocją operacji sumy logicznej ze zmienną owmask.
Kod: Zaznacz cały
clr_ow_lines:
mov acc, owmask
in tmp, OWDDR
or acc, tmp
out OWDDR, acc
ret
Pierwsza konkretna i najważniejsza procedura 1-wire - generowanie impulsu reset.Stan wszystkich linii w momencie właściwym dla generowania przez układy impulsów obecności zwracany jest w zmiennej owdata. Pozwala to na sprawdzenie, do których wyprowadzeń podłaczone są układy.
Kod: Zaznacz cały
ow_reset:
rcall clr_ow_lines
rcall ow_delay480us
rcall set_ow_lines
ldi owdelay, 75
rcall ow_delay
in owdata, OWPIN
rcall ow_delay480us
ret
Zapis bitu na magistralę. Bit nalezy przekazać poprzez flagę C.
Kod: Zaznacz cały
ow_write_bit:
rcall clr_ow_lines
ldi owdelay, 15
rcall ow_delay
brcc owb1
rcall set_ow_lines
owb1:
ldi owdelay,100
rcall ow_delay
rcall set_ow_lines
ldi owdelay,200
rcall ow_delay
ret
Kod: Zaznacz cały
rcall clr_ow_lines
rcall set_ow_lines
ldi owdelay, 10
rcall ow_delay
sec
in acc, OWPIN
and acc, owmask
brne orb1
clc
orb1:
ldi owdelay, 200
rcall ow_delay
ret
Kod: Zaznacz cały
ow_write:
ldi count, 8
ow1:
ror owdata
rcall ow_write_bit
dec count
brne ow1
ret
Kod: Zaznacz cały
ow_read:
ldi count, 8
or1:
rcall ow_read_bit
ror owdata
dec count
brne or1
ret