Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Приёмник и передатчик на ИК. Проблемы с передачей и приёмом.
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Страницы: 1, 2
Папа Карло
Всем привет.

Собрал контроллер и передатчик ИК и написал программы.

Идея такая, чтоб через самосборный джойстик передавать команды на контроллер.

Принцип работы ИК передатчика такой:

1) нажимаем кнопку
2) на контроллер приёмника пускается импульс определённой длительности

Вот код который генерирует импульсы по прерыванию:
Код
// Timer 0 output compare A interrupt service routine
interrupt [TIM0_COMPA] void timer0_compa_isr(void)
{
if(empty) PORTB.0++;//генерация несущей 30кГц
        else PORTB.0 = 0;

timen1++;
timen2++;


//Вычисление длинны импульса
if(pulse)
        {
        empty = 1;
        pulse--;
        }
if(!pulse) { empty = 0;}
}


Пакетный режим пока не выходит организовать, т.к. что то сбоит.
Удалось только подавать пакет вида /старт бит/бит данных/стоп бит/.
МК передатчика генерирует прерывание с частотой 60кГц.
И если нужно передать импульс, то на выход поступает сигнал.

Например лог 0 означает, подать импульс длительностью 20 прерываний.
Лог 1, импульс длительностью 90 прерываний.
Пауза между импульсами 100 прерываний.

Если не передавать пакеты, то приёмник довольно хорошо принимает импульсы и загорается нужный светодиод, но таким макаром мне удалось закодировать только 3 команды.

Если передавать пакетом всё накрывается sad.gif

У приёмника похожая логика.
Ножка сигнальная TSOP1730 подключена к выводу МК и генерирует прерывание.
Код
// Pin change 0-7 interrupt service routine
interrupt [PCINT0] void pin_change_isr0(void)
{
if(PINB.1 == 0)
        {empty = 1;}
else
        {empty = 0;}
}


А прерывание по таймеру происходит с частотой 60кГц и меряет длительность импульса:
Код
// Timer 2 output compare interrupt service routine
interrupt [TIM2_COMPA] void timer2_compa_isr(void)
{
timen++;
timeoff++;
timecomand++;

if(empty) timecount++;//отчёт длинны импульсов

if(timecount && !empty)
       {
       if(timecount > 7 && timecount < 40) pulse = 1;//лог 0
       if(timecount > 50 && timecount < 100) pulse = 2;//лог 1
//       if(timecount > 120 && timecount < 230) pulse = 3;//доп. команда
//       if(timecount > 250 && timecount < 550) pulse = 4;//доп. команда
       timecount = 0;
       }
}


А в цикле функции main уже идёт обработка данных, как у приёмника так и у передатчика.

Ниже подшиваю фотки платы, схемы и исходников на СИ в CodeVisionAVR с комментариями.

Очень хотелось бы понять, где закралась ошибочка ?

----------------------------------------------

Есть ещё интересный глюк, если передатчик включить и положить рядом с приёмником, то приёмник ловит иногда команды, но если передатчик выключить, то приёмник ничего не ловит.
Dog Pawlowa
Цитата(Папа Карло @ Feb 16 2008, 16:16) *
Есть ещё интересный глюк, если передатчик включить и положить рядом с приёмником, то приёмник ловит иногда команды, но если передатчик выключить, то приёмник ничего не ловит.

А должно быть наоборот? smile.gif

Почему бы не использовать в качестве передатчика готовый пульт от телевизора ?

Что касается ошибок, то они могут быть и в той части текста программы, которую вы не привели.
Например, если переменные pulse и empty не определены, как volatile, запросто могут быть проблемы.
Папа Карло
Цитата(Dog Pawlowa @ Feb 16 2008, 16:33) *


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

2) Идея хорошая, но я хотел сделать джойстик полноценный, а это пробный вариант для тестов.

3) volatile спасибо учту.

Остальной код я решил положить в архив т.к. там листинг не малый.

----------------------------

МК у передатчика attiny13V на 4.8 МГц
МК приёмника atmega48 на 4МГц
Serg_Mitin
Приветствую ПАПУ...
Я бы начал искать с передатчика

питане 3В
на диоде падает 1,5-2В, на транзисторе 0,7 В кроме всего еще резистор 100ом...

Выход МК передатчика перевести в режим ШИМ на 30 КГц
и убедиться осциллографом в наличии крутых фронтов

На приемник на базе TSOP повесить шунтирующую емкость по питанию, и в даташите наверняка можно найти типовое подключение и рекомендации

