кодировка RC-5 и INT0 в Atmega8
Добавлено: Пн июл 22, 2013 18:55:10
Доброго времени суток. Хотел разобраться с кодировкой 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();
}
}
}