Autor: Dondu
Artykuł jest częścią cyklu: Podczerwień - Transmisja danych
W poprzednim artykule przedstawiłem przykład dekodowania sygnału RC-5 pochodzącego z pilota podczerwieni. Pokazałem tam prosty sposób prezentacji przesłanych danych za pomocą diod LED.
W niniejszym artykule znajdziesz ten sam algorytm dekodowania jaki opisałem w poprzednich artykułach z cyklu o RC-5, z dodatkiem komunikacji z komputerem za pomocą interfejsu szeregowego RS-232.
Pozwoli nam to na odczytywanie każdej ramki przesyłanych danych i prezentacji ich na ekranie komputera. W ten sposób, można bardzo szybko ustalić:
- numer urządzenia zakodowany w pilocie,
- stan bitu toggle,
- nr komendy przyciśniętego przycisku.
Schemat
Schemat oparty jest o poprzedni przykład. Podobnie jak w tamtym przypadku do obserwowania, czy układ testowy reaguje na przesyłane dane z pilotów, wykorzystamy jedną diodę LED, którą nazwiemy tak samo jak wcześniej, czyli LED3.
Do komunikacji RS-232 wykorzystamy piny RxD oraz TxD dołączając odpowiedni układ pośredniczący którego schematy możesz znaleźć w artykule: RS-232: Komunikacja ATmega8 z komputerem, w którym znajdziesz także informacje dot. krzyżowania się RxD i TxD. Jeżeli posiadasz na przykład konwerter USB-RS232, który poprawnie działa z poziomami logicznymi TTL, to nie musisz dodawać żadnych układów pośredniczących.
W związku z powyższym nasz schemat testowy wyglądać powinien następująco:
Program
Jak już wspomniałem wykorzystamy ten sam algorytm dekodowania danych, który prezentuję w artykule RC-5 - Algorytm odbioru danych. Do komunikacji z terminalem komputera wykorzystamy bibliotekę USART działającą na przerwaniach zaprezentowaną w artykule RS-232: Komunikacja ATmega8 z komputerem.
Program nasz będzie wyświetlał w każdym wierszu jedną ramkę danych, a dane będą prezentowane w następującej kolejności kolumn:
- nr urządzenia,
- stan bitu toggle,
- nr komendy (przycisku),
- fragment ramki (w zapisie binarnym) począwszy od bitu toggle zgodnie z:
Zmiany w pliku RC5_main.c w stosunku do programu z poprzedniego artykułu:
Biblioteka dd_usart
Aby wykorzystać bibliotekę należy dodać jej plik nagłówkowy do pliku RC5_main.c:
#include "dd_usart.h"
oraz dołączyć pliki biblioteki (dd_usart.h i dd_usart.c) do drzewa projektu.
W pliku nagłówkowym dd_usart.c ustaw wybraną prędkość transmisji danych taką samą jak ustawisz w terminalu:
#define BAUD 9600 //tutaj podaj żądaną prędkość transmisji
Funkcja to_binary()
Do prezentacji (w kodzie binarnym) fragmentu odebranej ramki zgodnie z powyższym rysunkiem użyjemy funkcji to_binary(), która używa funkcji strcat(). Aby funkcja ta działała należy dołączyć nagłówek string.h:
#include <string.h>
Funkcja konwersji:
//funkcja konwersji liczby na ciąg znaków reprezentacji binarnej //wykorzystuje nagłówek string.h const char *to_binary(int x){ int z; static char b[13]; b[0] = '\0'; for (z = 2048; z > 0; z >>= 1){ strcat(b, ((x & z) == z) ? "1" : "0"); } return b; }
Funkcja test()
W funkcji tej wykorzystujemy funkcję sprintf() do konwersji danych na ciągi znaków. W związku z tym niezbędne jest dołączenie nagłówka stdio.h:
#include <stdio.h>
Funkcja test() wygląda następująco:
void test(void){ //Funkcja testowa wysyłająca odbierane z pilota RC5 dane do terminala, //za pomocą interfejsu RS-232. //Funkcję tę możesz dowolnie skomplikować lub usunąć. static unsigned char bit_toggle; static unsigned char nr_urzadzenia; static unsigned int ramka; //przygotuj dane do prezentacji bit_toggle = (dd_rc5_status & 0b100000)? 1 : 0; nr_urzadzenia = (dd_rc5_status & 0b11111); //składamy fragment ramki w celu jej prezentacji w terminalu ramka = (dd_rc5_status << 6) | dd_rc5_dane_odebrane; //wynik przekształć na znaki ładując do bufora usart_bufor[] sprintf(usart_bufor, "%d %d %3d %s", nr_urzadzenia, bit_toggle, dd_rc5_dane_odebrane, to_binary(ramka)); //rozpocznij wysyłanie wyniku przez RS-232 dd_usart_wyslij_wynik(); //Ponieważ odczytaliśmy odebrane dane zgaś flagę gotowości //danych do odczytu, by umożliwić odebranie następnych danych dd_rc5_status &= ~DD_RC5_STATUS_DANE_GOTOWE_DO_ODCZYTU; DD_RC5_WLACZ_DEKODOWANIE; }
Do pobrania
Pobierz: RC5-Dekodowanie-przyklad-2.zip (kopia)
W pliku ZIP znajdują się:
- kompletny projekt w AVR Studio 4.18
- pliki dd_rc5.c, dd_rc5.h, RC5_main.c, dd_usart.c oraz dd_usart.h.
- a także plik RC5-ver4.hex skompilowany dla ATmega8 z zegarem 1MHz (domyślny w ATmega8), transmisji danych RS-232 dla 9600 bodów, 8 bitów danych, jeden bit stopu, bez bitu parzystości, który można wgrać do mikrokontrolera.
Prezentacja danych w terminalu
Jako terminal użyjemy programu Realterm, który także jest opisany szerzej w tym artykule. Po uruchomieniu terminala ustaw parametry transmisji zgodnie z niniejszym rysunkiem:
Po ustawieniu parametrów transmisji kliknij przycisk Change, a następnie sprawdź, czy w prawym dolnym rogu parametry zostały ustawione prawidłowo.
Aby nie obserwować znaków specjalnych w zakładce Display wybierz opcję Ansi.
Więcej na temat Realterm znajdziesz w artykule: RS-232: Komunikacja ATmega8 z komputerem
Włączamy zasilanie i testujemy
Po włączeniu zasilania w terminalu powinien pojawić się napis:
Jeżeli napis się nie pojawił sprawdź poprawność połączeń w szczególności zasilania oraz RS-232.
Jeżeli poprawnie połączyłeś odbiornik IR, to po naciśnięciu przycisków pilota powinieneś oglądać dane w terminalu (przykład z dodatkowym opisem białymi literami):
Kolumny danych prezentowane są według kolejności podanej wcześniej w tym artykule.
Witam, bardzo dobry artykuł. Mam też pytanie czy można go "przerobić" do standardu NEC. Próbuje sam coś, ale mi niestety mi nie wychodzi.
OdpowiedzUsuńMi także bardzo się podoba artykuł :) Dopiero co się przerzuciłem na C z Bacsoma i walczę, żeby ten soft działał na atmega64. Potem też będę kombinował żeby wyjść z tego do standardu nec oraz transmisji tanimi modułami 433mhz :)
OdpowiedzUsuń