потом можно задаваться кодовыми посылками
длительность импульса задавать по количеству периодов 30Кгц
наверняка - это число переполнений..

Успехов
Папа Карло
1) Шунтирующую емкость по питанию уже повесил на TSOP.
2) По поводу питания можно по подробнее, что это означает ?
3) Осциллографа увы нету.
4) Мне что то в голову не пришло как ШИМ настроить на 30кГц. По формуле смотрел в ДШ, если поставить делитель 1 на таймер, то переполнения будут с частотой 9кГц примерно у Т0. Или можно как то ещё его настроить ?
Serg_Mitin
Без осциллографа туго....
питание 3В я хотел сказать про драйвер диода, скорее всего он коряво работает. и вмесо прямоугольника стгнал в виде пилы ... а приемнику нужен четкий сигнал на 30кГц

диод можно попробовать повесить на контроллер я думаю удасться выдавить 15- 20ма резистор 30-100 ом желательно поставить. Можно запаралелить два вывода для увеличения тока

Я не знаю есть у тини возможность задать режим ШИМ и какие я их редко пользовал...
но если совсем просто подойти если там только таймер 0 то это тоскливо. лучше уйти на mega8 я думаю по цене и размерам не большая разница


это для пробы
пока 1{ установим бит и сбросим бит с задержкой}
а на приемнике посмотреть - должна быть 1 пока работает передатчик....

На сегодня все...
Удачи!
Папа Карло
Я уже бьюсь неделю с этой проблемой и много чего успел натестить.
Драйвер диода вы имели ввиду npn транзистор КТ3102АМ ?
Дело в том, что МК attiny13V маловольтная и ток почти не выдаёт на ноги.
Да на ней только таймер 0, но сделать можно много на ней, только надо знать как 07.gif
Вот на atmega48 я спокойно вешал диоды.
Режим ШИМ там есть, но как настроить 30кГц я не знаю.
Может кто подскажет ?

На самом деле приёмник выдаёт 1-ку и при поступлении сигнала скидывает на ноль, если сигнал долго поступает от передатчика, то TSOP опять ставит сам 1 лог.

Причём мне удалось уже ловить на приёмники сигналы разной длительности и код который я дал, как раз и работает так.
Он довольно чётко распознаёт 3 сигнала, но передать пакет сигналов не выходит.

Ктому же у меня есть подозрения, что при передаче питание батарейное проседает и частота у МК начинает гулять.
Я подумывал о смене резистора 100 Ом на 500 Ом.
Сам диод ИК 30МВт. То есть ток 10мА, что означает нужен резистор на 300 Ом.

Если я где ошибся поправьте плиз.
Папа Карло
Потестил с пультом от телека контроллер.
Тестировал только приём импульса любого.
Приём отличный со всех углов.
С передатчика же принимает под меньшим углом и вдвое меньшей дальности.

Выходит у меня передатчик не настроен на частоту 30кГц или частота меняется при подаче импульсов.

Заменил резистор на ИК диоде на 1 кОм, качество приёма не изменилось совсем.

Подскажите пожалуйста как лучше настроить и подавать импульсы 30кГц на attiny13V ?


Подключил ИК диод сразу к ноге МК и приём сразу стал лучше раза в 1.5.

И с больших углов принимает и дальше ловить стал.
Осталось как, то настроить МК точно на 30кГц, но боюсь это сделать не выйдет без осциллографа на attiny13.

Наверно мне надо было взять МК с кварцем, тогда можно было бы точно настроить МК.
Alex_Pol
Цитата(Папа Карло @ Feb 17 2008, 21:22) *
Заменил резистор на ИК диоде на 1 кОм, качество приёма не изменилось совсем...
Подскажите пожалуйста как лучше настроить и подавать импульсы 30кГц на attiny13V ?
Подключил ИК диод сразу к ноге МК и приём сразу стал лучше раза в 1.5...
Наверно мне надо было взять МК с кварцем, тогда можно было бы точно настроить МК.
Вы R1 увеличили до 1к? И нечего не изменилось? Подключили светодиод на прямую к 5-й ноге и приём улучшился? Если так, у вас ключ не работает. Я так думаю. И не в частоте дело. Транзистор замените, что ли. Без осцила тяжко. З.Ы. Может, цифровой фотик есть? На ЖК-матрице ИК-светодиод отлично видно. З.З.Ы. Дело к ночи, соображаю туго, но скажите, на вашем ИК диоде прямое падение напряжения сколько? Может, он при питании 3В вообще не открывается?
З.З.З.Ы. Если правильно ошибаюсь, ток через диод равен I=(Uпит-Uпр)/R
Папа Карло
Так и делал, вначале сменил резистор со 100 Ом на 1 000 Ом. Потом ИК диод сразу подключил к ноге МК без резистора и транзистора.

