Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Ответить

ИК протокол NEC

Пт мар 22, 2013 02:06:05

Ну вот, домучил, обработку IR NEC, вот что получилось:


Пока что для одной частоты (8000000) и константы заданы жестко. Потом надо будет докумекать автоматический рассчет для разных частот.

Re: Вопросы по С/С++ (СИ)

Пт мар 22, 2013 10:45:32

    //Настройка таймера/счетчика T0
    TCCR0 = 0x05;                 //настройка тактирования T0 (0x01-clk, 0x02-clk/8, 0x03-clk/64, 0x04-clk/256, 0x05-clk/1024)    
    TIMSK |= (1<<TOIE0);        //включить прерывание по переполнению T0

У вас тут получается частота 8мгц/256/1024=30Гц? Разве не нужно чтобы было 36кГц? или я что-то не так понял

    //Настройка внешнего прерывания
    GICR  |= (1<<INT0);            //включить внешнее прерывание с вывода INT0
    MCUCR |= (1<<ISC01);         //генерация прерывания по спадающему фронту 

и вот тут происходит внешнее прерывание, а где обработчик прерывания для него? а то немного не пойму принцип подсчета длины импульса у вас. (с прерываниями у меня вообще туго, кажется, что вот наконец-то понял, но увижу чуть другой пример и опять теряюсь)


А так в общем классно, но для меня еще сложновато. И кварц в приемнике у меня 12МГц((
В какой программе вы пишите? Я начал с codevision и там по-мойму биты в байте задаются самостоятельно, т.е. нельзя вписать просто его название и что он устанавливается в 1, нужно знать его номер и там уже ставить единичку. Или я просто еще не дошел до урока где это описывается))

Вообще если в 2 словах то принцип передачи по ик таков: на ножке задаем шим несущей частоты и потом для передачи делаем так, что он то есть определенный промежуток времени, когда идет передача определенной команды команды, то его нет, когда ничего не передается?

Re: Вопросы по С/С++ (СИ)

Пт мар 22, 2013 13:11:39

Alkarax писал(а):У вас тут получается частота 8мгц/256/1024=30Гц? Разве не нужно чтобы было 36кГц? или я что-то не так понял
Дело в том, что в вашем коде реализован и прием и передача, и 36000 нужны только для передачи.....
А в моем коде реализован только прием, и речь идет о стандарте NEC (какой у вас стандарт реализован не знаю).
Хочу в своей передачу тоже реализовать, посмотрю вашу, мож быстрей получится.....

Re: Вопросы по С/С++ (СИ)

Пт мар 22, 2013 16:20:03

Alkarax писал(а):где обработчик прерывания?
Чуть ниже
Код:
//Внешнее прерывание INT0 (по спаду сигнала)
ISR (INT0_vect) 


Alkarax писал(а):кварц в приемнике у меня 12МГц((
Ды не сложно на несколько ходовых частот рассчитать..... сделаем.

Alkarax писал(а):В какой программе вы пишите? Я начал с codevision и там по-мойму биты в байте задаются самостоятельно, т.е. нельзя вписать просто его название и что он устанавливается в 1, нужно знать его номер и там уже ставить единичку. Или я просто еще не дошел до урока где это описывается))
Я пишу в AVRStudio4, советую тоже перейти на студию.....

Alkarax писал(а):Вообще если в 2 словах то принцип передачи по ик таков: на ножке задаем шим несущей частоты и потом для передачи делаем так, что он то есть определенный промежуток времени, когда идет передача определенной команды команды, то его нет, когда ничего не передается?
Именно так и попробую заварганить.....

Re: ИК протокол NEC

Пт мар 22, 2013 17:37:19

Уже мозги сломал, но все никак не получается. Настроил приемник так, чтобы когда сигнал есть горел светодиод, пытаюсь задать пульту несущую частоту, по идее когда она появится, то на приемнике светодиод засветится. Пробую сделать так, чтобы было 36кгц вроде бы правильно, но не светится, и методом тыка в codevision сгенерировал такую програмульку
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: 125,000 kHz
// Mode: Fast PWM top=0xFF
// OC2 output: Non-Inverted PWM
ASSR=0x00;
TCCR2=0x6C;
TCNT2=0x00;
OCR2=0xDE;

и о чудо, светодиод на приемнике начал постоянно светится, результат вроде бы есть, но теперь я окончательно запутался, ведь частота совсем не та, которая нужна. К стати на пульте частотак мк8МГц

Re: ИК протокол NEC

Пт мар 22, 2013 20:01:45

Скажи, пожалуйста вот этот код правельный? Он генерирует на выходе OC2 36кГц?
#include <avr/io.h>

void init_pwm (void) //программа инициализации шима

{
TCCR2|=(1<<FOC2)|(1<<CS20)|(1<<COM20)|(1<<WGM21); //тактировать с делителем 1,состояне ОС2 мняется на против-е при совпадении, вкл режим стс
TCNT2=0; //просто обнулил счетный регистр
OCR2=0b01101111; //при достижении этого значения(111) в счетном регистре будет сброс и переключение ОС2
}
int main(void)
{
DDRB|=(1<<3); //установка ОС2 на выход

init_pwm();

while(1)
{}

return 1;}


