Promocja: 40% rabatu na wszystkie książki drukowane HELION (elektronika, programowanie) + darmowa dostawa. Polecane tytuły »

RFM12B – #2 – Koniec ciszy w eterze

RFM12B – #2 – Koniec ciszy w eterze

Poprzednio zakończyliśmy na podłączeniu modułu RFM12B do procesora i sprawdzeniu komunikacji po magistrali SPI.

Teraz już czas najwyższy na przesłanie informacji pomiędzy dwoma modułami. Zatem do dzieła!

« Poprzedni artykuł z seriiNastępny artykuł z serii »

Wstępna konfiguracja układu i oczekiwanie…

Na samym początku musimy odpowiednio skonfigurować nasz układ, co zrealizujemy korzystając z następującej funkcji:

Najpierw oczywiście dokonujemy programowego resetu naszego układu, aby mieć pewność, że nie natkniemy się na jakieś niespodzianki czy pozostałości po poprzednich transmisjach.

Potem przystępujemy do konfiguracji układu, zapisując wartości do rejestrów konfiguracyjnych. Opiszę tu pokrótce, co robią dane polecenia, jednak do pełnego ich zrozumienia konieczna jest lektura noty katalogowej:

  1.  Ustawiamy częstotliwość pracy układu (musi być zgodna z oznaczeniem pasma na układzie: 433/868/915MHz) oraz inne parametry analogowe. Włączamy także bufor odbiorczy danych.
  2. Włączamy oscylator i wyłączamy wyjście zegarowe z układu (w celu zmniejszenia zakłóceń).
  3. Ustawiamy częstotliwość nośną (czyli częstotliwość, na jakiej będzie pracował układ) – nadajnik i odbiornik muszą mieć ustawioną oczywiście tę samą wartość. Jeśli chcemy używać równolegle kilku linii komunikacyjnych, opartych na tych układach, to możemy kolejnemu systemowi ustawić inną częstotliwość. W komentarzu podałem zakres częstotliwości dla modułu 868MHz i skok, z jakim możemy je ustawiać – pamiętajmy jednak, że stosując dwa systemy pracujące na zbliżonych częstotliwościach, narażamy się na zakłócenia.
  4. Ustawiamy prędkość transmisji – zasadniczo im wyższa prędkość, tym szybciej dane zostaną przesłane, jednak jednocześnie zwiększa się wtedy wpływ zakłóceń.
  5. Konfigurujemy parametry odbiornika – poziom sygnału, na jaki będzie reagował oraz rozpiętość zakresu częstotliwości, które będzie akceptował.
  6. Aktywujemy cyfrowe dekodowanie danych.
  7. Ustawiamy generowanie przerwania po odebraniu 8 bitów danych (wykorzystamy tę funkcjonalność w kolejnej części naszych zmagań) oraz ustawiamy wykorzystanie 2 bajtów synchronizacyjnych. Teraz do synchronizacji będziemy musieli przesłać 5 bajtów, 4 o stałych wartościach: 0xAA 0xAA 0xAA 0x2D oraz piąty, którego wartość będziemy potem definiować. Dzięki temu odbiór danych będzie rozpoczynany tylko po otrzymaniu tej sekwencji, a dodatkowy definiowany bajt możemy wykorzystać jako adres odbiorczy naszego układu.
  8. Konfigurujemy automatyczny kontroler częstotliwości.
  9. Ustawiamy maksymalną moc nadajnika i parametry modulacji.
  10. Konfigurujemy pętlę PLL, powielającą częstotliwość z rezonatora.
  11. Wyłączamy timer do wybudzania układu z drzemki, a także tryb oszczędzania energii.
  12. Ustawiamy wykrywanie zaniku zasilania na poziom 2,2V.

Ponadto przygotujmy jeszcze jedną funkcję, która podczas nadawania i odbierania umożliwi sprawdzenie, czy układ jest gotowy do zapisania kolejnego bajtu do nadania lub czy odebrany został już cały bajt i można go odczytać z bufora układu.

Funkcja ta na początku aktywuje układ RFM12B, a następnie oczekuje na wystąpienie stanu wysokiego na linii MISO – w ten sposób RFM sygnalizuje gotowość.

