Как правильно принимать сигнал по протоколу NEC?
Тут есть немного инфы,
http://radiokot.ru/articles/14/ http://radiokot.ru/articles/14/nectrain.gifПытаюсь разобраться, и получить пульс 9ms, но ничего не выходит.
Код:
#include "pic.h"
__CONFIG(0xFF32);
#define _XTAL_FREQ 4000000 // Частота 4 МГц
static volatile near unsigned int TMR1 @ 0x00E; //Это объявлен таймер как 2-х байтная переменная. Чтобы не побайтно обращаться, а сразу как к 2-х байтной.
unsigned int x,y;
char IntUp=1;
void interrupt isr(void)
{
if(TMR1IF) // Если сработал таймер 1
{
TMR1IF=0; // Сброс флага прерываний от таймера
TMR1 = 0; // Cброс счётчика таймера
RB7 = ~RB7; //Для виду
}
if (INTF)
{
INTF=0; // Сброс флага прерываний от на ножки RBO/INT
TMR1 = 0; // Cброс счётчика таймера
RB1 = ~RB1; //Для виду
if(INTEDG) //
{
IntUp = 1; // Signal UP
INTEDG=0;
}
else if(!INTEDG)
{
y = TMR1;
IntUp = 0; // Signal DOWN
INTEDG=1; //Меняем на нарастающий.
}
if(IntUp==0) //Signal DOWN
{
if(y<53)
while(1){RB2=1;}
else if(y==53)
while(1){RB3=1;}
else if(y>53)
while(1){RB4=1;}
}
}
}
/*****************************************************************/
void main(void)
{
PEIE=1; // Разрешение прерываний от периферийных модулей.
GIE=1; // Global interrupt enable // разрешить глобальную обработку прерываний
TRISB=0b00000001;
PORTB=0; // На выходы ноль
RBPU = 0; // Подтягивающие R (0-вкл, 1-выкл) Подтянуты к +
INTEDG=1; // Внешнее прерывание на ножке RBO/INT осуществляется по фронту: либо по нарастающему (если в регистре OPTION бит INTEDG=1), либо по спадающему (если INTEDG=0).
TMR1ON=1; // Включаем таймер
TMR1IE=1; // Разрешение прерывания от таймера
TMR1IF=0; // Сброс флага прерываний от таймера
TMR1 = 0; //65535
T1CKPS0=0; //выбираем предделитель
T1CKPS1=0; //11 = 1:8 // 10 = 1:4 // 01 = 1:2 // 00 = 1:1
TMR1CS=0; // 0- Внутренний источник таков Fosc/4 1- Внешний
while(1)
{
}
}
Пробую вот таким способом, почемуто всегда на любом пульте, любой кнопки срабатывает
Код:
else if(y==53)
while(1){RB3=1;}
Может кто подскажет в чём проблема,