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

помогите в RC5 декодере

Добавлено: Вт окт 09, 2012 22:29:38
спящий
Задумал сделать декодер,вроде программа простая,в протеусе даже чтото показывает - но на С,пошагово как то там сложно. Суть этой программы делает прерывание по INTO ,по спаду(замеряет длину импульса).Потом делает задержку(прерывание) в 1/4 периода,и дальше задержки по периоду и записывает состояние ноги PIND.2 в массив,который записывается в переменные,и передаються на экран. Кажется все просто,а вот уже месяц думаю над ней,что за косяк.Выводит много значений,и все одинаковые(00 или FE).
Снизу картинка при нажатии на одну кнопку один раз.




Спойлер#include <stdio.h>
#include <mega48.h>
#include <delay.h>
#include <string.h>
#include <io.h>


int i,dlina_impulsa_L,dlina_impulsa_H;
char cod_bit;
char code[14];
char comanda;
char adress;

void main() {
DDRD=0b11111011;
DDRB=255;
DDRC=255;

// 8 Data, 1 Stop, No Parity
// USART Receiver: Off
// USART Transmitter: On
// USART Mode: Asynchronous
UCSR0A=0x00;
UCSR0B=0x18;
UCSR0C=0x06;
UBRR0H=0x00;
UBRR0L=0x33;




//Настройка прерываний по INTO
EICRA=0x00;
EIMSK=0x01;
EIFR=0x01;



printf("davai cod\r\n");

#asm("sei")
while (1)
{

}
}


interrupt [EXT_INT0] void ext_int0_isr(void)
{ //прерывание по INTO

if(i==0)
{TCCR1B=0b00001010; //врубаем для того чтобы считать длину импульса по спаду
TCNT1H=0x00;
TCNT1L=0x00;
OCR1AH=0xff;
OCR1AL=0xff;
i=1;
}
else
{ i=0;
dlina_impulsa_L=TCNT1L;
dlina_impulsa_H=TCNT1H;
TIMSK1=(1<<1);//врубаем прерывание по CTC
EIMSK=0;
EIFR=255;
OCR1AH=dlina_impulsa_H/4; //задержка в 1/4 периода (чтобы посередине полпериода было знать 1 или 0)
OCR1AL=dlina_impulsa_L/4;
TCNT1H=0x00;
TCNT1L=0x00;

}
}




interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
if (cod_bit<14)
{
OCR1AH=dlina_impulsa_H;
OCR1AL=dlina_impulsa_L;;

TCNT1H=0x00;
TCNT1L=0x00;

code[cod_bit]=PIND.2;
cod_bit++;

}
else
{TCNT1L=0x00;
TCNT1H=0x00;
TIMSK1=(0<<1);//приостанавливаем CTC
EIMSK=(1<<0);//вырубаем прерывание INTO
EIFR=0xff; //убираем флаг по INTO
TCCR1B=0b00000000; //вырубаем прерывание по СТС

adress = (code[3] << 4)|(code[4] << 3)|(code[5] << 2)|(code[6] << 1)|code[7];
comanda = (code[8] << 5)|(code[9] << 4)|(code[10] << 3 )|(code[11] << 2)|(code[12] << 1)|code[13];

putchar(adress) ;
putchar(comanda) ;
cod_bit=0; //обнуляем счетчик
}
}

Re: помогите в RC5 декодере

Добавлено: Чт окт 11, 2012 19:15:24
спящий
на кнопки некоторые реагируют(одни значения).может быть проблемма в захвате времени?Можее подсказать код декодера,маленький и простой,а то чето у всех(инете) они длинные и несовсем понятные.