У меня почему то при его заливке светодиод на приемнике 1 раз моргает ярко, хорошо и гаснет. Если сбросить мк пульта, на приемнике опять 1 раз моргает и все.

Re: ИК протокол NEC

Пт мар 22, 2013 20:38:45

Да правильно генерит.....

Изображение


Alkarax писал(а):У меня почему то при его заливке светодиод на приемнике 1 раз моргает ярко, хорошо и гаснет. Если сбросить мк пульта, на приемнике опять 1 раз моргает и все.
Скорее всего, это нормальное явление, т.к. частота 36000 должна модулировать полезный сигнал, тогда сенсор его обрабатывает нормально, а если постоянно подать 36000 то я чет так смутно припоминаю сто сенсор так и должен себя вести.....
Вложения
pg1.jpg
(32.83 KiB) Скачиваний: 6601

Re: ИК протокол NEC

Пт мар 22, 2013 20:56:15

А как ее теперь сделать полезной, то есть вклчить на 20мкс например? Или вообще как ее включать только по требованию на определенный промежуток времени?

Re: ИК протокол NEC

Пт мар 22, 2013 21:06:19

Alkarax писал(а):А как ее теперь сделать полезной, то есть вклчить на 20мкс например? Или вообще как ее включать только по требованию на определенный промежуток времени?

Ща попробую.
Ты в чем проверяеш, в железе? какой контроллер? что вообще есть, отдельно контроллер на передатчик и отдельно на приемник?

Re: ИК протокол NEC

Пт мар 22, 2013 21:52:18

Пульт: Atmega8L-8,работает от внутреннего генератора 8МГц, ик диод повешан на PB3. PC0, P2, PC3, PC4-кнопки и на PD2-светодиод, повесил чтобы кнопки проверять, иногда бывает, что работают с глюками.

Приемник: Atmega8-16 c кварцем на 12МГц, на PD2(INT0) - TSOPxx36(вообще какой-то неизвестный аналог, но работает так же) PD0,PD1-светодиоды.

А так мне не важно на примере чего, мне главное узнать как задать именно так, чтобы по нажатию кнопки у меня "вылетел" сигнал продолжительностью такой какой я захочу, ну чтобы для каждой кнопки потом что-нибудь придумать свое(не хочу париться с разными протоколами для 4х кнопок, просто на каждую разную длительность сигнала повешу и все).

Нашел даташит на TSOP, оказалось верно, если несущая не прерывает определенное время, то она подавляется как шум.

Re: ИК протокол NEC

Пт мар 22, 2013 22:18:37

Alkarax писал(а):не хочу париться с разными протоколами для 4х кнопок, просто на каждую разную длительность сигнала повешу и все.

Нене.... ты это брось, по взрослому сделаем... да в принципе уже готово, ща только под твои моменты подкорректирую.....

Re: ИК протокол NEC

Пт мар 22, 2013 22:59:15

Ну вот лови.

Нажимаеш кнопочку а приемник светиками (на пол секунды) должен показать номер кнопки.
Единственное у меня в приемнике светики к другому порту подключены, но там и сам можеш исправить как надо.....

Передача и прием идут по полноценному протоколу NEC, так что можеш и любой пульт под это дело заюзать. Я у себя проверил, из 20 валяющихся пультов, почти все протокола NEC, пару штук какого то сониевского, и ни одного стандарта RC5.....

В принципе в передатчике я сделал две функции - вкл частоту и выкл частоту, так что можеш и свой протокол смастерить, просто паузы выдерживаеш между вызовами этих функций и все.... Например "включить_частоту", "пауза_100_мс", "выключить_частоту" ну и т.д.

Изображение
Вложения
IR_NEC_Test.7z
(18.51 KiB) Скачиваний: 818
sh1.jpg
(79.62 KiB) Скачиваний: 6950

Re: ИК протокол NEC

Пт мар 22, 2013 23:38:53

Включил так как я писал выше, задержка, TCCR2 = 0 - выключил, все, послал сигнал длины какой хотел, :shock: неужели все так просто, блин я чего только не передумал уже, а оно вот под носом было.
Ну теперь нужно разбираться с приемом, там думаю посложней. Большое спасибо!

Re: ИК протокол NEC

Пт мар 22, 2013 23:43:48

Ну вот например как получить частоту 36 КГц, модулированную частотой 1 КГц.

Код:
//файлы
#define F_CPU 8000000
#include <util/delay.h>
#include <avr/io.h>
#include <avr/interrupt.h>


//настройка портов
#define IR_PORT     PORTB    
#define IR_DDR         DDRB
#define IR_HF_Line     (1<<3)


//объявления функций
void FreqOn  (void);
void FreqOff (void);


//основная программа
int main (void)
{
    IR_DDR |= (IR_HF_Line);                    

    while 
(1){

        FreqOn ();                        //включить генерацию
        _delay_us (500);                //ждем 0,5мс
        FreqOff ();                        //выключить генерацию
        _delay_us (500);                //ждем 0,5мс

    }
}


