Помогите разобраться с TSOP и таймером

Программирование микроконтроллеров AVR, PIC, ARM.
Разработка и изготовление печатных плат для модулей.

Помогите разобраться с TSOP и таймером

Сообщение Kingsman » 07 янв 2014, 23:36

Всем привет.

Сделал плату ИК-бампера для своего робота с двумя TSOP4836 датчиками и 4 светодиодами на tiny2313

Поскольку хочу на этом проекте понять основные принципы МК, то делаю все по порядку:
запустить диоды на 36кГц -> сформировать их в пачки и разделить на 2 передатчика (левый и правый) -> заставить TSOP получать данные с правильных передатчиков и выставлять в "1" нужный порт для передачи на МК робота.

Сейчас застрял на первом шаге и пытаюсь настроить таймер на частоту 36кГц, но не совсем пойму как правильно подсчитать.

Код: Выделить всё
#define F_CPU 8000000UL
#include <avr/io.h>
#include <avr/interrupt.h>

#define T_POLL 145

ISR(TIMER0_OVF_vect) // По прерыванию включаются или отключаются светодиоды
{
       TCNT0 = T_POLL;   
      switch(PORTD & (1<<PD0))
       {
          case 1: PORTD &= ~(1<<PD0|1<<PD1);   break;
          case 0: PORTD |=1 <<PD0 | 1<<PD1;   break;
          default: break;
       }
}

ISR(INT0_vect)
{
         PORTD |= 1<<PD5 | 1<<PD6;
}

int main(void)
{
   
   // Конфигурация портов
   // На вывод (ИК-диоды, выходные сигналы с модуля)
   
   DDRD |=1 <<PD0;         // правый передатчик
   PORTD &= ~(1<<PD0);
   
   DDRD |=1 <<PD1;         // левый передатчик
   PORTD &= ~(1<<PD1);
   
   DDRD |=1 <<PD4;         // выход на робота - препятствие справа
   PORTD &= ~(1<<PD4);
   
   DDRD |=1 <<PD5;         // выход на робота - препятствие слева
   PORTD &= ~(1<<PD5);
   
   // На ввод (TSOP4836 датчики)
   
   DDRD &= ~(1<<PD2);      // правый датчик
   PORTD &= ~(1<<PD2);
   
   DDRD &= ~(1<<PD3);      // левый датчик
   PORTD &= ~(1<<PD3);
   
   // Инициализация таймера
   
   TCCR0A = 0x00;
   TCCR0B |= 0b00000010;   // деление частоты на 8
   TCNT0 = T_POLL;
   TIFR |= 1<<TOV0;
   TIMSK |= 1<<TOIE0;
   
   sei();
   
   // Цикл программы
   
   while(1);
   return 0;
}


Таймер подсчитал так из статьи на chipenable.ru (ссылка)

Надеюсь, код будет понятен, постоянно пытаюсь приучить себя комментировать.
По этой программе такт длится около 18мс (осциллографа нет, поэтому пробовал симулировать в протеусе), хотя должен длиться около 27мкс. Что у меня может быть неправильно?
Kingsman
 
Сообщения: 8
Зарегистрирован: 26 авг 2010, 22:28

Re: Помогите разобраться с TSOP и таймером

Сообщение MEXAHuK » 08 янв 2014, 12:01

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

По таймеру-счетчику 0. Он настроен на работу как таймер, с собственной тактовой частотой 8 000 000/8=1 000 000.
То есть инкремент регистра TCNT0 будет происходить каждую микросекунду.
Начальное значение регистра TCNT0=145, это же значение записывается туда при каждом прерывании по переполнению.
Таким образом, для прерывания требуется 256-145=111 тактов таймера или 111 микросекунд.
Так как при каждом переполнении значение битов PORTD.0 и PORTD.1 инвертируется, то частота на этих выходах будет равна 1/((111*2)*10-6)= 4504 Гц.
Чтобы получить частоту моргания около 36 кГц, надо получить частоту прерывания по переполнению 72 кГц. Для этого 1 000 000 надо делить примерно на 14. Поэтому в регистр TCNT0 надо записывать значение 256-14 = 242.