И что интересно, когда я подключил диод прямо на ногу, то при изменении несущей частоты в два раза приёмник переставал принимать сигнал, а через транзистор с резистором, приёмник принимал сигнал даже если несущую изменить как угодно crying.gif

Вот данные на ИК диод:

Мощность излучения P,мВт: 30
Прямое напряжение,В: 1.2
при токе Iпр.,мА: 20
Длина волны,нм: 940
Ширина спектра излучения,нм: 50
Видимый телесный угол,град: 30
Максимальное время нарастания импульса,нс: -
Максимальное время спада импульса,нс: -
Максимальное обратное напряжение,В: 5
Максимальный прямой ток,мА: 50
Максимальный импульсный прямой ток,мА: 1200
Способ монтажа: в отверстие
Рабочая температура,С: -40...85
Производитель: Kingbright Electronic Co. Ltd.
Alex_Pol
Цитата(Папа Карло @ Feb 18 2008, 09:34) *
Так и делал, вначале сменил резистор со 100...Что интересно, когда я подключил диод прямо на ногу, то при изменении несущей частоты в два раза приёмник переставал принимать сигнал, а через транзистор с резистором, приёмник принимал сигнал даже если несущую изменить как угодно crying.gif

Ключ у вас не работает. Вам Serg_Mitin уже говорил: на светодиоде падает 1,2 вольта, на насыщенном транзисторе - где то 0,5 вольт. Остаётся 1,3 вольта. Для получения искомых 20 мА нужен резистор 1,3/0,02=65 Ом. Резистор R1 должен быть где - то 51 Ом. А порт может выдать миллиампер 30, в даташите посмотрите. Отпалите вы его нахрен. Или порт, или светодиод. З.Ы. Кондюк по питанию поставьте. Поближе к ключу. Микрофарад 40. Если вы меняете несущую, а ваш приёмник продолжает принимать сигнал, эт он не сигнал принимает, а какую то помеху.
2 модератор. Может, тему в раздел для начинающих?
Блин, только заметил. Диод Д2 чем занимается? Ещё 0,6 Вольта отжирает?
bbill
В передатчике уберите диод по питанию, на микрохему поступает не более 2,3В или поставте хотя бы диод шоттки. Из даташита: ATtiny13V: 0 - 4 MHz @ 1.8 - 5.5V, 0 - 10 MHz @ 2.7 - 5.5V.

Используйте таймер в режиме(см.даташит) Clear Timer on Compare Match (CTC) Mode и формула расчета:
fOCnx= (fclk_I/O)/2⋅N⋅(1 + OCRnx).
The N variable represents the prescale factor (1, 8, 64, 256, or 1024).

Резистор в цепи диода должен быть 5-10Ом, транзистор на импульсный ток до 1А, например SS8050.
Да, и проверьте мультиметром(лампочкой) отдают ли ток батареи.
Успехов.
Папа Карло
Цитата(Alex_Pol @ Feb 18 2008, 14:27) *
Ещё 0,6 Вольта отжирает?


Он для защиты от не правильного подключения, но уже можно и убрать его 05.gif
Кондёр уже поставил 470мкФ на микруху, а ключ рядом 1 см стоит.
Принимает точно сигнал с передатчика, похоже хитрый сигнал не фильтрует TSOP
Резистор я поставил такой большой на ИК диод из-за того, что питание при включённом светодиоде сильно падало(на схеме его уже нет).
Из чего я пришёл к выводу, что МК может не стабильно работать из-за питания.
Но выходит, что МК работал нестабильно из-за того, что частота его была 4.8МГц, а по паспорту он только до 4МГц держит.

Думаю мне будет проще убрать диод Д2 и МК опустить до 2.4МГц.

Померил мультиметром на ИК диоде падает 1.3 вольта

Цитата(bbill @ Feb 18 2008, 14:35) *
Используйте таймер в режиме(см.даташит) Clear Timer on Compare Match (CTC) Mode и формула расчета:
fOCnx= (fclk_I/O)/2⋅N⋅(1 + OCRnx).
The N variable represents the prescale factor (1, 8, 64, 256, or 1024).


Вот код которым я так и считал:
Код
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 4800,000 kHz
// Mode: CTC top=OCR0A
// OC0A output: Disconnected
// OC0B output: Disconnected
TCCR0A=0x02;
TCCR0B=0x01;
TCNT0=0x00;
OCR0A=79;//тут делитель
OCR0B=0x00;


