Страница 1 из 1
Atmega8+TSOP
Добавлено: Ср апр 24, 2013 16:50:37
L_A_V
Пытаюсь реализовать передачу команд при помощи ИК сигнала. Сделал пульт на основе atmega8 + ик-диод + 4 кнопки. На пульте формирую сигнал с частотой 36 кГц. На графике синим цветом. Потом сделал приемник на основе atmega8 + TSOP31236. Как меняется выход TSOP изображено на графике желтым цветом. Посылаемая команда имеет следующую структуру: 30 импульсов начало команды, 15 импульсов пауза, 20 импульсов единица и 10 импульсов ноль.
Что я делаю в приемнике. Настраиваю таймер на 36кГц. Включаю прерывание таймера по совпадению(настройки таймера такие же как на пульте). Включаю прерывание на INT0 при изменении уровня. Когда уровень на INT0 падает запускаю таймер и увеличиваю переменную с количеством импульсов, когда срабатывает прерывание таймера. Когда уровень на INT0 снова увеличивается, останавливаю таймер и смотрю сколько насчиталось импульсов. Дальше определяю что пришло(стартовый пакет, ноль или единица)
Собственно в чем проблема. На приемнике не получается точно посчитать кол-во импульсов в пакете. Оно постоянно получается с какой-то погрешностью. При передаче 30 импульсов с пульта на приемнике приходится писать +-10 импульсов. С чем это моет быть связано? Или может у меня не правильный алгоритм?
Re: Atmega8+TSOP
Добавлено: Ср апр 24, 2013 22:26:16
codenamehawk
Важна частота процессора, а так вроде должно работать.
Делал похожее
https://sites.google.com/site/mariankmh/home/ir-to-com
Re: Atmega8+TSOP
Добавлено: Ср апр 24, 2013 23:15:09
L_A_V
процессор работает от внешнего кварца на 8 МГц
Re: Atmega8+TSOP
Добавлено: Чт апр 25, 2013 15:25:43
L_A_V
Нашел в чем проблема.
Значит как формировал сигнал на пульте. Необходимо было сделать сигнал с частотой 36кГц, т.е. время одного такта 27,77 мкс. Для скважности 50% необходимо менять уровень сигнала каждые 13,89 мкс. На таймере кратность ставлю 1. Т.к. частота микроконтроллера равна 8МГц, то время одного такта равно 0,125 мкс. Следовательно включаю прерывание на Таймере1 на совпадение с 111(13,89 / 0,125) и при совпадении меняю уровень сигнала на противоположный и тут же обнуляю счетчик таймера. И так пока не выполнится определенное кол-во тактов. После того как все отправлю, выключаю таймер до следующей команды.
Что делал на приемнике. Также настроил таймер(кратность = 1, прерывание по совпадению на 111, при совпадении обнуляю счетчик). Включаю внешнее прерывание на INT0 при смене любого уровня. Когда на INT0 появляется 0 я запускаю таймер и считаю количество переполнений. При появлении 1 я останавливаю таймер.
И вот тут получаю проблему. По идее количество переполнений таймера на приемнике должно совпадать с количеством переполнений таймера при формировании сигнала. Ну допустим +- какая-то погрешность. Экспериментальным путем было установлено, что на пульте чтобы добиться 13,89 мкс нужно делать совпадение с 40. А на приемнике с 90.
Может кто-нибудь подсказать почему так происходит? Или может мой алгоритм ошибочен...
Re: Atmega8+TSOP
Добавлено: Чт апр 25, 2013 16:19:38
codenamehawk
L_A_V писал(а):Нашел в чем проблема.
И в чем проблема?
L_A_V писал(а):
Для скважности 50%
Скважность пультов устанавливают примерно 30%, правда 50% тоже будет работать.
L_A_V писал(а):
Экспериментальным путем было установлено, что на пульте чтобы добиться 13,89 мкс нужно делать совпадение с 40.
Вот тут не понятно, установлено в при опытах в железе или в протеусе?
Если должно быть совпадение с 111, то не может быть совпадение с 40.
Выложите ваши файлы.(для протеуса не забудьте)
Re: Atmega8+TSOP
Добавлено: Чт апр 25, 2013 16:27:39
L_A_V
Сначала нашел несовпадение в протеусе, потом проверил на железе и подтвердилось.
Файлы приложил. Схема в протеусе в проекте Pult. Код рабочий поэтому не особо красивый:)
Проблема - по разному считало кол-во тактов.
Re: Atmega8+TSOP
Добавлено: Чт апр 25, 2013 16:29:40
shads
Хотя по описанию, вроде все должно работать, но, все равно подход у вас сложноватый чуть чуть.....
В передатчике, формировать сигнал 36000 Гц проще не с помощью изменения состояния вывода в прерывании, а соответствующей настройкой работы таймера с аппаратным управлением выводом.
Код: Выделить всё
//включение частоты 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: Atmega8+TSOP
Добавлено: Чт апр 25, 2013 16:31:19
L_A_V
Думал об такой реализации, но хотел эти выводы оставить под ШИМ
Re: Atmega8+TSOP
Добавлено: Чт апр 25, 2013 16:43:53
codenamehawk
Логическая ошибка в ISR(TIMER1_COMPB_vect)
сброс таймера должен стоять первым, так как счетчик продолжает считать, пока выполняется ваша программа, искажая длину импульса.
Еще необходимо учитывать время необходимое для входа в прерывание.
А это примерно 37 тактов процессора + выполнения команды сброса TCNT1 = 0;
А если в это время будут другие прерывания, то время еще затянется.
Так что разумней всего делать как советовал shads (в моей программе
https://sites.google.com/site/mariankmh/home/ir-pult тоже применен такой код)
Инициализация может выглядеть примерно так
Для проверки длины импульсов, прогу сокращают до минимума.
Примерно так
Re: Atmega8+TSOP
Добавлено: Чт апр 25, 2013 22:40:19
L_A_V
Спасибо за советы. Я конечно догадывался, что на формирование сигнала будут влиять доп вычисления, но не думал что на столько... Попробую реализовать на ШИМе...
Re: Atmega8+TSOP
Добавлено: Чт апр 25, 2013 23:34:12
shads
Re: Atmega8+TSOP
Добавлено: Чт май 02, 2013 09:38:27
L_A_V
Наконец-то доделал, чтобы работало как хочу. Еще раз спасибо тем кто откликнулся. Выложу тут исходники. Может кому пригодиться. В папке Pult находится схема из Proteusa, на которой тестировал.