И еще по поводу самого алгоритма для радаров. Моргать светодиодами, отвечающими за разные направления, на мой взгляд, лучше раздельно по времени, в разные временные "фреймы", чтобы не "засвечивать" ими другой TSOP, который опрашивается в данный момент. И еще - моргать надо пачками, "пакетами", а после каждой пачки ловить отраженный сигнал. Если долбить 36кГц постоянно, АРУ TSOP понизит чувствительность и будет нехорошо.
Аватара пользователя
MEXAHuK
 
Сообщения: 228
Зарегистрирован: 07 янв 2005, 23:39
Откуда: г.Норильск, Россия
прог. языки: Pascal, C, C++
ФИО: Раф Попов

Re: Помогите разобраться с TSOP и таймером

Сообщение Radist » 09 янв 2014, 11:07

Про пачки все верно. Делал аналогичные девайсы, наступал на грабли, поэтому не устаю последователям повторять - светодиоды обязательно поместить в непрозрачные трубки (они светят даже задом). Приемник достаточно один, светодиодов - сколько не жалко, временное разделение каналов. И еще один совет - не нужен предделитель на 8, маленького таймера хватит и без него, а частоту точнее получится получить. Кстати, кварц в данном случае не обязателен - отлично работает от внутреннего генератора с подстройкой калибровочного значения (это если комнатное исполнение делаете, а не всепогодное).
Аватара пользователя
Radist
 
Сообщения: 2253
Зарегистрирован: 01 июл 2009, 08:59
Откуда: Екатеринбург
прог. языки: асемблер AVR

Re: Помогите разобраться с TSOP и таймером

Сообщение Kingsman » 11 янв 2014, 15:13

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

Из совета насчет временного разделения - я так понял, лучше всего отправлять пачку на один датчик, ждать с него ответ, затем отправлять сигнал на другой, также ждать ответ и так по кругу?

Походу пора покупать какой-нибудь логический анализатор, Протеусом много не померяешь...
Kingsman
 
Сообщения: 8
Зарегистрирован: 26 авг 2010, 22:28

Re: Помогите разобраться с TSOP и таймером

Сообщение ALS » 11 янв 2014, 16:26

Аватара пользователя
ALS
 
Сообщения: 803
Зарегистрирован: 24 окт 2011, 23:32
Откуда: Севастополь
прог. языки: асм

Re: Помогите разобраться с TSOP и таймером

Сообщение MEXAHuK » 13 янв 2014, 18:36

Kingsman писал(а):Спасибо за советы, попробую в ближайшее время учесть.
Из совета насчет временного разделения - я так понял, лучше всего отправлять пачку на один датчик, ждать с него ответ, затем отправлять сигнал на другой, также ждать ответ и так по кругу?

Я неправильно выразился. Не то чтобы "ждать" ответ. Это не звук, скорость велика, отклик мгновенен.
Я делал так - формировал пачку из 25-100 импульсов. В цикле, или по таймеру, неважно. А после каждого отправленного импульса в пачке проверял выход TSOP. И суммировал полученные ответы.

Код: Выделить всё
// Reinitialize Timer 0 value
TCNT0=0x15;

for (x=1;x<=51;x++) // 50 импульсов с частотой 38 кГц на передний правый IR светодиод
{
IROUTFR = !IROUTFR;
if (BUMP_FR==0) {count_bump_fr++;}; // счетчик правого переднего IR бампера
delay_us(12);
};

delay_us(450);

for (x=1;x<=51;x++) // 50 импульсов с частотой 38 кГц на передний левый IR светодиод
{
IROUTFL = !IROUTFL;
if (BUMP_FL==0) {count_bump_fl++;}; // счетчик левого переднего IR бампера
delay_us(12);
};

delay_us(450);


