Протокол RC5

Обсуждаем цифровые устройства...
Ответить
Родился
Сообщения: 5
Зарегистрирован: Вс фев 21, 2016 12:50:58

Сообщение redred999 »

Написал протокол RC5 приемника, в теории работает превосходно, но на практике почему то улавливает только 3 бита бывает и 2.
если кто может подсказать, выкладываю проект протокола приемника и прошивку генератора протокола RC5 (hex), думаю проект генератора не нужен посылка генератором пакета первая через 1 сек остальные через 9 сек(первая важна, так как остальные тоже самое)
у генератора число 0b11000000000001
Вложения
RC5_12F629.rar
(389.1 КБ) 179 скачиваний
RC5_12F629.rar
(389.1 КБ) 149 скачиваний
Реклама
Друг Кота
Сообщения: 9451
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Сообщение roman.com »

Показывайте в нормальном виде.

А вообще... есть готовые проекты, с подробным описанием... http://radioparty.ru/prog-avr/program-c/392-lesson-rc5

Тут (на коте) тоже есть проектик - http://radiokot.ru/articles/16/

А вообще... каждый делает так, как ему больше нравиться))) :)
Реклама
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2042
Зарегистрирован: Чт дек 27, 2012 20:46:09
Откуда: Болгария, г. Лом

Сообщение botchin »

redred999, что-то очень замъсловато.
Спойлер

Код: Выделить всё

 #include <pic.h>
 __CONFIG (INTIO & UNPROTECT & BOREN & MCLRDIS & PWRTEN & WDTDIS);
 
 #define _XTAL_FREQ 4000000 

volatile unsigned int TMR, buff, code;                          // таймер, временный буфер , окончательный код
volatile unsigned char state, MID = 1 ,NOT_MID = 2, DS;         // статус ( середина,не середина), DS(пустота)
signed char tim = 13;                                           // счетчик битов всего 14 бит
signed char ct;			//счетчик
signed char ERR_IN,err_ct;		//ошибка
	
     void interrupt xxx (void) {
           GPIF = 0;   	                                        // сбросим флаг для выхода

		if(ct == 0 && GPIO5==1){		//если не бъло ничего и получилась 1
			TMR1L = 20;	    // 20 - время в циклах от възова преръвание до TMR1ON=1
			TMR1H = 0;		// будем ждать еще 1758uS 
			TMR1ON=1;
			buff =1;
			err_ct = 0;
		}
		ct++;	
        TMR = (TMR1H << 8) | TMR1L;     // прочтем таймер1 и запишем в переменную   
		if(TMR > 1420){				 	//Если перешли 4/5      1778/5*4
//		if(TMR > 1420 && TMR < 2130){	//Если перешли 4/5 но не более 6/5 от 1778uS    
			
	        buff << = 1;                                    // двинем на 1-цу
	        buff | = GPIO5;                                 // запишем текущее значение ножки                              
            TMR1L = TMR1H = 0;                              // подготовим для следующего
		}
		else
			err_ct += (ct-1)?1:0;		//ошибка
		if (ct == 13) {					//здесь не проверял - принято ли все
			ct=0;						//подготовимся для следующего
			TMR1ON =0;
		}
		if (err_ct >20)					//подлежит настройке, можно и не делать
			ERR_IN=1;
		return;
    }

   void main (void){
  
           CMCON =  0x07;						                // отключение компараторов на GP0 ,GP1
           GPIO =   0x00;						                // чистим порт				               
	       GPPU =   1;                                          // откл подтяжек
	       TRISIO = 0x20;                                       // GP5 вход, остальное на выход
	       TMR1ON = 0;                                          // таймер отк
	       IOCB5 =  1;                                          // прерывание от изменения уровня ножки
           GIE =    1;                                          // разрешить глобальные прерывания
           GPIE =   1;                                          // разрешить прерывание от ножки
           GPIF =   0;                                          // сбросить флаг прерывания от ножки(на всякий случай)
    	   ERR_IN = 0;
           while(!ERR_IN)
			;
}                                       // конец основной программы
Идея в чем.
Первъй импульс запускает TMR1 и пополняет буффер, С прихода второго импульса проверяем время его прихода находится ли въше 1420uS. (второй вариант въше 1420 и ниже 2130uS) Если да то принимаем его за валиднъй и т.д.

Есть и начало для обработки ошибок - лень переборола меня.
Лом - ето город в Болгарии, а не инструмент юстировки електроники.
Родился
Сообщения: 5
Зарегистрирован: Вс фев 21, 2016 12:50:58

Сообщение redred999 »

Выкладываю прошивку генератора
Вложения
RC5 generator.hex
(681 байт) 476 скачиваний
Реклама
Эиком - электронные компоненты и радиодетали
Родился
Сообщения: 5
Зарегистрирован: Вс фев 21, 2016 12:50:58

Сообщение redred999 »

botchin писал(а):redred999, что-то очень замъсловато.
Спойлер

