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

Обсуждаем контроллеры компании Atmel.
Ответить
Прорезались зубы
Сообщения: 238
Зарегистрирован: Сб янв 29, 2011 20:26:48

Сообщение 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();
		}
	}
}
Реклама
Друг Кота
Аватара пользователя
Сообщения: 4779
Зарегистрирован: Сб апр 02, 2011 12:40:46
Откуда: Минск

Сообщение Леонид Иванович »

Вообще-то интегральные фотоприемники убирают частоту заполнения 36 кГц, на выходе лишь огибающая.
Контактная информация:
Реклама
Прорезались зубы
Сообщения: 238
Зарегистрирован: Сб янв 29, 2011 20:26:48

Сообщение king-live »

Можно по подробнее по поводу огибающей! Я что то упустил наверное, или небыло информации по этой огибающей. Спасибо!
VT1
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2458
Зарегистрирован: Вс июл 11, 2010 14:39:04
Откуда: Россия.

Сообщение VT1 »

king-live писал(а):Можно по подробнее по поводу огибающей!
Почитать про TSOP17xx
http://radiokot.ru/articles/14/
Например TSOP1736, значит частота заполнения 36 кгц, но на её выходе будут только чистые импульсы команды без этого заполнения.
Эти импульсы заполнения нужны только для обеспечения помехоустойчивости оптического канала.
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 4779
Зарегистрирован: Сб апр 02, 2011 12:40:46
Откуда: Минск

Сообщение Леонид Иванович »

Описание протокола есть здесь: http://digit-el.com/files/open/rc5/rc5.html
Пример декодера на Си для AVR тоже мог бы привести, но Вы сказали, что готовых примеров не хотите.
Контактная информация:
Реклама
Прорезались зубы
Сообщения: 238
Зарегистрирован: Сб янв 29, 2011 20:26:48

Сообщение king-live »

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

Сообщение king-live »

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

Вернуться в «AVR»