Вот код который генерирует сигнал на ножке МК:
Код
// Timer 0 output compare A interrupt service routine
interrupt [TIM0_COMPA] void timer0_compa_isr(void)
{
if(empty) PORTB.0++;//
        else PORTB.0 = 0;
}


fOCnx= (4 800 000)/2*1*(1 + 79) = 60кГц.

То есть за 2 прерывания выдаётся импульс с частотой 30кГц.
Если что напутал поправьте плиз help.gif
Alex_Pol
Цитата(Папа Карло @ Feb 18 2008, 14:01) *
Резистор я поставил такой большой на ИК диод из-за того, что питание при включённом светодиоде сильно падало(на схеме его уже нет).
Может у вас батарея дохлая? sad.gif Пока с железом не разберётесь, о софте говорить рано.
Папа Карло
Цитата(Alex_Pol @ Feb 18 2008, 15:39) *
Может у вас батарея дохлая? sad.gif Пока с железом не разберётесь, о софте говорить рано.


С железом всё ясно уже.
Убрать диод Д2, уменьшить частоту МК до 2.4 и поставить транзистор с резистором на 50 Ом.
Только у меня вопрос, что SS8050 лучше будет чем KT3102AM ?
Типо KT3102AM не держит ток импульсный ?
Dog Pawlowa
Цитата(Папа Карло @ Feb 18 2008, 17:33) *
С железом всё ясно уже.
Убрать диод Д2, уменьшить частоту МК до 2.4 и поставить транзистор с резистором на 50 Ом.
Только у меня вопрос, что SS8050 лучше будет чем KT3102AM ?
Типо KT3102AM не держит ток импульсный ?

Скорее всего источник питания не держит такой ток.
Запитайте микроконтроллер и инфракрасный диод отдельно, от разных источников, чтобы быть уверенным, что микроконтроллер не будет сбоить.
Alex_Pol
Цитата(Папа Карло @ Feb 18 2008, 15:33) *
С железом всё ясно уже.
Убрать диод Д2, уменьшить частоту МК до 2.4 и поставить транзистор с резистором на 50 Ом.
Только у меня вопрос, что SS8050 лучше будет чем KT3102AM ?
Типо KT3102AM не держит ток импульсный ?
Не ясно. Вы даташит на свою тиньку читали? Там английским по белому написано: Speed Grade:
ATtiny 13V: 0-4mHz@ 1.8-5.5V 0-10mHz@2.7-5.5V. С частотой у вас всё путём. КТ3102 - Ik=100mA, импульсный - 200мА. В принципе пойдёт. Диод Д2, это да, нах не нужен, резистор тоже заменить на 51-47 Ом. Вы пишете, что у вас при включение светодиода напряжение садится. Этого быть не должно. С этим разберитесь.
Папа Карло
В ДШ сказано до 4Мгц, а у меня МК на 4.8МГц работал. А питание после диода было ниже 2.7 В.

Провёл тесты подключая ИК диод через резисторы на питание без МК и транзистора.

Напряжение на батареях 2.99 - 3.00 вольта

Резистор 330 Ом, ток 1.6мА 2.99 В
Резистор 100 Ом ток 8мА 2.98 В
Резистор 22 Ом ток 24мА 2.97 В
Напрямую диод без резистора напруга упала до 2.5 В

Как видно из тестов батарейка держит хорошо ток 24мА на который рассчитан ИК диод.

Ещё из интересного, когда я померил первый раз напряжение батареи, то оно было 2.7 В.
Отпаял 2 транзистора от всех выводов и напряжение поднялось до 2.99-3.00 В
МК был подключён к питанию в это время.
Alex_Pol
Цитата(Папа Карло @ Feb 18 2008, 17:45) *
В ДШ сказано до 4Мгц, а у меня МК на 4.8МГц работал. А питание после диода было ниже 2.7 В.
В ДШ сказано, что при питании 1,8 вольта МК гарантированно заведётся на частоте 4 мГц, а при напряжении 2,7 вольта - на частоте 10мГц.
Папа Карло
Потестил на макетной плате ИК диод с разными подключениями.

Через резистор на 100 Ом и питание 5 В работал норм.
Через резистор 330 Ом почти не светился (напряжение не падало и фототранзистор реагировал еле-еле).
Через транзистор КТ3102АМ и резистор на коллекторе 22 Ом и резисторе на базе 1кОм, тоже еле-еле.
Хотя резистор 22 Ом грелся хорошо.

