роботы робототехника микроконтроллеры


 Страниц (8): « 1 2 3 4 5 [6] 7 8 »   

> Без описания
alex1991 Post Id



Генерал


Сообщений всего: 91
Дата рег-ции: Май 2010  



спасибо еще раз Улыбка после того как я вставил кусок кода который выше все заработало как надо он видит препятствия на пол комноты нужно наверно резистор поставить помощнее на ик светодиод чтобы работал на меньшую дистанцию и почему я раньше ступил и вставил свой Ламер и не пойму почему с этом куском работает а с моим нет
f(modulation<20) //длина пачки (можно менять)
{
PORTB |= (1<<0);
PORTD |= (1<<6) ;
}

else
{
PORTB &= (~(1<<0));
PORTD &= (~(1<<6));
}
если можете обьясните на будушее Улыбка
еше раз спасибо

(Отредактировано автором: 28 Мая, 2010 - 00:18:08)

 
 Top
nest Администратор Post Id



Администратор


Сообщений всего: 4866
Дата рег-ции: Сент. 2009  



там около килоома нужно, вроде бы, что б не такой дальнобойный был.
 
 Top
ОЛЕГ Супермодератор Post Id



Супермодератор


Сообщений всего: 1732
Дата рег-ции: Нояб. 2008  



nest пишет:
там около килоома нужно, вроде бы, что б не такой дальнобойный был.

Да, килоомный будет оптимально.
Только не вместо 220 Ом, а последовательно с ним.
Иначе если Вы нечаянно выкрутите килоомный подстроечник в ноль и не будет постоянного резистора ом на 220, светодиоды могут сгореть.

alex1991 пишет:
не пойму почему с этом куском работает а с моим нет

Ваш кусок просто подает 1 на порты, а потом 0.
Мой кусок, как бы, одевает на порт маску (как в фотошопе) и на включаемый порт (куда записана 1) подается меандр, который отсчитывается таймером.
Это вот если на пальцах, как я это понимаю.
Если Вы обратите внимание, написание совершенно разное. При чем дело даже не в том, что мне удобнее пользоваться бинарной системой, хотя это менее принято.
Потом не забывайте, что это специализированная функция SIGNAL(SIG_OVERFLOW), обработчик прерываний таймера. Не я ее придумал.

Nest, не мог бы ты осветить этот вопрос более научно? Улыбка
Если я прав, то речь идет о побитовых логических операциях.
 
 Top
alex1991 Post Id



Генерал


Сообщений всего: 91
Дата рег-ции: Май 2010  



спасибо за ответ но вы олег правы хорошо если бы можно было рассказать об этом куске кода
по подробнее Улыбка
 
 Top
ОЛЕГ Супермодератор Post Id



Супермодератор


Сообщений всего: 1732
Дата рег-ции: Нояб. 2008  



Несколько не так.

Программа работает следующим образом.
Мы с Вами взяли timer0, который находится внутри МК и настроили его таким образом, чтобы он переполнялся 36 000 раз в секунду. Вру, 72 000. Улыбка
Есть тактовый генератор, который тикает со скоростью 8 МГц. Чтобы получить частоту 36 КГц, нам нужно менять уровень сигнала на выходе МК с частотой 72 КГц. 8 МГц / 72 КГц = 111,11.
То есть, каждые 111 тиков генератора таймер должен переполняться.
Так и запишем: TCNT0 = 111;
TCCR0 - это предделитель. Таймер0- 8 битный и он не умеет считать больше 256. То есть наш делитель должен быть меньше 256, что не всегда подходит. Предделитель служит предварительным коэффициентом деления и может принимать значения 1(как у нас с Вами), 8, 64, 256. Это будет соответствовать условным обозначениям 1, 2, 3, 4. То есть, TCCR0 может быть равен 1, 2, 3, 4.
Получается, что если бы нам была нужна частота, скажем, 10 Кгц (то есть, уровни бы менялись с частотой 20 КГц), то 8000000/20000=400. Нам это не подходит, если мы используем таймер0 (есть и другие). Мы должны найти такой предделитель, на который бы 8000000 делилось нацело. Пусть 8. TCCR0=2; 8000000/8/20000=50. TCNT0 = 50; Частота мигания светодиода 10 КГц.

Наш код:
CODE:
void init_timer0 ()
{cli(); //запретить все прерывания (чтобы таймер досчитал до конца)
TCNT0 = 111; //делитель
TCCR0 = 1; //предделитель
TIMSK = 1; //разрешение прерывания по переполнению
sei();} //разрешение прерывания (таймер уже досчитал)


Вот и получается, что когда таймер переполняется, происходит прерывание выполнения основной программы и вызывается функция обработчика прерывания SIGNAL(SIG_OVERFLOW0), в которой мы и меняем состояние порта с той частотой, на которую мы настроили наш таймер.

