Kończąc opis oprogramowania, opiszę funkcję inicjującą odbieranie danych. Ta funkcja, poza przygotowaniem zmiennych używanych w mechanizmie odbioru danych, uruchamia odbiornik transceivera RFM-12B, co powoduje wygenerowanie szeregu przerwań, w ramach obsługi których następuje faktyczne odebranie ramki danych. Jej odebraniu (z poprawną sumą CRC8) towarzyszy zmiana wartości globalnej zmiennej statusowej RFM12B.Status na predefiniowaną wartość NEW_PACKET. W tym momencie odebrane dane umieszczone zostają w globalnej zmiennej RFM12B.Buffer.
Pora na „wisienkę na torcie”, czyli funkcję obsługi przerwania zewnętrznego (od wyprowadzenia nIRQ modułu), która to jest „silnikiem” całego mechanizmu realizując rzeczywiste nadawanie lub odbieranie danych. Zaopatrzono ją w bardzo bogate komentarze, więc nie wymaga ona dodatkowego opisywania. Warto jednak zauważyć, że cały proces wysyłania czy odbierania danych odbywa się w tle nie wstrzymując działania pętli głównej aplikacji. Bieżący stan realizowanego procesu możemy każdorazowo sprawdzić testując wartość zmiennej globalnej RFM12B.Status.
Uff, to tyle, jeśli chodzi o nasze ciekawe peryferium, w związku z czym pora na przedstawienie szczegółów konstrukcyjnych przedmiotu niniejszego artykułu, a mianowicie bezprzewodowego, energooszczędnego systemu wielopunktowego pomiaru temperatury, który w założeniach charakteryzować się ma następującymi cechami funkcjonalnymi:
- Obsługa do 32 adresowalnych węzłów pomiarowych (układów Slave).
- Zasilanie bateryjne i niski pobór mocy węzła pomiarowego.
- Pozostawanie w uśpieniu węzłów pomiarowych i cykliczne wybudzanie się, któremu towarzyszy przesyłanie wartości mierzonej temperatury oraz stanu baterii zasilającej.
- Efektowny, graficzny interfejs użytkownika po stronie układu nadrzędnego (układu Master).
- Wysoka ergonomia obsługi całego systemu i brak konieczności konfiguracji.
- Kontrola aktywności węzłów pomiarowych przez układ nadrzędny.
Zacznijmy zatem od układu podrzędnego, czyli węzła pomiarowego. Jego „sercem” jest niewielki mikrokontroler ATtiny24 sterujący pracą modułu transceivera dzięki realizacji programowej obsługi interfejsu SPI oraz obsłudze przerwania zewnętrznego Pin Change Interrupt 1 (wyprowadzenie PCINT9) odpowiedzialnego za mechanizm wysyłania danych. Ponadto, dzięki wykorzystaniu przetwornika A/C wbudowanego w mikrokontroler, możliwy stał się pomiar temperatury przetwornika temperatura/napięcie pod postacią układu TC1047 oraz pomiar napięcia baterii zasilającej.
Na pierwszy „rzut oka” nie wydaje się, aby mikrokontroler w jakikolwiek sposób używał przetwornika A/C do pomiaru napięcia baterii zasilającej, ponieważ żadne z jego wejść zewnętrznych nie jest używane w tym celu. To prawda. Patrząc na schemat układu i nie mając do dyspozycji listingu programu można by wysnuć taki wniosek, jednak przetwornik A/C mierzy w takim przypadku specjalne, wewnętrzne napięcie odniesienia VBG=1,1 V, dzięki temu, iż wewnętrzny, analogowy multiplekser przetwornika może zostać właśnie w ten sposób ustawiony. Napięciem odniesienia jest w takim wypadku napięcie zasilające mikrokontroler, czyli napięcie dostarczane na wyprowadzenie VCC. Skoro mierzone napięcie ma wartość stałą (1,1 V), zaś napięcie odniesienia wartość zmienną, łatwo możemy ustalić jego wartość. Dzięki temu „trickowi” stał się możliwy pomiar napięcia baterii zasilającej bez angażowania dodatkowego pinu mikrokontrolera, którego de facto już nie mamy. Dodatkowo, mikrokontroler obsługuje 5 wyprowadzeń adresowych A0…A4, pozwalających na ustawienie adresu sprzętowego węzła pomiarowego.