Может диод не подходит на питание 3 В ?
Или усиление у транзистора маленькое и ему было мало току от резистора 1кОм ?

П.С.
Базу через резистор подключал к питанию 5В.
Alex_Pol
Цитата(Папа Карло @ Feb 18 2008, 23:02) *
Или усиление у транзистора маленькое и ему было мало току от резистора 1кОм ?
П.С.
Базу через резистор подключал к питанию 5В.
Минимальная бэта этих транзисторов - 100. Вот и считаёте, сколько надо в базу тока.
Папа Карло
Проверил диод на плате джойстика, он оказался нерабочий.
Проверил фотоаппаратом, не светился ИК диод.
Заменил на рабочий и приём стал заметно лучше.
Теперь из коридора через всю комнату ловит сигнал, если прицельно навести.
Померил ток на ИК диоде примерно 40мА.


Теперь надо настроить несущую на 30кГц.
Вот код настройки таймера и генерации несущей.
Код
// Timer 0 output compare A interrupt service routine
interrupt [TIM0_COMPA] void timer0_compa_isr(void)
{
PORTB.0++;
}

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 4800,000 kHz
// Mode: CTC top=OCR0A
// OC0A output: Disconnected
// OC0B output: Disconnected
TCCR0A=0x02;
TCCR0B=0x01;
TCNT0=0x00;
OCR0A=39;//60кГц (4 800 000 \ 2 * 1 * 60 000 - 1)
OCR0B=0x00;


Будет у меня с такими настройками несущая 30кГц ?
Папа Карло
Странно, что на такой простой вопрос не могут ответить.
Наверно всем кажется, что это слишком простой вопрос и я сам смогу разобраться, но ...

Я прикинул, что для задания 30кГц несущей мне нужно 2 раза менять уровень на ноге МК.
То есть прерывание должно выдаваться с частотой 60кГц.

Я по формуле OCR = Fcl/(Fs*2*N)-1 посчитал делитель для счётчика 39.
При частоте 4 800 000 Гц и N равном 1.

И посмотрел в VMLAB что на ноге. Он мне написал, что длительность импульса от начала лог 1 до конца лог 0 16,7 мкС, что примерно равно 60кГц.

Хотя по идее частота должна быть 30кГц.

Именно по этому я и спросил про настройку таймера.

Может где я ошибся ?

П.С.
А TSOP у меня одинаково ловит сигнал, что с несущей при делителе 39, что с делителем 79.
Alex_Pol
Цитата(Папа Карло @ Feb 19 2008, 08:43) *
Заменил на рабочий и приём стал заметно лучше.
Это 5!!! Спасибо. a14.gif По коду сказать ничего не могу. Си не знаю. 01.gif Кабы на асме, подсказал бы.
tyro
Цитата(Папа Карло @ Feb 19 2008, 11:02) *
И посмотрел в VMLAB что на ноге. Он мне написал, что длительность импульса от начала лог 1 до конца лог 0 16,7 мкС, что примерно равно 60кГц.

А длительность паузы учитываете? smile.gif
Папа Карло
Цитата(Alex_Pol @ Feb 19 2008, 11:48) *
Это 5!!! Спасибо. a14.gif По коду сказать ничего не могу. Си не знаю. 01.gif Кабы на асме, подсказал бы.


Давайте плиз на асме, какая разница 07.gif

Цитата(tyro @ Feb 19 2008, 12:22) *
А длительность паузы учитываете? smile.gif


Незнаю про что вы.
Но у меня на экране прямоугольные импульсы и я мерил время с начала лог 0 до следующего лог 0.

Вот как я делал (тут делитель в счётчике 79 по идее прерывания с частотой 30кГц):
tyro
Цитата(Папа Карло @ Feb 19 2008, 13:52) *

Так у Вас и без "идеи" 30 кило.(растояние между курорами) smile.gif
Папа Карло
Цитата(tyro @ Feb 19 2008, 14:06) *
Так у Вас и без "идеи" 30 кило.(растояние между курорами) smile.gif


Но по моим прикидкам и подсчётам должно быть тут на графике 15кГц.
И это означает, что я где то не там посчитал и немогу понять где.

Я ж писал, что по моей логике, для частоты 30кГц нужно 2 прерывания.
Тоесть прерывания для смены сигнала с частотой 60кГц.

В ДШ формула написана по которой я считал.

Вот я и хочу узнать где я прокололся.