//включение частоты 36000 Hz
void FreqOn (void) 
{
    TCCR2 = (1<<FOC2)                    //принудительное изменение состояния вывода при совпадении
    |(1<<CS20)|(0<<CS21)|(0<<CS22)        //прямое тактирование от генератора
    |(1<<COM20)|(0<<COM21)                //состояние вывода меняется на противоположное
    |(0<<WGM20)|(1<<WGM21);             //режим CTC (сброс при совпадении)

    TCNT2 = 0;                             //просто обнулил счетный регистр
    OCR2 = 0b01101111;                     //при достижении этого значения(111) в счетном регистре будет сброс и переключение ОС2
}


//выключение частоты 36000 Hz
void FreqOff (void) 
{
    TCCR2 = 0;                            //выключить генератор 36000 Hz
    IR_PORT &= ~IR_HF_Line;                //высокочастотный вывод сбросить
}
 

Re: ИК протокол NEC

Пт мар 22, 2013 23:46:13

Все, с передачей понятно стало, прям по полочкам разложилось все сразу.
Только не пойму
IR_PORT &= ~IR_Line; //сбросить прямой вывод
IR_PORT |= IR_Line; //установить прямой вывод
это что и зачем вообще?

Re: ИК протокол NEC

Пт мар 22, 2013 23:51:46

Alkarax писал(а):Все, с передачей понятно стало, прям по полочкам разложилось все сразу.
Только не пойму
IR_PORT &= ~IR_Line; //сбросить прямой вывод
IR_PORT |= IR_Line; //установить прямой вывод
это что и зачем вообще?


Это вывод имитирующий сигнал с TSOP, например его можно подать на вход приемника в протеусе и настраивать работу совместно передатчика и приемника. (короче сигнал без наполнения 36КГц)

Если с протеусом не балуешся, можеш выбросить все что с этим связано

Re: ИК протокол NEC

Сб мар 23, 2013 00:00:29

Ясно, еще раз спасибо. Прям я поражен неделю хожу вокруг да около с этим пультом, а подумать, что все так просто не мог, сидел про прерывания про шим про счетчики читал кучу всего, оказывается несущую я уже давно понял как сделать, но незная что она не принимается постоянно, а только в самом начале 1 раз моргает, я думал что не получилось у меня.

Теперь про прием: :)) (достал уже навеное) У вас при первом же импульсе идет внешнее прерывание по INT0, а вот сколько оно длилось, то есть те самые тики вы как считаете? Другой таймер запускается внутри прерывания? Или он вообще всегда работает а внутри прерывания передает значение между прерываниями, т.е. между первым "импульсом старта" и последующими, а сколько длится само прерывание не важно?

Re: ИК протокол NEC

Сб мар 23, 2013 00:18:11

Alkarax писал(а):Теперь про прием: :))

Тут действительно все сложнее.....

Словами сразу сложновато описать, почитай про протокол NEC, посмотри на мою библиотечку декодирования, там достаточно хорошо все закомментировано, и постепенно въедеш, шо называется.....

Изображение
Вложения
строение команд ИК пульта.gif
(61.98 KiB) Скачиваний: 7078
Последний раз редактировалось shads Сб мар 23, 2013 00:40:04, всего редактировалось 1 раз.

Re: ИК протокол NEC

Сб мар 23, 2013 00:22:03

Это конечно понятно, что ничего так сразу не понять, поэтому я и задал вопрос-основу. Как считать тики? Внутри внешнего прерывания? Между прерываниями? Или еще как-нибудь?

Re: ИК протокол NEC

Сб мар 23, 2013 00:38:29

Alkarax писал(а):Это конечно понятно, что ничего так сразу не понять, поэтому я и задал вопрос-основу. Как считать тики? Внутри внешнего прерывания? Между прерываниями? Или еще как-нибудь?

Один таймер всегда включен. Предделитель таймера выбран так, чтобы при самом длинном импульсе (стартовый импульс = 13,5мс) он не переполнялся.
Переполнение таймера (отдельное прерывание) означает, что полезного сигнала нет и происходит инициализация всех переменных.

Когда приходят импульсы посылки, то по каждому падающему фронту происходит прерывание (меряем длину периода импульсов), в прерывании проверяется счетчик (и тут же сбразывается на 0 чтобы потом мерять следующий имп), если счетчик в разумных пределах, то происходит дальнейшая обработка, если вне разумных пределов - инициализация.

Если счетчик насчитал около 13,5 мс (тики рассчитываются) это означает что сейчас должен пойти пакет данных.
Во время приема пакета данных смотрим длину поступающих импульсов и относительно некоего порога определяем что это 1 или 0 и записываем в буфер.
После приема 32-х бит данных, (с учетом что все временные параметры импульсов были корректны) проверяем корректность посылки, 1-й байт это инвертированный 0-й, а 3-й байт это инвертированный 2-й (речь сейчас о протоколе NEC), если все верно, выставляем флаг наличия данных, и ждем пока основная программа их заберет.

Как то так.....
Ответить