Если я в чем-то не прав, поправьте, пожалуйста.

А о побитовых логических операциях, мне кажется, Nest расскажет лучше меня. Я в них не очень. Улыбка
 
 Top
alex1991 Post Id



Генерал


Сообщений всего: 91
Дата рег-ции: Май 2010  



спасибо большое Улыбка
теперь ик-бампер работает как я хотел
теперь я решил сделать бегущюю строку для робота если можете помогите в ее создании
вот тут открыта тема http://myrobot.ru/forum/topic.ph...11&topic=185
 
 Top
alex1991 Post Id



Генерал


Сообщений всего: 91
Дата рег-ции: Май 2010  



есть один вопрос можно убрать один tsop в этой схеме.
просто я думаю сделать вот так
1 ик-посылает к примеру длина пачки if(modulation<20) зажигается 1 светодиод
2 ик-посылает к примеру длина пачки if(modulation<40) зажигается 2 светодиод
он будет работать и будет тсоп реагировать на отдельный ик-светодиод?
вот код который я сейчас использую на двух тсоп но как сделать на дном тсоп и чтобы он генерировал разные частоты для двух ик-светодиодов?

#include <avr/io.h>
#include <avr/delay.h>
#include <avr/iom8.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#define F_CPU 8000000UL // 8 MHz

volatile int modulation=200; // длина всей посылки (можно менять)

SIGNAL(SIG_OVERFLOW0) //функция модуляции сигнала
{
if(modulation<20) //длина пачки
{
PORTB ^= 0b00000001;
PORTD ^= 0b01000000;
}

else
{
PORTB &= 0b00000000;
PORTD &= 0b00000000;
}

if(modulation<200) //для счета длины посылки
{modulation++;}

else
{modulation=0;}

TCNT0 = 0;
}



void init_timer0 () //настройка таймера 0
{cli();
TCNT0 = 111;
TCCR0 = 1;
TIMSK = 1;
sei();
}


int main(void) //основная программа
{



DDRB |= (1<<0); /* PB0 сконфигурировать как выход, ИК-диод 2 */
/* PB1 */
/* PB2 */
DDRB |= (1<<3); /* PB3 сконфигурировать как выход, индикаторный светодиод 1 */
DDRB |= (1<<4); /* PB4 сконфигурировать как выход, индикаторный светодиод 2 */
/* PB5 */
/* PB6 */
/* PB7 */

/* PC0 */
DDRC |= (1<<1); /* PC1 сконфигурировать как выход, драйвер двигателя */
DDRC |= (1<<2); /* PC2 сконфигурировать как выход, драйвер двигателя */
DDRC |= (1<<3); /* PC3 сконфигурировать как выход, драйвер двигателя */
DDRC |= (1<<4); /* PC4 сконфигурировать как выход, драйвер двигателя */
/* PC5 */
/* PC6 */
/* PC7 */

/* PD0 */
DDRD &= (~(1<<1)); /* PD1 сконфигурировать как вход, канал радиоуправления */
DDRD &= (~(1<<2)); /* PD2 сконфигурировать как вход, канал радиоуправления */
DDRD &= (~(1<<3)); /* PD3 сконфигурировать как вход, канал радиоуправления */
DDRD &= (~(1<<4)); /* PD4 сконфигурировать как вход, канал радиоуправления */
DDRD &= (~(1<<5)); /* PD5 сконфигурировать как вход, TSOP 1 */
DDRD |= (1<<6); /* PD6 сконфигурировать как выход, ИК-диод 1 */
DDRD &= (~(1<<7)); /* PD7 сконфигурировать как вход, TSOP 2 */

/* PD0 */
PORTD |= (1<<1); /* PD1 установить "1", включаем подтягивающий резистор */
PORTD |= (1<<2); /* PD2 установить "1", включаем подтягивающий резистор */
PORTD |= (1<<3); /* PD3 установить "1", включаем подтягивающий резистор */
PORTD |= (1<<4); /* PD4 установить "1", включаем подтягивающий резистор */
PORTD |= (1<<5); /* PD5 установить "1", включаем подтягивающий резистор */
/* PD6 */
PORTD |= (1<<7); /* PD7 установить "1", включаем подтягивающий резистор */
_delay_ms(100); //сброс ложного сигнала тсопа при включении (можно убрать)

init_timer0(); //инициализация таймера!!!

while(1)


/* проверка TSOP 1 */
{if ( !(PIND & (1<<5)) ) /* проверить "0" на PD5 */
{ PORTB |= (1<<3); } /* установить "1" на PB3 */
else
{ PORTB &= (~(1<<3)); } /* установить "0" на PB3 */

/* проверка TSOP 2 */
{if ( !(PIND & (1<<7)) ) /* проверить "0" на PD7 */
{ PORTB |= (1<<4); } /* установить "1" на PB4 */
else
{ PORTB &= (~(1<<4)); } /* установить "0" на PB4 */

}
}

}
я думаю так сделать потому что части по бокам ик-бампера (ик-светодиод и тсоп) мешают друг другу я пытался изолировать друг от друга но они серавно мешают
и если убрать один тсоп то они будет устойчиво работать
 
 Top