Получалось, допустим, так - отправил 100, получил 75. Значит, с вероятностью большей или равной 75% перед датчиком есть препятствие. Полученные отсчеты также можно суммировать и вычислять среднее, фильтровать и т.д.
В остальном все совершенно верно - по кругу, формирование пачки и опрос следующего TSOP.

Походу пора покупать какой-нибудь логический анализатор, Протеусом много не померяешь...


Анализатор штука хорошая и тоже нужен, но гораздо полезнее для робототехника будет любой недорогой цифровой осциллограф типа RIGOL, OWON и т.д.

А светодиоды отлично помещаются в корпуса из по электролитических конденсаторов. Крышка стачивается, "кишочки" с ножками извлекаются, светодиод вставляется внутрь корпуса, в резиновых уплотнителях уже есть отверстия под выводы.
Аватара пользователя
MEXAHuK
 
Сообщения: 228
Зарегистрирован: 07 янв 2005, 23:39
Откуда: г.Норильск, Россия
прог. языки: Pascal, C, C++
ФИО: Раф Попов

Re: Помогите разобраться с TSOP и таймером

Сообщение loox » 14 янв 2014, 00:26

Kingsman
Прошу Вас точно сообщить(написать) в чем собственно проблема:
1. Есть затруднения в написании кода - в чем проблема, на каком языке и какой контроллер
2. Есть затруднения в в знаниях по этой проблеме - какие знания отсутствуют, и что хотите знать
напишите я помогу ( не стесняйтесь, отсутствие знаний - не порок ( это я не для Вас))
Loox, спасибо
loox
 
Сообщения: 326
Зарегистрирован: 26 мар 2008, 12:45

Re: Помогите разобраться с TSOP и таймером

Сообщение elmot » 16 янв 2014, 14:12

Kingsman писал(а):Походу пора покупать какой-нибудь логический анализатор, Протеусом много не померяешь...

Походу с AVR пора завязывать. На нормальных контроллерах можно таймерами аппаратно генерить эти пачки импульсов.
И Логический анализатор!
Аватара пользователя
elmot
 
Сообщения: 5691
Зарегистрирован: 10 ноя 2011, 12:02
Откуда: Turku, Finland
Skype: elmot73
прог. языки: Java и все-все=все
ФИО: Илья

Re: Помогите разобраться с TSOP и таймером

Сообщение Radist » 17 янв 2014, 08:27

Не надо завязывать с AVR только на том основании, что у ТС с ним возникли проблемы. МК умеет аппаратно генерировать несущую, а управление огибающей - прерогатива программиста. В данном конкретном случае задача настолько простая, что для отладки достаточен симулятор студии. Тут чисто МК работает на выход. Вот когда не работает 1wire или I2C (то есть есть еще устройства, которые вносят свой вклад в цифровой сигнал) - тут поможет осциллограф, даже одноканалный низкочастотный. А вот когда логических сигналов куча, и не все из них генерит МК - вот только тогда может понадобиться логический анализатор (многоканальное по своей сути устройство). Но если воспользоваться древним принципом "Разделяй и властвуй" - логический анализатор не понадобится никогда.
Аватара пользователя
Radist
 
Сообщения: 2253
Зарегистрирован: 01 июл 2009, 08:59
Откуда: Екатеринбург
прог. языки: асемблер AVR

Re: Помогите разобраться с TSOP и таймером

Сообщение loox » 17 янв 2014, 12:09

К сожалению заявитель темы не ответил о характере затруднений, отказался от помощи - а напрасно, я бы помог
Текст программы, который он представил, представляет собой набор бессмысленных инструкций, к большому сожалению.
На AVR можно генерировать практически любые сигналы, по крайней мере для работы с TSOP.
По поводу симулятора "студии" - в некоторых версиях, симуляция выводов таймеров работает НЕПРАВИЛЬНО!!!!!!
Loox.
loox
 
Сообщения: 326
Зарегистрирован: 26 мар 2008, 12:45