Ponadto, prezentowana funkcja nie będzie oczekiwała w nieskończoność. Jeśli układ RFM nie da sygnału o gotowości w przeciągu 200ms (gdyż np. nie odbierze w tym czasie żadnych danych, bo nikt do niego nie nadaje), funkcja zwróci wartość 1, co oznacza, że w tym czasie układ nie odpowiedział.

Pierwsze odbieranie

Teraz, kiedy wiemy już jak wstępnie skonfigurować moduł radiowy, przyszedł czas na napisanie oprogramowania dla odbiornika i nadajnika. Zacznijmy od tego pierwszego:

Jak widać, program odbiornika jest niezwykle prosty:

  1. Po inicjalizacji układu ustawiamy wspomniany wcześniej bajt synchronizacji na wartość 0xD4.
  2. Włączamy tryb odbiornika i układ oscylatora.
  3. Ww pętli głównej na początku resetujemy synchronizację tak, aby kolejne dane układ zaczął odbierać dopiero po przesłaniu 5 bajtów synchronizacyjnych.
  4. Teraz musimy poczekać na odpowiedź układu RFM, który poinformuje nas, jeśli odbierze jakieś dane. W przeciwnym wypadku po ok. 200ms program wyświetli komunikat o braku danych.
  5. Jeśli dane zostaną odebrane, to wówczas odczytujemy 1 bajt z bufora układu RFM (tyle będzie nadawał nadajnik) i wyświetlamy jego wartość.

Nadawanie

Do czego byłby nam przydatny odbiornik, do którego nie miałby kto nadawać! W tym przypadku, w celach demonstracyjnych, oprócz podpiętego układu RFM12B, podłączmy do pinów PB0 i PB1 przyciski zwierające do masy i przyjrzyjmy się poniższemu programowi:

 

Program po inicjalizacji układu i konfiguracji pinów do obsługi przycisków, sprawdza, czy którykolwiek z przycisków został przyciśnięty. Jeśli tak, to wykonywane są instrukcje obsługi modułu radiowego:

  1. Włączamy tryb nadawania i oscylator, po czym czekamy chwilę na reakcję układu.
  2. Każdorazowo czekamy aż układ będzie gotowy do przyjęcia kolejnej porcji danych.
  3. Wysyłamy 3-krotnie bajt o wartości 0xAA (I część synchronizacji).
  4. Wysyłamy bajt o wartości 0x2D (II część synchronizacji).
  5. Wysyłamy bajt o wartości 0xD4 – jest to definiowalny bajt synchronizacji, który my wykorzystamy np. jako adres układu. Już teraz możecie sprawdzić, że zmiana tego bajtu na różne wartości w nadajniku i odbiorniku spowoduje całkowity brak komunikacji.
  6. Wysyłamy nasze dane – w tym przykładzie jeden bajt.
  7. Wysyłamy 1 bajt o jakiejkolwiek wartości, aby móc wyłączyć odbiornik w odpowiednim momencie.
  8. Czekamy, aż ostatnio wpisany bajt (u nas 0xAA) będzie nadawany (zwolni się miejsce w buforze, co zasygnalizuje odpowiedni bit w rejestrze statusu) i wyłączamy nadajnik.

Tym oto sposobem w terminalu podpiętym do układu MASTER (odbiornika) powinniśmy zobaczyć efekt podobny do tego:

02_terminal

Gdzie 1 - oznacza wciśnięcie pierwszego przycisku, 2 – drugiego, a 3 - obu.

W ten sposób wykonaliśmy prosty pilot radiowy, który informuje nas o wciśnięciu przycisków! Posiada on jednak kilka mniej lub bardziej istotnych wad, ale o tym porozmawiamy w kolejnej części – tymczasem możemy pobawić się w zdalne miganie diodami LED, odpowiednio modyfikując przedstawione programy.

« Poprzedni artykuł z seriiNastępny artykuł z serii »

Załączniki

RFM12B_02_simplex (zip, 43 KB)

avr, komunikacja, RFM12B, SPI

Trwa ładowanie komentarzy...