Блин, сам с собой поговорю и может и ошибочку найду 1111493779.gif
=GM=
Цитата(Папа Карло @ Feb 19 2008, 06:43) *
Теперь надо настроить несущую на 30кГц. Вот код настройки таймера и генерации несущей.
Код
// Clock value: 4800,000 kHz
// Mode: CTC top=OCR0A
TCCR0A=0x02;
TCCR0B=0x01;
TCNT0=0x00;
OCR0A=39;//60кГц (4 800 000 \ 2 * 1 * 60 000 - 1)
OCR0B=0x00;
Будет у меня с такими настройками несущая 30кГц?

Не будет.

У вас ошибка в расчёте. Командой TCCR0A=0x02 вы выбираете делитель на 8, т.е. на вход таймера поступают импульсы частотой 4800/8=600 кГц. Затем эта частота делится на 40, вы получаете 600/40=15 кГц. Ну, два прерывания дадут частоту 7.5 кГц вместо 30. Отсюда все ваши беды.

Кстати, вроде бы в меге128 нет такого регистра TCCR0B, да и TCCR0А тоже нет, есть TCCR0.
Папа Карло
Цитата(=GM= @ Feb 19 2008, 14:54) *
нет такого регистра


Жёстко вы меня crying.gif

ДШ на attiny13:
http://www.chip-dip.ru/library/DOC000059583.pdf

Страница 71
=GM=
Цитата(Папа Карло @ Feb 19 2008, 12:40) *
Жёстко вы меня crying.gif

Прошу пардону, пост неправильный, с какого-то перепугу решил, что у вас мега128. Да и спрашивал я про наличие регистров в меге128, а не в тайни13.
bbill
Из реальной старой работы:
Было написано для tn12, можно напрямую перенести на13,
при использовании внутреннего делителя.
Использовалось без таймеров и прерываний из-за малой частоты тиньки(1,2МГц)

;****Подпрограма формирования возбуждения ИК-диода***********************************
light: cbi PORTB,LOCK ;включение ключа
nop ;
nop ;формирование излучения ИК-диода в течение 1,28 мс
nop ;режим: 7 мкс излучение, 21 мкс - пауза
nop ;46 импульсов возбуждения
; nop
; nop ;команды для подстройки длительности
nop
sbi PORTB,LOCK ;

inc swst ;формирование задержки в 21 мкс
cpi swst,0x5B ;счет числа импульсов возбуждения(46)
breq light_out ;46 имп. 1,28 мсек
nop ;
nop
; nop
; nop
ldi temp,3
voz1_2: dec temp ;
tst temp
brne voz1_2
rjmp light
light_out: ret

;*******************************************************************************
********

Питание ключа в передатчике использовалось 12В(батарея),
токоограничительный резистор 10 Ом.
Приемник 36кГц(тип не помню), ранее использовался в телевизорах.
Дальность сильно зависит от импульсного тока через диод и точности частоты
передатчик-приемник.

Успехов.
=GM=
Цитата(Папа Карло @ Feb 19 2008, 12:40) *
Жёстко вы меня crying.gif

Ну что ж, буду исправляться(:-). У вас на выходе делителя частота 4800 кГц. Частота прерываний 4800/40=120 кГц. Согласны? Если не согласны, то объясните, откуда у вас ещё двойка в знаменателе взялась?
GDI
Цитата

Любые ДШ хоть на тини, хоть на мега лучше смотреть на atmel.com, там они по определению свежее всех
Папа Карло
Цитата(=GM= @ Feb 19 2008, 17:14) *
У вас на выходе делителя частота 4800 кГц. Частота прерываний 4800/40=120 кГц. Согласны? Если не согласны, то объясните, откуда у вас ещё двойка в знаменателе взялась?


Вот мои мысли подкрепленные ДШ.

Формула ДШ для таймера по переполнению по OCR.
Foc = Fcl/2*N*(1+OCR)
Fcl частота генератора МК, Foc частота выхода с таймера.
N = 1, делитель таймера
Тоесть при 4 800 000 / 2 * 1 * (1+39) = 60 000 Гц.
Так в чём у меня были вопросы по частоте я не мог понять почему у меня на выходе ноги 60 000 Гц.
Когда, по идее, должно быть по формуле 60 000 Гц частота прерывания и делим на 2 для смены уровней и выходит 30 000 Гц.

Так вот в ДШ уже в формуле посчитали 2 прерывания.
И это "двойка" как раз и отвечает за это.

Значит для получения частоты прерываний нужно из формулы убрать "двойку".

Подтвердите или опровергните плиз мои заключения.
конечная формула частоты прерываний у меня вышла:
Foc = Fcl/N*(1+OCR)