Re: Помогите разобраться с TSOP и таймером

Сообщение Radist » 17 янв 2014, 19:48

Может быть. Я сижу в 4.12 (все еще) - полет нормальный.
Аватара пользователя
Radist
 
Сообщения: 2253
Зарегистрирован: 01 июл 2009, 08:59
Откуда: Екатеринбург
прог. языки: асемблер AVR

Re: Помогите разобраться с TSOP и таймером

Сообщение loox » 17 янв 2014, 22:42

Не знаю, не знаю ...
У меня 4.16 , выводы OCR у таймеров ведут себя весьма оригинально, вернее неправильно..
loox
loox
 
Сообщения: 326
Зарегистрирован: 26 мар 2008, 12:45

Re: Помогите разобраться с TSOP и таймером

Сообщение Kingsman » 19 янв 2014, 21:05

Loox, я вовсе не отказался от помощи. Спасибо за предложение, буду спрашивать. Прошу прощения за отсутствие - роботы и МК для меня все же хобби, на которое иногда просто нет времени.
По поводу трудностей - они не то что вообще есть, но в каждой конкретной ситуации возникают и в одиночку их решать иногда тяжело и наверное глупо, можно ведь и глупостей наворотить, которые вроде и работают, на на "соплях".

Пишу на Си, пробовал Ассемблер, даже написал пару программок а-ля помигай лампочкой. Но посчитал что мне по душе все же Си. Трудностей как таковых не было с простыми проектами. Делал, например УФ лампу для сушки ногтей (второй половинке) с задержкой времени, горизонтальную развертку (вернее правил под себя готовый проект на асме), робота с сервоприводами и фотодиодами (едет на свет фонарика), где пытался запустить ШИМ.

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

elmot, я с Вами не согласен. Если бы хотел скорости и простоты, взял бы ардуино с готовыми модулями. Сейчас мне хочется именно разобраться с логикой программирования МК и AVR в частности, а заодно научиться "курить" мануалы :) Кстати, только к AVR я привязываться не собираюсь. Недавно спаял небольшой термометр на MSP430 и после этого бампера приступлю к нему.

MEXAHuK, спасибо за разъяснение, попробую внести изменения. О покупке осциллографа уже задумывался, пока заказал посоветованный ALS. Думаю, для начала хватит.
Kingsman
 
Сообщения: 8
Зарегистрирован: 26 авг 2010, 22:28

Re: Помогите разобраться с TSOP и таймером

Сообщение elmot » 19 янв 2014, 21:17

Kingsman писал(а):Если бы хотел скорости и простоты, взял бы ардуино с готовыми модулями. Сейчас мне хочется именно разобраться с логикой программирования МК и AVR в частности, а заодно научиться "курить" мануалы :) Кстати, только к AVR я привязываться не собираюсь. Недавно спаял небольшой термометр на MSP430 и после этого бампера приступлю к нему.

Одобрямс! :good:
Аватара пользователя
elmot
 
Сообщения: 5691
Зарегистрирован: 10 ноя 2011, 12:02
Откуда: Turku, Finland
Skype: elmot73
прог. языки: Java и все-все=все
ФИО: Илья

Re: Помогите разобраться с TSOP и таймером

Сообщение loox » 20 янв 2014, 22:17

Коллега
спасибо за ответ..
Вопрос с TSOP, при всей конструктивной простоте, весьма не простой.
В связи с тем, что ко мне поступило много вопросов связанных с использованием TSOP, вероятнее всего, с разрешения ФОРУМА, я выложу некоторый материал по применению TSOP в этой ветке (материал готовиться и будет готов через 2-3 дня).
Вы пожалуйста не обижайтесь на мою ремарку по поводу Вашей программы. Усли необходимо - обращайтесь на личную почту.
Loox
loox
 
Сообщения: 326
Зарегистрирован: 26 мар 2008, 12:45


Вернуться в Микроконтроллеры

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

cron