В наше время дистанционное управление используется повсеместно, любое мало-мальски грамотное устройство имеет свой пульт дистанционного управления (ПДУ). Многие производители такой техники разработали и используют свои протоколы. Одним из наиболее распространенных протоколов ДУ является разработанный компанией 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 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 { 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. Внешний вид макетки приведен ниже.
Если не имеется по рукой свободного ЖКИ, можно использовать светодиоды с минимальной доработкой схемы и программы.
Источники
Дополнительно
2010©Electricianman