Страница 1 из 1

кодировка RC-5 и INT0 в Atmega8

Добавлено: Пн июл 22, 2013 18:55:10
king-live
Доброго времени суток. Хотел разобраться с кодировкой RC-5 (ПДУ Daewoo R-25). Хотел для начало посмотреть действительно ли количество импульсов в одном пакете будет составлять приблизительно число 448. Откудо это число!!!? так как пакет состоит в основном из 14 бит и каждый бит делится на две половинки. Одна из них "пустая" а другая заполнена 32 импульсами частотой 32000 гц. То выходит 14*32=448 импульсов. Так вот, внизу написанный код для подсчёта всех импульсов в этих 14 битах с выводом на специальный светодиодный регистр 16 битный. Так вот, при такой конфигурации "MCUCR |=(0<<ISC01)|(1<<ISC00);" количество импульсов не доходит и до 50, при этом пишу if(f>50). А вот при таком написании "MCUCR |=(0<<ISC01)|(0<<ISC00);" то значение переменной f зашкаливает 1500 импульсов, при этом пишу if(f>1500). Ну последнее понятно, при пустом полубите , за время отсутствия импульсов, обработчик прерывание видит уровень сигнала равной 0 и увеличивает f на очень высокой скорости. А вот при первой настройке INT0, скорости вычисления импульсов такими быстрыми не получаются. Повторного нажатия на пульте одной и тойже кнопки не происходит, успеваю быстро нажать и отпустить. Так что пакет с кодом, бывает практически всегда 1 раз. Вот спрашиваю у знатоков, в чём дело, почему так происходит. Готовые примеры не хочу затрагивать, так как мне самому надо написать декодер. Ну и понять всё нужно самому. Спасибо!

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

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>

unsigned int b;
unsigned char c=1;
unsigned char d;
unsigned char e; 
volatile unsigned int f;
volatile unsigned int r;



void Drive()//регистор счётчик числа "b"
{
b=f;
PORTD |= _BV(PD1);
for (d=0;d<32;d++)
	{
	PORTD &=~_BV(PD5);
	e=b&c;
	if (e==1)
	PORTD |= _BV(PD0);
	if (e==0)
	PORTD &=~_BV(PD0);
	PORTD |= _BV(PD5);
	PORTD &=~_BV(PD3);
	b=b>>1;
	}
PORTD |= _BV(PD3);//rck
while(1)
	{
	;
	}
}

ISR( INT0_vect )//обработчик прерывания по INT0
{
f++;
}


int main()
{

ADCSRA|=(1<<ADEN); 
ADCSRA|=(1<<ADSC); 
ADCSRA|=(1<<ADFR);
ADCSRA|=(0<<ADIF); 
ADCSRA|=(0<<ADIE); 

ADCSRA|=(1<<ADPS2);
ADCSRA|=(0<<ADPS1);
ADCSRA|=(1<<ADPS0);

ADMUX|=(0<<REFS1); 
ADMUX|=(1<<REFS0);
ADMUX|=(1<<ADLAR); 

ADMUX|=_BV(MUX1); 
ADMUX|=_BV(MUX2); 
ADMUX &=~_BV(MUX0);
_delay_ms(2);

MCUCR |=(0<<ISC01)|(1<<ISC00);
GICR |= (1<<INT0);

_delay_ms(2);

DDRC=0b11111101;
DDRD=0b11111011;
DDRB=0b11000001;
sei();

while(1)
	{
	if(f>444)
		{
		cli();
		Drive();
		}
	}
}

Re: кодировка RC-5 и INT0 в Atmega8

Добавлено: Пн июл 22, 2013 19:29:04
Леонид Иванович
Вообще-то интегральные фотоприемники убирают частоту заполнения 36 кГц, на выходе лишь огибающая.

Re: кодировка RC-5 и INT0 в Atmega8

Добавлено: Пн июл 22, 2013 19:36:15
king-live
Можно по подробнее по поводу огибающей! Я что то упустил наверное, или небыло информации по этой огибающей. Спасибо!

Re: кодировка RC-5 и INT0 в Atmega8

Добавлено: Пн июл 22, 2013 19:49:00
VT1
king-live писал(а):Можно по подробнее по поводу огибающей!
Почитать про TSOP17xx
http://radiokot.ru/articles/14/
Например TSOP1736, значит частота заполнения 36 кгц, но на её выходе будут только чистые импульсы команды без этого заполнения.
Эти импульсы заполнения нужны только для обеспечения помехоустойчивости оптического канала.

Re: кодировка RC-5 и INT0 в Atmega8

Добавлено: Пн июл 22, 2013 19:51:36
Леонид Иванович
Описание протокола есть здесь: http://digit-el.com/files/open/rc5/rc5.html
Пример декодера на Си для AVR тоже мог бы привести, но Вы сказали, что готовых примеров не хотите.

Re: кодировка RC-5 и INT0 в Atmega8

Добавлено: Пн июл 22, 2013 20:15:47
king-live
Что странно к сожалению в этих темах как раз и не написанно было, что приёмник заполняет эти импульсы в 32кгц. И вот теперь другой вопрос, как узнать по какому протоколу работает мой пульт Daewoo R-25. Ведь есть ещё и другие протоколы кодировок Sony, NEC? А то что количество импульсов не доходило и до 50, теперь мне понятно. В среднем с учётом помех их могло быть около 14-15. Это и есть количество бит в пакете. <<при настройке MCUCR |=(0<<ISC01)|(1<<ISC00);>> Я иду в правильном направлении в понимании работы фотоприёмника? Спасибо!

Re: кодировка RC-5 и INT0 в Atmega8

Добавлено: Вт июл 23, 2013 05:07:09
king-live
В среднем с учётом помех их могло быть около 14-15.
Я извиняюсь не 14-15 а в среднем 30. Так как 1 импульс состоит из 2 изменений (1 подъём и 1 спад). Так как битов 14, то спадов 14 + подъёмов 14=28+(возможные помехи)=30-32. Это при настройке <<MCUCR |=(0<<ISC01)|(1<<ISC00);>>Вроде так!