П.С.
=GM= то есть то же самое, что у вас, но 40 не значение регистра OCR, чтоб делитель был 40 нужно вычесть 1.
=GM=
Цитата(Папа Карло @ Feb 19 2008, 20:24) *
Формула ДШ для таймера по переполнению по OCR. Foc = Fcl/2*N*(1+OCR)

Ну, прежде всего, формула приведена для частоты меандра на ноге OC0А. А для каждого периода будет два прерывания, значит выражение надо удвоить.
Цитата(Папа Карло @ Feb 19 2008, 20:24) *
Так в чём у меня были вопросы по частоте я не мог понять почему у меня на выходе ноги 60 000 Гц.
Когда, по идее, должно быть по формуле 60 000 Гц частота прерывания и делим на 2 для смены уровней и выходит 30 000 Гц.
Так вот в ДШ уже в формуле посчитали 2 прерывания. И это "двойка" как раз и отвечает за это.
Значит для получения частоты прерываний нужно из формулы убрать "двойку".
Подтвердите или опровергните плиз мои заключения.
конечная формула частоты прерываний у меня вышла: Foc = Fcl/N*(1+OCR)

Как-то вы тут немного сумбурно выражаетесь(:-). Я уже сказал в посте выше, что у вас частота прерываний составляет 120 кГц. Если разрешите выход ноги OC0А, можете померять, будет 60 кГц. А вам надо 30 кГц, в этом вся загвоздка для вашей программы, которая решается элементарно - вместо числа 39 запишите число 79 в OCR0А, да и всё. Вот почему, я думаю, у вас была плохая чувствительность, у вас каждый импульс фактически состоял из двух импульсов удвоенной частоты.
Папа Карло
Цитата(=GM= @ Feb 20 2008, 01:45) *
у вас была плохая чувствительность


Не поверите, но оказалось, что у джойстика был дохлый ИК диод 1111493779.gif
А после смены ИК диода чувствительность стала хорошей, но одинаково работало, что с несущей с делителем 39, что с 79 07.gif

Сейчас ещё проверю и отпишу.

---------------

Проверил ...
На удвоенной частоте приём лучше, чем на стандартной.

Что и как я мерил.
Настроил одинаково таймеры на приёмнике и передатчике.
И передавал единичный импульс по нажатию кнопки.
На передатчике 4 кнопки.
Одна передаёт импульс 20 тактов, вторая 30, третья 50, четвёртая 70.
Импульсы 20 и 30 тактов ловились хорошо и на обычном режиме и на удвоенном в комнате.

Но на удвоенном ловились чётко импульсы 20 и 30 даже из коридора.
А на обычной ловился чётко только 20.
Дистанция, команда 15 метров по диагонали и коридор 2-3 метра.
=GM=
Цитата(Папа Карло @ Feb 20 2008, 06:50) *
На удвоенной частоте приём лучше, чем на стандартной

По-хорошему, так не должно быть. Приёмники тсоп1730 есть и на 30 кГц, и на 33, и на 36,... Вы уверены, что ваш приёмник рассчитан на приём именно 30? Такое впечатление по вашим рассказам создаётся, что приёмник не чувствителен к частоте, это по крайней мере странно. Попробуйте найти оптимум по частоте.

Ну и ищите баги в программе, вы что ж думаете, нашли один и всё? Каждая, сколько угодно малая программа имеет по крайней мере одну ошибку(:-). Вот к примеру в вашей программе по приёму, когда вы устанавливаете переменную pulse, неплохо бы её обнулить на входе, поскольку может быть неоднозначность на выходе...
Папа Карло
Цитата(=GM= @ Feb 20 2008, 15:39) *
одну ошибку


У меня там столько ошибок, что страшные демоны плачут от ужаса...

Но стоит TSOP1730 и хз что там и как.
Сейчас программу переписываю.
Папа Карло
Написал программу для передатчика.

Отправляет пакет данных из 8 бит.
2 старт бита, 5 бит данных и один стоп бит.
Протокол по типу RC5. только не 14 бит.

Протестил прогу в VMLAB, вроде работает хорошо.

Если будут советы или замечания буду рад.
AntonS
TSOP-ы хорошо принимают только короткие пачки импульсов! Сам когда-то наступал на такие грабли... Подайте короткую пачку на несущей частоте (в данном случае 30 кГц), а затем сделайте паузу. Исходя из этого планируйте свой протокол передачи данных. Для примера посмотрите тестовый сигнал в даташите на TSOP.
Папа Карло
Протестировал в VMLAB передатчик с таким кодом:
Код
interrupt [TIM2_COMP] void timer2_comp_isr(void)
{
if(pulse) {PORTD.0++;pulse--;}
        else PORTD.0 = 0;

timen1++;
}

