Протокол NEC ИК-приемник на Attiny88(digispark)
- Войдите на сайт для отправки комментариев
Сб, 27/11/2021 - 12:48
Добрый день форумчане! я новенький ! Такой вопрос написал программу по приему ИК сигнала ,все работает
код пульта читает , но осталась одна нерешенная проблема вывод в порт кода не соответствует принятому...
короче:
ПРИМЕР ВЫВОДА СООБЩЕНИЯ В ПОРТ----------------------------------------------------------
00000000111111111010100001010111 -принятый сигнал в бинарной системе
NEC_ADDR: | 0 | HEX: | 0 |
NEC_ADDR_inv: | 255 | HEX: | FF |
NEC_code: | 168 | HEX: | A8 |
NEC_ADDR_inv: | 87 | HEX: | 57 |
NEC_CODE_DEC: | 4294944855 -получившееся значение не соответствует принятому 4294944855=11111111111111111010100001010111
предлагаю код:
/*Скетч использует 5194 байт (76%) памяти устройства. Глобальные переменные используют 315 байт (61%) динамической памяти */ // ___________________________________________________________________ // | LOW HIGH { COMMAND }| // | Praambula Pause ADDR ADDR-inv DATA DATA-inv | // | |||||||||||||__________|_|_|_|_|__|_||_|_|__|_||_|_|__|_||_|_|__ | // | 9ms 4.5ms { 27ms } { 27ms }| // |___________________________________________________________________| // ___________________________________________________________________ // | { Logical "1" }{ Logical "0" } | // | |||||||||___________________________|||||||||_________|||||||| | | // | { 560us }{ 1690us }{ 560us }{ 560us } | // | { 2.25ms }{ 1.12ms } | // |___________________________________________________________________| //ПРИМЕР ВЫВОДА СООБЩЕНИЯ В ПОРТ---------------------------------------------------------- /* ( 00000000111111111010100001010111 ) NEC_ADDR: | 0 | HEX: | 0 | NEC_ADDR_inv: | 255 | HEX: | FF | NEC_code: | 168 | HEX: | A8 | NEC_ADDR_inv: | 87 | HEX: | 57 | NEC_CODE_DEC: | 4294944855 */ //ПОДКЛЮЧАЕМ БИБЛИОТЕКИ------------------------------------------------------------------- #include <SoftSerial.h> /* последовательной передачи данных */ #include <TinyPinChange.h> /* библиотека для прерывания */ SoftSerial mySerial(2, 3); // RX, TX //указываем пины Виртуального порта //УКАЗЫВАЕМ ПЕРЕМЕННЫЕ-------------------------------------------------------------------- int irPin = 10; //ИК-детектор, подключенный к цифровому 10 const byte BIT_PER_BLOCK = 32;//порог бит максимум int start_bit = 2200; //порог стартового бита (микросекунды) int CODE[32]={};//создаем массив и храним полученные значения с ИК датчика максимум 32 бит //УКАЗЫВАЕМ ПИНЫ, СКОРОСТЬ ВИРТ.ПОРТА----------------------------------------------------- void setup() { pinMode(irPin, INPUT);//пин к которому подключен ИК приемник mySerial.begin(4800);//скорость виртульного последовательного порта } //ОСНОВНОЙ КОД ПРОГРАММЫ------------------------------------------------------------------------------------------------------------- void loop() { int data[BIT_PER_BLOCK]; int i; //ПРИЕМ И ОБРАБОТКА СИГНАЛА С ИК ПРИЕМНИКА-------------------------------------------------------------------------------------------- while(pulseIn(irPin, HIGH) < start_bit); //подождите приема преамбулы (высокого уровня сигнала частотой 38 кГц и длительностью 9 мс) for(i = 0 ; i < BIT_PER_BLOCK ; i++) { //Начните измерять биты, мне нужны только LOW импульсы data[i] = pulseIn(irPin, LOW); } mySerial.print("( "); //передаем на печать виртуального порта for(i = 0 ; i < BIT_PER_BLOCK ; i++) { if(data[i]>=600){ //указываем что сигнал длительностью более 600мкс (560мкс) ,это "1" mySerial.print("1"); //передаем на печать виртуального порта "1" CODE[i]= 1;} //храним принятое значение в масcиве CODE else{ //указываем что сигнал длительностью менее 600мкс (560мкс) ,это "0" mySerial.print("0"); //передаем на печать виртуального порта "0" CODE[i]= 0;} //храним принятое значение в масcиве CODE } mySerial.println(" )"); //передаем на печать виртуального порта // mySerial.print(CODE[16]);mySerial.print(CODE[17]);mySerial.print(CODE[18]);mySerial.print(CODE[19]); // mySerial.print(CODE[20]);mySerial.print(CODE[21]);mySerial.print(CODE[22]);mySerial.print(CODE[23]); //СОБИРАЕМ МАССИВ ИЗ ПРИНЯТЫХ ДАННЫХ И ПЕРЕДАЕМ В ПОРТ(mySerial)------------------------------------------------------------------------ byte ADDR =0b00000000; // ADDRESS LOW if(CODE[0]==1){ADDR = ADDR | 0b10000000;} // ставим бит №1 if(CODE[1]==1){ADDR = ADDR | 0b01000000;} // ставим бит №2 if(CODE[2]==1){ADDR = ADDR | 0b00100000;} // ставим бит №3 if(CODE[3]==1){ADDR = ADDR | 0b00010000;} // ставим бит №4 if(CODE[4]==1){ADDR = ADDR | 0b00001000;} // ставим бит №5 if(CODE[5]==1){ADDR = ADDR | 0b00000100;} // ставим бит №6 if(CODE[6]==1){ADDR = ADDR | 0b00000010;} // ставим бит №7 if(CODE[7]==1){ADDR = ADDR | 0b00000001;} // ставим бит №8 mySerial.print("NEC_ADDR: | "); //передаем на печать виртуального порта mySerial.printf("%4d",ADDR); //передаем на печать виртуального порта (занимает 4-знака) mySerial.print(" | HEX: | "); //передаем на печать виртуального порта mySerial.print(ADDR,HEX); //передаем на печать виртуального порта значение ADDR в HEX mySerial.println(" |"); //передаем на печать виртуального порта byte ADDR_inv =~ADDR; // инвертируем в ADDRESS HIGH mySerial.print("NEC_ADDR_inv: | "); //передаем на печать виртуального порта mySerial.printf("%4d",ADDR_inv); //передаем на печать виртуального порта (занимает 4-знака) mySerial.print(" | HEX: | "); //передаем на печать виртуального порта mySerial.print(ADDR_inv,HEX); //передаем на печать виртуального порта значение ADDR_inv в HEX mySerial.println(" |"); //передаем на печать виртуального порта byte cod =0b00000000; // COMMAND LOW if(CODE[16]==1){cod = cod | 0b10000000;} // ставим бит №1 if(CODE[17]==1){cod = cod | 0b01000000;} // ставим бит №2 if(CODE[18]==1){cod = cod | 0b00100000;} // ставим бит №3 if(CODE[19]==1){cod = cod | 0b00010000;} // ставим бит №4 if(CODE[20]==1){cod = cod | 0b00001000;} // ставим бит №5 if(CODE[21]==1){cod = cod | 0b00000100;} // ставим бит №6 if(CODE[22]==1){cod = cod | 0b00000010;} // ставим бит №7 if(CODE[23]==1){cod = cod | 0b00000001;} // ставим бит №8 mySerial.print("NEC_code: | "); //передаем на печать виртуального порта mySerial.printf("%4d",cod); //передаем на печать виртуального порта (занимает 4-знака) mySerial.print(" | HEX: | "); //передаем на печать виртуального порта mySerial.print(cod,HEX); //передаем на печать виртуального порта значение cod в HEX mySerial.println(" |"); //передаем на печать виртуального порта byte cod_inv =~cod; // инвертируем в COMMAND HIGH mySerial.print("NEC_ADDR_inv: | "); //передаем на печать виртуального порта mySerial.printf("%4d",cod_inv); //передаем на печать виртуального порта (занимает 4-знака) mySerial.print(" | HEX: | "); //передаем на печать виртуального порта mySerial.print(cod_inv,HEX); //передаем на печать виртуального порта значение cod_inv в HEX mySerial.println(" |"); //передаем на печать виртуального порта //unsigned int result_ADDR = (ADDR << 8) | ADDR_inv; //unsigned int result_cod = (cod << 8) | cod_inv; //ПРЕОБРАЗОВЫВАЕМ МАССИВ В ЕДИНОЕ 32BIT ЗНАЧЕНИЕ char read1 = ADDR; //ADDRESS LOW char read2 = ADDR_inv; //ADDRESS HIGH char read3 = cod; //COMMAND LOW char read4 = cod_inv; //COMMAND HIGH unsigned long testint = read1<<24|read2<<16|read3<<8|read4;//собираем одно 32-битное число mySerial.print("NEC_CODE_DEC: | "); //передаем на печать виртуального порта mySerial.println(testint,DEC); //передаем на печать виртуального порта значение testint в DEC }
Заранее спасибо Всем кто захочет или поможет))
Моя почта:zhoramotors@gmail.com
Так же облегчу задачу! проблему вижу ))) как ее решить?
Вижу что просто первые 8 бит инвертировались
Да Komandir вижу не могу понять из за чего...старший байт вроде правильный
тип char в 119-122 не верен видимо
char хранит вроде как правильное значение ,проверил остаётся только неправильное побитное сложение ,блин проснулся спортивный интерес! Помогайте!
char знаковый тип
как он сдвигается влево ХЗ
меняйте на byte
char знаковый тип
как он сдвигается влево ХЗ
меняйте на byte
Применительно Ардуино: для 8-разрядных контроллеров компилятор полагает char знаковым, а для 32-разрядных - беззнаковым.
Отсюда вывод: если используется старший разряд - никогда не пытайтесь
1. Анализировать char путем сравнения с 0.
2. Анализировать char путем сравнения с 127-128.
3. Производить арифметические действия.
4. Использовать операции, подразумевающие преобразование в int.
вот такая конструкция работает!!! но правда онлайн компилятор
В названии темы фигурирует attiny, т.е. речь идет о 8-разрядном контроллере. Тогда почему переменным типа int присваиваются 32-разрядные значения?
andriano а, вот в чем секрет)) крылся ок спасибо
Исправил ошибки ,если кому нужно выкладываю код.
одно изменение добавил кнопку и рег. резистор для настройки границы 0 и 1 -так мне показалось лучше будет
кое что допилил ARDUINO --->PROCESSING ---> SEVE File JSON --->WEB Site
ПРИМЕР ВЫВОДА В ПОРТ
Вроде как и получилось выкладываю готовый вариант
фото меню
строго не судите мой первый опыт в программировании да и дизайнер из меня ...