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


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

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



Генерал


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



решил провести один эксперимент все-же пришлось разобрать пульт от тв и в нем место ик-светодиода сунул свой ик-светодиод который стоит в моем ик-бампере и он реагирует Улыбка значит ик-светодиод подходит к моей tsop-пке только нужно выяснить частоту
длины волн Грустный до сиг пор подбираю разные комбинации и пока 0 результата
 
 Top
nest Администратор Post Id



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


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



alex1991, есть есть частотомер: напишите сначала просто код для нужной частоты, проверить, подправить. А потом уже на пачки делить.

Скорее всего у вас что то с кодом.
Если не трудно - прикрепитен тут свою прошивку (*.HEX), посмотрим, что там у вас крутится :) только уже завтра.
 
 Top
ОЛЕГ Супермодератор Post Id



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


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



Я что-то как-то долго не мог понять суть обсуждаемой здесь проблемы, поэтому не встревал.
Заинтересовался скоростью света. Расчет верный, но не нужно игнорировать данные даташита. Там указана максимальная дальность действия TSOP, она составляет всего 30 метров.

По сути:

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

Я предлагаю код на таймере:
CODE:

#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) //функция модуляции сигнала
{
TCNT0 = 0;

if(modulation<20) //длина пачки (можно менять)
{PORTB ^= 0b00000010;} //маска полезного меандра на порт В1 (хоть на какой)

else
{PORTB &= 0b00000000;} //когда пачка заканчивается- маска паузы



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

else
{modulation=0;}
}



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


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

DDRB = 0b11111111; // выход
PORTB = 0b00000000;
DDRD = 0b00000000; // вход
PORTD = 0b11111111;
DDRC = 0b00000000; // вход
PORTC = 0b11111111;


_delay_ms(100); //сброс ложного сигнала тсопа при включении (можно убрать)

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

while(1)
{
//ЗДЕСЬ ВАШ КОД

//сначала опрашиваем оба фотоприемника одновременно,
//потом по отдельности каждый
//нагромождение команд будет мешать своевременному опросу фотоприемников- т.е.
//сначала опрашиваем, а потом все остальное
}
}
 
 Top
alex1991 Post Id



Генерал


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



вот код .hex к слову схема пока работает от внутреннего rc генератора 1 мгц с фьзами пока не дружу поэтому решил их не трогать потом уже их выставлю на 8 мгц
Скачать файл: код.rar
Скачан раз: 348
 
 Top
mihail Post Id



Гуру


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



nest ОЛЕГ

нет слов Улыбка

Спасибо!
 
 Top
alex1991 Post Id



Генерал


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



снизу в программе можно сразу добать после while(1) свои код ?а то я добавил код и не чего работает Грустный
(Добавление)
или как поменять порт в строчке
if(modulation<20) //длина пачки (можно менять)
{PORTB ^= 0b00000010;} //маска полезного меандра на порт В1 (хоть на какой) например на В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) //функция модуляции сигнала
{
TCNT0 = 0;

if(modulation<20) //длина пачки (можно менять)
{PORTB ^= 0b0000001;} //маска полезного меандра на порт В1 (хоть на какой)

else
{PORTB &= 0b00000001;} //когда пачка заканчивается- маска паузы

if(modulation<20) //длина пачки (можно менять)
{PORTD ^= 0b0100000;} //маска полезного меандра на порт В1 (хоть на какой)

else
{PORTD &= 0b01000000;} //когда пачка заканчивается- маска паузы




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

else
{modulation=0;}
}



void init_timer0 () //настройка таймера 0
{cli();
TCNT0 = 222;
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)
{if ( !(PIND & (1<<5)) ) /* проверить "0" на PD5 */
{ PORTB |= (1<<3); } /* установить "1" на PB3 */
else
{ PORTB &= (~(1<<3)); } /* установить "0" на PB3 */

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

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

_delay_us(560); /* временная задержка между пачками */
PORTB &= (~(1<<0)); /* установить "0" на PD6, ИК-светодиод светит */
_delay_us(14); /* временная задержка определяющая время в течении которого ИК-светодиод светит */
PORTB |= (1<<0); /* установить "1" на PD6, ИК-светодиод не светит */
}

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

