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