nest Администратор Post Id



Администратор


Сообщений всего: 4866
Дата рег-ции: Сент. 2009  



alex1991 пишет:
думаю сделать вот так
1 ик-посылает к примеру длина пачки if(modulation<20) зажигается 1 светодиод
2 ик-посылает к примеру длина пачки if(modulation<40) зажигается 2 светодиод
он будет работать и будет тсоп реагировать на отдельный ик-светодиод?

не понял ...
 
 Top
ОЛЕГ Супермодератор Post Id



Супермодератор


Сообщений всего: 1732
Дата рег-ции: Нояб. 2008  



alex1991 пишет:
как сделать на дном тсоп и чтобы он генерировал разные частоты для двух ик-светодиодов?

Это как? Улыбка
 
 Top
alex1991 Post Id



Генерал


Сообщений всего: 91
Дата рег-ции: Май 2010  



то есть, к примеру, если есть препятствие и сигнал определенной длины волны с первого ик-светодиода, то есть генерированного с такой длиной волны, чтобы тсоп воспринимал эту частоту, как первый ик-светодиод, а если поступил сигнал на второй ик-светодиод с другой длиной волны, он воспринимал бы, как второй ик-светодиод
чтобы было понятнее, приведу пример с пультом тв:
при нажатии на кнопку 1 у пульта, пульт генерирует пачку частот которая поступает на (к примеру тсоп) у тв и он воспринимал и включает 1 канал у тв
при нажатии на кнопку 2 у пульта, пульт генерирует пачку частот которая поступает на (к примеру тсоп) у тв и он воспринимал и включает 2 канал у тв
 
 Top
nest Администратор Post Id



Администратор


Сообщений всего: 4866
Дата рег-ции: Сент. 2009  



alex1991, нет. даже если несущая частота TSOP-а "совсем" разная (36 и 40 кГц) ИК бампер будет "ловить" обе.
ДУ телевизара сделано на принцыпе кодирования.

Есть вариант светить одним свтодиодом в одну сторону и в этот момент следить, пришло ли на TSOP что то или нет. а потом светить другим светодиодом в другую сторону и опять следить за TSOP. Так делают. Ставят 8 светодиодов и один TSOP с зеркальной воронкой.
 
 Top
ОЛЕГ Супермодератор Post Id



Супермодератор


Сообщений всего: 1732
Дата рег-ции: Нояб. 2008  



Что-то мне подсказывает,alex1991, что проблема кроется не в фокусировке ИК-светодиодов, что ТСОПы ловят какие-то отраженные сигналы.
Начать нужно с того, что подключить ТСОПы согласно рекомендаций производителя, то есть включить в схему все резисторы и конденсаторы. А потом поговорим о том, мешает второй ТСОП, или нет.

Nest говорит дело.
 
 Top
alex1991 Post Id



Генерал


Сообщений всего: 91
Дата рег-ции: Май 2010  



спасибо товарищи специалисты за ответы Улыбка
 
 Top
nest Администратор Post Id



Администратор


Сообщений всего: 4866
Дата рег-ции: Сент. 2009  



nest пишет:
Есть вариант светить одним свтодиодом в одну сторону и в этот момент следить, пришло ли на TSOP что то или нет. а потом светить другим светодиодом в другую сторону и опять следить за TSOP.
вот это имел ввиду: (хоть это и маяк, но принцып такой же. тут внизу страницы )

 
 Top
ОЛЕГ Супермодератор Post Id



Супермодератор


Сообщений всего: 1732
Дата рег-ции: Нояб. 2008  



Nest, это все понятно.
Вывести с одной ноги МК меандр с нужной частотой, а другими ногами включать транзисторы, чтобы они этот меандр на светодиоды подавали.

Там если по схеме посмотреть, из-за которой все и есть, нет даже подтяжки на фотоприемнике. А без этого он "сигналы с Марса" принимает. Сам знаю. Замешательство
 
 Top
Страниц (8): « 1 2 3 4 5 [6] 7 8 »
« Делаем роботов »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 





Powered by Exclusive Bulletin Board
ExBB FM 1.0 RC1 Smiles by Fool from Foolstown
  Яндекс.Метрика   Рейтинг@Mail.ru