czwartek, 31 marca 2011

Podczerwień: RC-5 - Testowanie pilota z terminelem RS-232


Autor: Dondu


Artykuł jest częścią cyklu: Podczerwień - Transmisja danych


Podczerwień: Odbiór danych z pilota RC-5 przez RS-232 i terminal.
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:


Schemat układu testowego odbiornika podczerwieni RC-5 wraz z terminalem RS-232.






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:
  1. nr urządzenia,
  2. stan bitu toggle,
  3. nr komendy (przycisku),
  4. fragment ramki (w zapisie binarnym) począwszy od bitu toggle zgodnie z:

Ramka odbiorcza RC-5 z fragmentem pokazywanych danych w terminalu RS-232.



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:

Terminal RealTerm - ustawienia parametrów transmisji danych.

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:


Terminal RealTerm - ekran powitalny przykładu.


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):

Terminal RealTerm - przykładowe dane odebrane z pilota RC-5 wraz z opisem.

Kolumny danych prezentowane są według kolejności podanej wcześniej w tym artykule.


2 komentarze:

  1. 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ń
  2. 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ń