Код: Выделить всё

 #include <pic.h>
 __CONFIG (INTIO & UNPROTECT & BOREN & MCLRDIS & PWRTEN & WDTDIS);
 
 #define _XTAL_FREQ 4000000 

volatile unsigned int TMR, buff, code;                          // таймер, временный буфер , окончательный код
volatile unsigned char state, MID = 1 ,NOT_MID = 2, DS;         // статус ( середина,не середина), DS(пустота)
signed char tim = 13;                                           // счетчик битов всего 14 бит
signed char ct;			//счетчик
signed char ERR_IN,err_ct;		//ошибка
	
     void interrupt xxx (void) {
           GPIF = 0;   	                                        // сбросим флаг для выхода

		if(ct == 0 && GPIO5==1){		//если не бъло ничего и получилась 1
			TMR1L = 20;	    // 20 - время в циклах от възова преръвание до TMR1ON=1
			TMR1H = 0;		// будем ждать еще 1758uS 
			TMR1ON=1;
			buff =1;
			err_ct = 0;
		}
		ct++;	
        TMR = (TMR1H << 8) | TMR1L;     // прочтем таймер1 и запишем в переменную   
		if(TMR > 1420){				 	//Если перешли 4/5      1778/5*4
//		if(TMR > 1420 && TMR < 2130){	//Если перешли 4/5 но не более 6/5 от 1778uS    
			
	        buff << = 1;                                    // двинем на 1-цу
	        buff | = GPIO5;                                 // запишем текущее значение ножки                              
            TMR1L = TMR1H = 0;                              // подготовим для следующего
		}
		else
			err_ct += (ct-1)?1:0;		//ошибка
		if (ct == 13) {					//здесь не проверял - принято ли все
			ct=0;						//подготовимся для следующего
			TMR1ON =0;
		}
		if (err_ct >20)					//подлежит настройке, можно и не делать
			ERR_IN=1;
		return;
    }

   void main (void){
  
           CMCON =  0x07;						                // отключение компараторов на GP0 ,GP1
           GPIO =   0x00;						                // чистим порт				               
	       GPPU =   1;                                          // откл подтяжек
	       TRISIO = 0x20;                                       // GP5 вход, остальное на выход
	       TMR1ON = 0;                                          // таймер отк
	       IOCB5 =  1;                                          // прерывание от изменения уровня ножки
           GIE =    1;                                          // разрешить глобальные прерывания
           GPIE =   1;                                          // разрешить прерывание от ножки
           GPIF =   0;                                          // сбросить флаг прерывания от ножки(на всякий случай)
    	   ERR_IN = 0;
           while(!ERR_IN)
			;
}                                       // конец основной программы
Идея в чем.
Первъй импульс запускает TMR1 и пополняет буффер, С прихода второго импульса проверяем время его прихода находится ли въше 1420uS. (второй вариант въше 1420 и ниже 2130uS) Если да то принимаем его за валиднъй и т.д.

Есть и начало для обработки ошибок - лень переборола меня.
К сожалению Ваш код не работает((
Реклама
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2042
Зарегистрирован: Чт дек 27, 2012 20:46:09
Откуда: Болгария, г. Лом

Сообщение botchin »

redred999, я попътался вам идею дать, а не работающего кода.
Лом - ето город в Болгарии, а не инструмент юстировки електроники.
Реклама
Родился
Сообщения: 5
Зарегистрирован: Вс фев 21, 2016 12:50:58

Сообщение redred999 »

я просто уже большое время голову ломаю
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2042
Зарегистрирован: Чт дек 27, 2012 20:46:09
Откуда: Болгария, г. Лом

Сообщение botchin »

Ето графическое представление идей
Изображение
Краснъй цвет - преръвание
Синий - прием
Зелений - отбрасъваем

Кстати, у меня нет 12F629, да и вряд ли кто-то возмется и сделает все за вас. Макетку, программу, спаять, написать .... Так что, HEX файла генератора мне не нужен - если въложите код - можно и посмотрет. Я расчитъваю, что въ получаете код в стандарте RC5 (1778uS).

Можно еще вариант сделать = по преръванию с TMR1
Лом - ето город в Болгарии, а не инструмент юстировки електроники.
Родился
Сообщения: 5
Зарегистрирован: Вс фев 21, 2016 12:50:58

Сообщение redred999 »

вот код , я его в самом начале выложил
Вложения
main.c
(5.94 КБ) 133 скачивания
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2042
Зарегистрирован: Чт дек 27, 2012 20:46:09
Откуда: Болгария, г. Лом

Сообщение botchin »

botchin писал(а): HEX файла генератора мне не нужен - если въложите код - можно и посмотрет. Я расчитъваю, что въ получаете код в стандарте RC5 (1778uS).
Я код приема посмотрел и свое мнение въсказал.
botchin писал(а):redred999, что-то очень замъсловато.
Лом - ето город в Болгарии, а не инструмент юстировки електроники.
Ответить

Вернуться в «Цифровая техника»