_delay_us(560); /* временная задержка между пачками */

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



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


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



mihail пишет:
nest ОЛЕГ

нет слов

Спасибо!

Пост принял. Помираю со смеху

alex1991, итак:

Тактируем МК частотой 8 МГц.

ИК-светодиоды логичнее подключить к одной ноге МК через транзисторный ключ. Это целесообразно по всем соображениям, но не критично.

Вообще я придерживаюсь мнения, что лучше всегда сначала продумать использование портов, а не припаивать куда припаялось, а потом ломать голову и путаться в программе.
Да, согласен, есть сложные проекты, где это невозможно. Но на стадии разработки лучше все-таки не мудрить.
Вот к примеру, у Вас есть:
1. светодиоды, ИК-светодиоды. Повесьте их на порт В.
2. радиоуправление, фотоприемники- на порт С, к примеру.
3. управление драйвером- порт D.
Увидите, насколько Вам будет проще и удобнее. А когда программа заработает как ей положено- можно уже усложнять. Это так, мысли вслух. Улыбка

Если делать как Вы хотите, то нужно так:
CODE:
SIGNAL(SIG_OVERFLOW0) //функция модуляции сигнала
{
TCNT0 = 0;

if(modulation<100) //длина пачки (можно менять)
{PORTB ^= 0b0000001;
PORTD ^= 0b01000000;} //маска полезного меандра на порт В0 и D6

else
{PORTB &= 0b00000000;
PORTD &= 0b000000000;} //когда пачка заканчивается- маска паузы на порт В0 и D6

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

else
{modulation=0;}
}


Инициализацию портов я глянул мельком- не везде включена подтяжка резисторами.

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

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

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

Здесь я вообще не понял. Я же писал, что сначала мы проверяем TSOPы, а только потом делаем все остальное.

Зачем вот это:
CODE:
_delay_us(560); /* временная задержка между пачками */
PORTB &= (~(1<<0)); /* установить "0" на PD6, ИК-светодиод светит */
_delay_us(14); /* временная задержка определяющая время в течении которого ИК-светодиод светит */
PORTB |= (1<<0); /* установить "1" на PD6, ИК-светодиод не светит */
?

Все пачки и временные задержки мы делаем вот тут:
CODE:
SIGNAL(SIG_OVERFLOW0) //функция модуляции сигнала
.
(Добавление)
Кстати, возможно, Ваш код реагирует на лентяйку от телевизора. Только Вы не видите этого.
Подумайте, почему? Подмигивающий
(Добавление)
А зачем Вам два ИК-светодиода на разных портах?
 
 Top
alex1991 Post Id



Генерал


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



вот схема устройства
один tsopa отвечает за правую сторону если есть препятствие другой за левую
по совету mihaila я убрал из схемы транзисторы у ик-светодиодов
Прикреплено изображение
DSC01990.JPG

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



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


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



Вот это уже конструктивный диалог. Улыбка

Оставьте один ИК-светодиод на В0. Его вполне достаточно пока. Потом, когда программу отладите, повесите туда через транзистор несколько.

Nest несколько постов назад писал Вам, что TSOPы подключены не верно. Найдите на них документацию и посмотрите, как это сделать правильно. Так они работать не будут.

Посмотрите как правильно подключать питание к МК и сделайте это.

Какой частоты кварц?

Документацию можно найти либо здесь по ссылке на форуме, либо в каталоге ЧипДип.
 
 Top
alex1991 Post Id



Генерал


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



mihail мне помог с прошивкой и бампер реагивал только на пульт от тв а от своего ик-свето диода не хочет только проблема в это заключается кварца у меня пока в конструкции нет пытался выставить фьюзы в pony prog 8 мгц и конструкция не хотела работать и на данный момент у меня стоит 3-8 мгц от внутреннего rc
 
 Top
ОЛЕГ Супермодератор Post Id



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


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



alex1991 пишет:
а от своего ик-свето диода не хочет только проблема в это заключается кварца у меня пока в конструкции нет пытался выставить фьюзы в pony prog 8 мгц и конструкция не хотела работать и на данный момент у меня стоит 3-8 мгц от внутреннего rc

