Mail to Author Главная

Обработка сигналов протокола дистанционного управления RC-5

В наше время дистанционное управление используется повсеместно, любое мало-мальски грамотное устройство имеет свой пульт дистанционного управления (ПДУ). Многие производители такой техники разработали и используют свои протоколы. Одним из наиболее распространенных протоколов ДУ является разработанный компанией Philips протокол RC-5. Наиболее подробное его описание на русском языке можно получить здесь [1]. В случае, если страница была перемещена или более не доступна, здесь лежит копия этой страницы в архиве.

При разработке устройств на микроконтроллерах также возможно включение кода, отвечающего за обработку сигналов ДУ, что позволяет повысить эксплуатационные показатели разрабатываемого устройства. В частности, на страницах журнала "Радиолюбитель" номер 4 за 2009 год была опубликована статья "Помехоустойчивый декодер RC-5" автора Леонида Ридико. Исходный код разработан для микроконтроллеров AVR. Мною исходный код был портирован на микроконтроллеры PIC компании Microchip. При опробовании его на микроконтроллере PIC12F675 алгоритм показал себя превосходно (до сих пор в работе три устройства на указанных PICах), однако при переносе на контроллеры PIC16F87xA он не заработал вообще. Короче отложено на потом...

Прелесть указанного алгоритма в том, что он полностью построен на прерываниях и, следовательно, минимально использует процессорное время при обработке пакета.

Поскольку требовалось заставить устройство на микроконтроллере PIC16F877A понимать протокол RC-5 был использован другой алгоритм, найденный на форуме Микрочип. Оформленный в отдельный библиотечный файл, он представлен ниже. Это последовательный алгоритм, который запускается по принятии первого бита пакета и "крутится" до приема последнего. При этом микроконтроллер занят только приемом пакета. Временные рамки устанавливаются по таймеру 0.

//File rc5.h

//Function for receiving RC5-packet and decode it

//For normal work used TMR0 without overflow interruption

#include

#define OSC 4 //MHz - oscillator frequency

#define PRESCALLER 16 //TMR0 prescaller ratio

#define TICK (16/OSC*PRESCALLER/4) //uS - one timer0 tick

#define dT1 (656/TICK) //must be about 650 uS

#define dT2 (1008/TICK) //must be about 1008 uS

#define dT3 (1328/TICK) //must be about 1328 uS

#define dT4 (2208/TICK) //must be about 2208 uS

#define RC5In RB0

void decodeRC5 (unsigned char *system,      //return system number

                         unsigned char *command);  //return command number

 

//File rc5.c

//Function for receiving RC5-packet and decode it

//For normal work used TMR0 without overflow interruption

#include "rc5.h"

#include

void decodeRC5 (unsigned char *system, unsigned char *command)

{

   unsigned char half = 1;

   unsigned char last = 0;

   unsigned int data = 0;

   unsigned char received = 0;

   unsigned long timer= 0;

   if (!RC5In) //RC-5 are received

   {

      half = 1;

      last = 0;

      data = 0;

      received = 0;

      while (received < 14)

      {

         TMR0= 0; 

         while (last == RC5In)

         {

            if (TMR0>dT4) goto out;

         }

         if (half)

         {

            if ((TMR0>dT1) && (TMR0<dT2))

            {

               data <<= 1; received++;

               if (last < RC5In) data++;

               half = 0;

            }

            else if ((TMR0>dT3) && (TMR0<dT4))

            {

               data <<= 1; received++;

               if (last < RC5In) data++;

               half = 1;

            }

            else goto out;

         }

         else

         {

            if ((TMR0>dT1) && (TMR0<dT2)) half= 1;

            else goto out;

         }

         last = RC5In;

         if ((received == 13)&&(last==1)&&(half == 1))

         {

            data <<= 1;

            received++;

         }

         *system= data>>6;

         *system= *system & 0b00011111; //get 6-10 bits of message

         *command= data & 0b0000000000111111; //get command, least significant 6 bits

      }

out:

   data= data*1;

}

 

 

Исходный код алгоритма для микроконтроллеров PICMicro

Для опытов с алгоритмом на макетной плате была собрана простейшая схема с ЖКИ на основе контроллера HD44780 и датчиком ИК сигнала. Также была написана пробная программа, выводящая на ЖКИ номера системы и команды. Исходный код и hex-файл имеются в архиве. В заголовочном файле lcd.h описано подключение ЖКИ. Выход датчика подключен на пин RB0. Внешний вид макетки приведен ниже.

Если не имеется по рукой свободного ЖКИ, можно использовать светодиоды с минимальной доработкой схемы и программы.

Источники


1. Микроэлектронные проекты Телесистем - Применение кода RC-5. Ридико Леонид Иванович.

Дополнительно


2010©Electricianman


Сайт управляется системой uCoz