Powrót

OneWire na przerwaniach od UART dla DS18B20

Zazwyczaj obsługa OneWire realizowana jest przez manipulowanie GPIO z wykorzystaniem delay. Niestety powoduje to blokowanie programu na długi czas, przez który często zawieszane są przerwania. Dzięki wykorzystaniu UART całą obsługę komunikacji można zrealizować całkowicie na przerwaniach.

OneWire (1-Wire) jest popularnym standardem głównie za sprawą termometru DS18B20. W Internecie ponad 90% projektów wykorzystujących 1-Wire to pomiar temperatury, mimo że asortyment układów jest duży i obejmuje między innymi pamięci EEPROM, EPROM, SRAM, GPIO, konwertery na I2C. Prawie zawsze, a w Arduino i AVR w 99,9% przypadków, obsługa 1-Wire jest programowa, polegająca na manipulowaniu portem GPIO. Wymagane kryteria czasowe realizują funkcje delay. Rzadko kiedy sięga się po UART, metodę zaproponowaną jeszcze przez firmę Dallas. Jak wykorzystać UART do obsługi 1-Wire na AVR pokazałem w EP 1/2019 https://serwis.avt.pl/manuals/AVT5567.pdf. Tym razem podniosłem poprzeczkę i obsłużyłem 1-Wire UART-em całkowicie na przerwaniach. W przykładowym kodzie układem DS18B20 mierzona jest temperatura, którą odczytujemy w programie głównym. Film pokazujący działanie programu można obejrzeć na Youtube: https://youtu.be/iXTlc535780. W kolejnym kroku 1-Wire będzie obsługiwane przez DMA, angażując przerwania tylko na czas generowania sygnału RESET oraz po zakończeniu transmisji.

Warto wiedzieć, że produkowane są układy 1-Wire MASTER. Największy asortyment obejmują mostki I2C-OneWire oraz jeden układ UART-OneWire, który ma największe możliwości spośród wszystkich masterów. Ciekawym mostkiem jest układ SD2482-800 zawierający osiem HOST-ów 1-Wire.

Jak działa 1-Wire?

Opis protokołu można znaleźć na stronie producenta: https://www.analog.com/en/search.html?q=1-wire.

Podstawowe informacje można poznać na Wiki: https://en.wikipedia.org/wiki/1-Wire.

W materiałach dodatkowych zamieściłem wszystkie informacje na temat 1-Wire, jakie posiadam.

Nie ma sensu dokładnie wyjaśniać działania 1-Wire skoro producent udostępnia stosowne dokumenty. Zajmiemy się istotnym zagadnieniem, czyli generowaniem sygnału RESETU rozpoczynającego każdą transmisję i sposobem przesyłania pojedynczych bitów. Nie będę omawiał trybu OVERDRIVE, który jest ciekawy, ale DS18B20 go nie obsługuje. Na początek realizacja sprzętowa – rysunek 1. Jak widać jest to rozwiązanie stosowane w I2C, tyle że tam mamy dwie linie a tu jedną.

Rysunek 1

Sygnałem do rozpoczęcia transmisji jest RESET – rysunek 2.

Rysunek 2

Przybiera on postać impulsu o poziomie niskim, trwającego od 460 do 960 μs, ale są wyjątki. Niektóre układy wymagają dłuższego sygnału – rysunek 3.

Rysunek 3

Po 15–60 μs od sygnału RESET układy slave wystawiają sygnał PRESENCE, trwający od 60 do 240μs. Transmisję bitu pokazuje rysunek 4. Wysłanie zera polega na ustawieniu poziomu L na czas od 60 do 120 μs. Wysłanie jedynki to impuls L o czasie od 1 do 15 μs. W celu odczytu bitu master wysyła impuls o czasie 1–15 μs, a po 15 μs na magistrali (w przypadku braku slave lub odsyłania jedynki przez niego) musi być poziom H. To oznacza w praktyce impuls L od mastera o czasie maksymalnym 10 μs. Slave przedłuża impuls L do 30–60 μs, gdy chce odesłać zero, albo nie robi nic, gdy ma to być jeden. Master próbkuje magistralę po 15 μs od chwili rozpoczęcia generowania impulsu slotu odczytu, w praktyce jest to zwykle czas 30–45 μs.

Rysunek 4

No to niezbędną teorię mamy za sobą. Teraz zajmiemy się zagadnieniem, jak realizowane jest to sprzętowo? Niezwykle prosto ale jednocześnie nie najlepiej. Listing 1:

void owWriteBit(bool d){
  CLI();	// wyłączenie wszystkich przerwań
  GPIO = 0;
  if( d ) delay_us(1); else delay_us(60);
  GPIO = 1;
  SEI();	// włączenie przerwań
  if( d ) delay_us(64-1); else delay_us(64-60);
}
bool owReadBit(){
  uint8_t d = 0;
  CLI();	// wyłączenie wszystkich przerwań
  GPIO = 0;
  delay_us(1);
  GPIO =1;
  delay_us(15);
  if( GPIO ) d = 1;
  SEI();		// włączenie przerwań
  delay_us(64-1-15);
  return d;
}

(…)

——– ciach! ——–

To jest tylko fragment artykułu, którego pełna wersja ukazała się w numerze majowym czasopisma Zrozumieć Elektronikę (ZE 5/2024). Pełną wersję czasopisma znajdziesz pod tym linkiem. Natomiast niepełna, okrojona wersja, pozwalająca zapoznać się z zawartością numeru ZE 5/2024 znajduje się tutaj.

SaS, ZE
sas.ze@vp.pl

Uwaga! Osoby, które nie są (jeszcze) stałymi Patronami ZE, mogą nabyć PDF-y z pełną wersję tego numeru oraz wszystkich innych numerów czasopisma wydanych od stycznia 2023, „stawiając kawę” (10 złotych za jeden numer czasopisma w postaci pliku PDF).
W tym celu należy kliknąć link (https://buycoffee.to/piotr-gorecki), lub poniższy obrazek
Postaw mi kawę na buycoffee.to
Następnie wybrać:
– jeśli jeden numer ZE – 10 zł,
– jeśli kilka numerów ZE – WSPIERAM ZA. I tu wpisać kwotę zależną od liczby zamawianych numerów – wydań (N x 10 zł),
Wpisać imię nazwisko.
Podać adres e-mail.
Koniecznie zaznaczyć: „Chcę dołączyć wiadomość dla Twórcy” i tu wpisać, który numer lub numery mamy wysłać na podany adres e-mailowy. Jeśli ma to być numer z tym artykułem trzeba zaznaczyć, że chodzi o ZE 4/2024.
UWAGA!!! E-mail z linkiem do materiałów (weTransfer) wysyłamy zazwyczaj w ciągu 24 godzin. Czasem zdarza się jednak, że trafia do spamu. Jeśli więc nie pojawi się w ciągu 48 godzin prosimy sprawdzić w folderze spam, a ewentualny problem zgłosić na adres: kontakt@piotr-gorecki.pl.