witam
Przeszukując elektrodę można znaleźć mnóstwo procedurek dotyczących 1-wire na AVR ale niestety w większości pod język C lub bascom.
W jednym wątku znalazłem jakieś procedury ale jak ktoś w nim zauważył z błędami. Kolejną procedurkę znalezioną w kursie asm pod avr znalazłem na mikrokontrolery.net.
Procedurki są ustawione pod 4MHz.
Przy resecie 1-wire najpierw następuje wymuszenie stanu niskiego na okres 480us poleceniem CLR_DQ (czyli sbi DQ_PORT, DQ) czyli ustawienie końcówki DQ jako wyjście. Po 480us użyta jest komeda SET_DQ (cbi DQ_PORT, DQ) czyli ustawienie DQ jako wejście.
Mam następujące pytania:
1. czy gdy ustawiam DQ jako wejście nie powinno się podpiąć jeszcze wewnętrznego rezystora? Z komentarzy wynika że na DQ wymuszony będzie stan wysoki gdy użyję cbi DQ_PORT, DQ.
2. czy ustawienie DQ jako wyjście automatycznie wymusza na nim stan niski?
3. czy czasy opóźnień są prawidłowo ustawione dla 4MHz?
A może posiada ktoś przejrzyste procedurki obsługi 1-wire? Muszę przyznać że się już pogubiłem.
pozdrawiam i dzięki z góry
Dodano po 5 [godziny] 43 [minuty]:
Być może pytania okazały się zbyt dosłowne.
Jeśli mógłbym więc prosić o procedurki do 1-wire w asemblerze byłbym wielce zobowiązany.
Przeszukując elektrodę można znaleźć mnóstwo procedurek dotyczących 1-wire na AVR ale niestety w większości pod język C lub bascom.
W jednym wątku znalazłem jakieś procedury ale jak ktoś w nim zauważył z błędami. Kolejną procedurkę znalezioną w kursie asm pod avr znalazłem na mikrokontrolery.net.
Procedurki są ustawione pod 4MHz.
#define DQ_PORT DDRD
#define DQ 5
#define IN_DQ PIND
#define SET_DQ cbi DQ_PORT, DQ ;ustawienie jako wejścia
#define CLR_DQ sbi DQ_PORT, DQ ;ustawienie jako wyjścia
#define acc r19
#define count r20
#define temp r21
#define rdel r22
#define lsb r23
#define msb r24
delay:
nop
subi rdel, 1
brne delay
ret
; procedura generujaca sygnał reset na linii 1wire
ow_reset:
CLR_DQ ; stan niski na linii 1wire
ldi rdel, 255 ;
rcall delay ;
ldi rdel, 119 ; opóźnienie ok 480 us
rcall delay ;
SET_DQ ; stan wysoki na linii 1wire
ldi rdel, 255 ;
rcall delay ;
ldi rdel, 119 ; opóźnienie ok 480 us
rcall delay ;
ret
; procedura nadania bitu przez linię 1wire
ow_write_bit:
CLR_DQ ; stan niski na linii 1wire
ldi rdel, 7
rcall delay
cpi acc, 0
breq dalej
SET_DQ
dalej:
ldi rdel, 80
rcall delay
SET_DQ
ret
; procedura odczytu bitu z linii 1wire
ow_read_bit:
CLR_DQ
ldi rdel, 1
rcall delay
SET_DQ
ldi rdel, 11
rcall delay
ldi acc, 1
sbis IN_DQ, DQ
ldi acc, 0
ret
; procedura wysłania bajtu na linię 1wire
ow_write:
mov temp, acc ; zapamiętanie danej wejściowej w rejestrze temp
ldi count, 1 ; załadowanie do licznika wartości początkowej
loop1:
mov acc, temp ; przywrócenie danej wejściowej
and acc, count ; iloczyn logiczny danej wejściowej i licznika
rcall ow_write_bit ; wywołanie procedury zapisu bitu
lsl count ; przesuniecie licznika o 1 bit w lewo
cpi count, 0 ; sprawdzenie, czy licznik = 0
brne loop1 ; jeśli nie to wróc na początek pętli
ret
; procedura odczytu bajtu z linii 1wire
ow_read:
ldi temp, 0 ; wyzerowanie rejestru temp
ldi count, 1 ; załadowanie do licznika wartości początkowej
loop2:
rcall ow_read_bit ; wywołanie procedury odczytu bitu z linii 1wire
cpi acc, 0 ; porównanie zwróconej wartośći z liczbą 0
breq rd1 ; jeśli równe to skocz do rd1
or temp, count ; jeśli rózne to wykonaj sumę logiczną temp i licznika
rd1:
ldi rdel, 6 ; opóźnienie
rcall delay
lsl count ; przesunięcie licznika o 1 bit w lewo
cpi count, 0 ; sprawdzenie, czy licznik = 0
brne loop2 ; jeśli nie to skocz na początek pętli
mov acc, temp ; przepisanie temp do acc
retPrzy resecie 1-wire najpierw następuje wymuszenie stanu niskiego na okres 480us poleceniem CLR_DQ (czyli sbi DQ_PORT, DQ) czyli ustawienie końcówki DQ jako wyjście. Po 480us użyta jest komeda SET_DQ (cbi DQ_PORT, DQ) czyli ustawienie DQ jako wejście.
Mam następujące pytania:
1. czy gdy ustawiam DQ jako wejście nie powinno się podpiąć jeszcze wewnętrznego rezystora? Z komentarzy wynika że na DQ wymuszony będzie stan wysoki gdy użyję cbi DQ_PORT, DQ.
2. czy ustawienie DQ jako wyjście automatycznie wymusza na nim stan niski?
3. czy czasy opóźnień są prawidłowo ustawione dla 4MHz?
A może posiada ktoś przejrzyste procedurki obsługi 1-wire? Muszę przyznać że się już pogubiłem.
pozdrawiam i dzięki z góry
Dodano po 5 [godziny] 43 [minuty]:
Być może pytania okazały się zbyt dosłowne.
Jeśli mógłbym więc prosić o procedurki do 1-wire w asemblerze byłbym wielce zobowiązany.