Attiny13 и посыл NEC IR кода
- Войдите на сайт для отправки комментариев
Приветствую!
Собрал небольшую схемку на attiny13 и есть необходимость циклически отправлять определенный код кнопки пульта NEC. Библиотеку в attiny13 не впихнуть к сожалению) По крайней мере таковых не нашел.
Читал как работает протокол, пробовал определенный алгоритм, но хоть убей никак не могу получить генерацию.
Приемник собран на arduino nano 328. Обычный пульт нормально обрабатывает. С attiny мой алгоритм всегда как неизвестный пульт и всегда разное значение hex... Уже несколько дней пытаюсь менять алгоритм, никак не въеду.
Приемник на 38Кгц. Рассчитывая 1 / 38000 = 26 микросекунд - длина одного импульса.
Прошу подсказать, где я что не так понял? Что не так в коде, в чем может быть ошибка моя?
Последняя версия кода:
#define OSC_pin 0 #define NEC_BITS 32 #define NEC_HDR_MARK 9000 #define NEC_HDR_SPACE 4500 #define NEC_BIT_MARK 560 #define NEC_ONE_SPACE 1690 #define NEC_ZERO_SPACE 560 #define NEC_RPT_SPACE 2250 unsigned int periodTime = 26; unsigned int periodOnTime = 26; void setup() { pinMode(OSC_pin,OUTPUT); } void start() { for(int g=0;g<173;g++){ digitalWrite(OSC_pin, HIGH); delayMicroseconds(periodTime); digitalWrite(OSC_pin, LOW); delayMicroseconds(periodOnTime); } } void impulse1() { for(int g=0;g<10;g++){ digitalWrite(OSC_pin, HIGH); delayMicroseconds(periodTime); digitalWrite(OSC_pin, LOW); delayMicroseconds(periodOnTime); } delayMicroseconds(1690); } void impulse0() { for(int g=0;g<10;g++){ digitalWrite(OSC_pin, HIGH); delayMicroseconds(periodTime); digitalWrite(OSC_pin, LOW); delayMicroseconds(periodOnTime); } delayMicroseconds(560); } void footer() { for(int g=0;g<10;g++){ digitalWrite(OSC_pin, HIGH); delayMicroseconds(periodTime); digitalWrite(OSC_pin, LOW); delayMicroseconds(periodOnTime); } } void loop() { digitalWrite(OSC_pin, LOW); start(); delayMicroseconds(4500); impulse1(); //1 impulse0(); impulse1(); //2 impulse0(); impulse0(); impulse0(); impulse0(); impulse1(); //3 impulse0(); impulse1(); //4 impulse0(); impulse1(); //5 impulse1(); //6 impulse1(); //7 impulse1(); //8 impulse0(); impulse1(); //1 impulse1(); //2 impulse1(); //3 impulse0(); impulse0(); impulse0(); impulse0(); impulse0(); impulse0(); impulse0(); impulse0(); impulse1(); //4 impulse1(); //5 impulse1(); //6 impulse1(); //7 impulse1(); //8 footer(); //A15EE01F delay(41); delayMicroseconds(940); }
А откуда у тебя микросекунды считаются?
Использовал https://github.com/MCUdude/MicroCore
И настройки выше. Хз откуда он там считает, но что-то считает...
Есть вариант несоответствия времени в МК относительно реального времени?
Ну точность этого регулятора +-10% в идеальных условиях. Вообще такое без осциллографа отлаживать замучаешься.
на 16 мегагерцах точность микрос 4 микросекунды, на 4.8-х видимо в четыре раза хуже
на 16 мегагерцах точность микрос 4 микросекунды, на 4.8-х видимо в четыре раза хуже
Нет, это особенность реализации. 1МГц это разрешение в одну мкс, тут аж 4.8. Но поглядеть на конкретную реализацию и ее проблемы не помешало бы. А то и переписать генерацию несущей на ШИМ.
Не в курсе был этого... Это значение отклонения стабильное будет или динамическое?
Не в курсе был этого... Это значение отклонения стабильное будет или динамическое?
В пределах постоянной температуры и напряжения. Даташит надо читать, раз уж полез.
Приемник на 38Кгц. Рассчитывая 1 / 38000 = 26 микросекунд - длина одного импульса.
Круто! Пешы исчо!
ЗЫ: ...изпацтала: 26 мкс - это весь импульс и хай и лоу... каждого по 13. Все остальное выше для таких таймингов - херня. Честное пионЭрское! Хотя ослик был бы кстати.
Тоже прикинул этот момент и сделал по 13... И перерасчет всех функций под 13 (увеливив в 2 раза циклы) - результат тот же... за NEC он это не принимает...вместо 9000мс первых всегда 10800мс, что интересно...
Ё! А я привык, что 38 кГц это несущая, которая в приёмнике фильтруется. А сигнал, совсем не 38 летит. Это нет так?
Это да. Не читал. Более совершенные МК не подводили... Потому предположил, что я что-то не верно понял в протоколе...
Видимо неудачную МК я выбрал тут... Просто их много в запасе лежит, думал простой пультик на одну-две кнопки забацаю... Но упёрся тут...
Видимо реально надо OSC добавлять внешний... Хотя хз, поможет ли это.... Но уже из принципа хочется это добить...
Как образец для подражания, можно посмотреть у широко известного в узких кругах Ридико Л.И.
Как образец для подражания, можно посмотреть у широко известного в узких кругах Ридико Л.И.
осталось код для IDE адаптировать... но можно и не адаптировать, прошивки приложены, константу подстройки внутреннего генератора менять тут )))
и код для attiny13
Tiny13 имеет калибровочные байты внутреннего генератора, возможно они не были установлены китайцами или затерты при очистке чипа.
Загрузи в нее блинк, с паузой 10 сек и проверь секундомером.
+-10% - цифра с заводской калибровкой. Читайте даташит.
Благодарю всех за подсказки. Вероятно реально весь прикол в частоте...
Итоговый код который стабильно стал нормально работать. Калибровать по нормальному возможности нет, но прикинул, что увеличивая/уменьшая немного периоды, возможно выйду на рабочий вариант. А как выше писал, первый сигнал у меня вместо 9000 был по факту 10800... То решил уменьшать, пока не получу 9000. При 10мс стабильно все заработало и передает нужное мне значение.
И того 20%. И это при заводской калибровке, а если без?
У меня был случай, тоже долго не мог понять почему не работает, вместо 10 секунд, пауза была 7. А это уже 30%
Есть апнот AVR055: Using a 32 kHz crystal to calibrate the internal RC oscillator.
Есть апнот AVR055: Using a 32 kHz crystal to calibrate the internal RC oscillator.
ты жеж понимаешь в ассемлере, я поправил код чуток перевести c 12 на attiny13 можешь глянуть,смущают два момента
Нет вопросов. Только я уже позабывал всё.) Ассемблер одинаковый, у 13-й больше команд.
В коде инициализации:
Строка 16, у attiny13 в отличии от 12 есть SM0 и SM1, что указывать?
Ну а причём здесь ассемблер? Открываешь ДШ и смотришь отличия.
У 12:
SM1 SM0
0 0 - Idle
0 1 - ADC Noise Reduction
1 0 - Power Down
Ага?
Понятно, заменить на SM1 )))
Ага. Просто в 12-й два слип режима, а в 13-й три. Соответственно, на один бит больше.)
Калибровать по нормальному возможности нет...
Обычно пишется тестовая прошивка в цикле формирующая на пине импульс определённой длительности,
который как то возможно измерить. Например, если ничего нет, то на выход подключаешь светодиод, а импульс делаешь побольше, 10 сек, как тут уже советовали.
Для изменения OSCCAL подключаешь одну (лучше две) кнопки - на увеличение/уменьшение.
Изменённый OSCCAL выводишь доступным способом - Serial, EEPROM, да хоть кодом Морзе.)
Калибровать по нормальному возможности нет...
Обычно пишется тестовая прошивка в цикле формирующая на пине импульс определённой длительности,
который как то возможно измерить. Например, если ничего нет, то на выход подключаешь светодиод, а импульс делаешь побольше, 10 сек, как тут уже советовали.
Для изменения OSCCAL подключаешь одну (лучше две) кнопки - на увеличение/уменьшение.
Изменённый OSCCAL выводишь доступным способом - Serial, EEPROM, да хоть кодом Морзе.)
интересно, а калибровочные константы считываемые программатором зашитые производителем что-то значат?
Значат. +/- %, для определённого напряжения, температуры. У некоторых ещё и для определённой частоты, например 1 мгц, а для других +/- лапоть.
Понятно! А за ссылку на проект TKS! Получил истинное программистское наслаждение )))
PS Всё таки ASM это божественно ...сидишь...раскладываешь по коробочкам...тасуешь )))
Это же ж хобби. Кому что нравится. Кому поп, а кому попадья.)
Где-то книжечка валяется. Здоровый талмуд. Название "Ассемблер для Windows."
Автор объясняет почему именно Ассемблер. Типа, всё под контролем, ощущение власти.)
учился как и Билл Гейтс - у Питера Нортона, он очно, я по его книге )))
Там и "Ассемблер для Windows" легко находится. Мы ещё учились по Журдену: "Справочник программиста на ПК IBM".)
Там и "Ассемблер для Windows" легко находится. Мы ещё учились по Журдену: "Справочник программиста на ПК IBM".)
под виндовс мне было уже не интересно, я жеж железячник