Если у Вас нет возможности точно выставить частоту внутренней RC-цепочки на 8 МГц (да хоть на сколько, главное, чтобы была конкретная частота, а не диапазон), то ничего и не получится без внешнего кварца.

Я не знаком с Пони. 8 МГц можно выставить в программе AVR Studio. Безо всяких фузов. Просто выбираете галочку "Хочу 8 МГц" и все. Улыбка
 
 Top
alex1991 Post Id



Генерал


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



есть, кажется я разобрался просто нужно было разобратся в программе Улыбка
включается светодиод с расстояния 5см больше принципе мне не надо горят светодиоды не совсем ярко может частоту точнее в программе надо подбирать Замешательство если что я оставлю код его так и так надо доработать
P.S хочу выразить огромную благодарность mihail , nest и олегу
#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) //функция модуляции сигнала
{
TCNT0 = 0;

if(modulation<20) //длина пачки (можно менять)
{PORTB |= (1<<0); /* PB0 сконфигурировать как выход, ИК-диод 2 */
} //маска полезного меандра на порт В1 (хоть на какой)

else
{PORTB &= (~(1<<0));} /* PB0 сконфигурировать как выход, ИК-диод 2 */ //когда пачка заканчивается- маска паузы

if(modulation<20) //длина пачки (можно менять)
{PORTD |= (1<<6) ;} //маска полезного меандра на порт В1 (хоть на какой)

else
{PORTD &= (~(1<<6));} //когда пачка заканчивается- маска паузы




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

else
{modulation=0;}
}



void init_timer0 () //настройка таймера 0
{cli();
TCNT0 = 222;
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)
{if ( !(PIND & (1<<5)) ); /* проверить "0" на PD5 */
if ( !(PIND & (1<<7)) ); /* проверить "0" на PD7 */

/* проверка 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
ОЛЕГ Супермодератор Post Id



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


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



alex1991, я не понимаю, зачем Вы что-то спрашиваете, если Вы не читаете то что Вам отвечают и делаете все по-своему.

alex1991 пишет:
просто нужно было разобратся в программе

Для этого мы тут и общаемся.

alex1991 пишет:
включается светодиод с расстояния 5см

Потому что он подключен напрямую к МК. С транзистором будет больше.

alex1991 пишет:
может частоту точнее в программе надо подбирать

Не надо. Частота составляет 36036 Гц (в моем варианте, в Вашем- не знаю). Точнее не получится.

alex1991 пишет:
горят светодиоды не совсем ярко

Потому что программа, приведенная Вами выше работает не так, как Вам кажется. То есть, не работает. Замешательство
 
 Top
alex1991 Post Id



Генерал


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



питание на микроконтроллере у меня стабильно 5в
тсор у меня установлен правильно по датащиту tsop1736
на пульт он реагирует и мигает ярко
вы считаете что он по последней программе не должен работать?
почему?
я в программирование слаб но много лет уже держу паяльник в руках так что ошибок в такой простой схеме быть не должно Подмигивающий
 
 Top
ОЛЕГ Супермодератор Post Id



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


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



alex1991 пишет:
питание на микроконтроллере у меня стабильно 5в

Это хорошо. Но к чему это сказано?

alex1991 пишет:
тсор у меня установлен правильно по датащиту tsop1736

Закатывать глаза

alex1991 пишет:
вы считаете что он по последней программе не должен работать?

Я лишь сказал, что программа работает не так, как Вы предполагаете. Если Вы с ней начнете двигаться дальше в создании робота, будут неожиданности.

alex1991 пишет:
почему?

ПАТАМУШТА!!! (цитата из к/ф "О чем говорят мужчины" ) Улыбка Все написано выше.
Я не в праве навязывать Вам свою точку зрения, но все же лучше сделать как-то вот так:

-опрос тсоп1
-включаем что-то
-что-то работает
-выключаем это что-то

-опрос тсоп2
-включаем что-то
-что-то работает
-выключаем это что-то

И найдите отличия между своей последней программой и моей. Улыбка
 
 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