void ir_send (unsigned int byte)
{
if (!pulse && timen1 > 3000)
        {
        pulse = byte;
        while(!pulse) #asm("nop");
        timen1 = 0;
        while(timen1 < byte) #asm("nop");
        pulse = byte;
        while(!pulse) #asm("nop");
        timen1 = 0;
        }
}


Настройки таймера:
Код
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: 4800,000 kHz
// Mode: CTC top=OCR2
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x09;
TCNT2=0x00;
OCR2=79;


И у меня всё время в прерывании висела программа.

Частота МК 4.8МГц внутренний генератор.

Возможно ли, что МК просто не хватает времени обрабатывать прерывания ?
vet
Папа Карло,
я так понимаю, вы формируете меандр дерганием ноги в прерывании?
почему бы не использовать штатный аппаратный режим таймера с инверсией ноги OC2 и не обойтись таким образом без этого прерывания вообще?
или переделка платы не допускается по условиям задачи?
Папа Карло
Цитата(vet @ Feb 23 2008, 20:45) *


Просто нужно знать, что такой режим существует.

Допустим я завёл таймер и по сравнению и он инвертирует ногу.
И у меня меандр генерируется аппаратно.

Но тогда мне передавать пакет данных придётся уже не в фоновом режиме и без прерываний.

И как же считать точно отрезки времени, если прерывания нету и счётчика?
vet
Цитата(Папа Карло @ Feb 23 2008, 22:00) *
Просто нужно знать, что такой режим существует.

Битовое поле в регистре TCCR2.

Цитата(Папа Карло @ Feb 23 2008, 22:00) *
Допустим я завёл таймер и по сравнению и он инвертирует ногу.
И у меня меандр генерируется аппаратно.

Но тогда мне передавать пакет данных придётся уже не в фоновом режиме и без прерываний.

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

Цитата(Папа Карло @ Feb 23 2008, 22:00) *
И как же считать точно отрезки времени, если прерывания нету и счётчика?

другим счётчиком.
приёмнику безразлично, в какой фазе мы прервем меандр при передаче бита.
Папа Карло
Цитата(vet @ Feb 23 2008, 22:46) *
другим счетчиком


У меня МК attiny13 и там один счётчик.
Я смогу с помощью счётчика 2 выводить меандр и считать время вывода бита ?
vet
Папа Карло,
да, ознакомившись с первыми постами темы, я уяснил, что устройство собрано на меге8.
если говорить про tiny13, проще всего отмерять битовые интервалы задержками в теле программы,
если критично, можно сделать-таки прерывание по сравнению сч-ка, но разгрузить его, убрав управление выходом (OC0 инвертируется аппаратно) и оставив только отсчет битовых интервалов.
Жорик_у
Цитата(Alex_Pol @ Feb 18 2008, 14:27) *
Для получения искомых 20 мА нужен резистор 1,3/0,02=65 Ом. Резистор R1 должен быть где - то 51 Ом. А порт может выдать миллиампер 30, в даташите посмотрите. Отпалите вы его нахрен. Или порт, или светодиод. З.Ы.



У меня были проблемы с дистанцией и по приему работал неустойчиво, для чего воткнул резик балластом и осциллом ковсвенно по падению на резике добивал ток до необходимого подборкой резика. Памятуя о максимальном импульсном светика в 1.2А влепил гдето 100-250мА, оценивая напругу на балластном резике. да, совсем забыл - порт разгрузил - повесил на него затвор мосфета 3055 с дохлой мамки на сток которого и посадил светик - заработало, ДН сущесвтенно расширилась, брать сигнал стал практически со всех положений передатчика,разве что только в кастрюлю не прятал... дистанция до 4м, больше не позволяет метраж комнаты.

Успехов!

С уважением Жорик.
=GM=
Цитата(Жорик_у @ Feb 27 2008, 13:29) *
повесил на него затвор мосфета 3055 с дохлой мамки на сток которого и посадил светик С уважением Жорик

Полуофф, конечно, но не могу удержаться. Вы случайно, не знаете, что это за мосфет 3055 и как его полное наименование? У меня на мамке выгорел один такой. В сети не могу найти ни его, ни аналог, ничего похожего.
Vlad219i
Цитата(=GM= @ Feb 27 2008, 18:49) *
Вы случайно, не знаете, что это за мосфет 3055 и как его полное наименование?


Очевидно, это Anpec APM3055.
Даташит - на чипинфо находится враз.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.