Приём ИК сигнала на PIC16F628A

Поклонники продукции Microchip Technology Inc тусуются тут.
Ответить
Аватара пользователя
adrin02
Открыл глаза
Сообщения: 55
Зарегистрирован: Вс мар 04, 2012 01:41:48
Откуда: Двинск
Контактная информация:

Приём ИК сигнала на PIC16F628A

Сообщение adrin02 »

Как правильно принимать сигнал по протоколу 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;}


Может кто подскажет в чём проблема,
Ответить

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