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


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

> Без описания
nest Администратор Post Id



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


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



alex1991 пишет:
тсор у меня установлен правильно по датащиту tsop1736
вот если как тут по схеме - то не по даташиту. Необходим ещё конденсатор 5-10 мкФ. Это маленькая, но очень важная деталь. Без кондёра всё работает нестабильно.
 
 Top
alex1991 Post Id



Генерал


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



спасибо Улыбка
 
 Top
alex1991 Post Id



Генерал


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



у меня такой вопрос у кого есть ponyprog Версия 2.05a Beta или кто знает не подскажит как выставить фьюзы на 8мгц внешний кварц а то я уже замучился с ними
пробовал выставить как написано тут
http://myrobot.ru/wiki/index.php...jects.MyPROGGER5
но у меня вообще после выставление этих фьюзов программатор не отвечает после программирования
 
 Top
nest Администратор Post Id



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


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



С таким расположением как нарисованно - всё замечательно работает.
Но вот если вы сначала с ними "играли" - тогда ой.


(Добавление)
alex1991 пишет:
вот код .hex к слову схема пока работает от внутреннего rc генератора 1 мгц
пару слов по прошивке:
1. при 1 МГц у вас импульсы на светодиод идут с частотой 2300 Гц.
То есть, подключив вместо светодиода высокоомный динамик вы услышите звук.
А все частоты TSOP находятся за границей слышимости.
2. с другой стороны ... расчитано всё "верно" (в кавычках - потому что см. след. пункт).
Если всё же частота тактирования будет 8 МГц, то частота как раз будет 18,433 кГц.
Это уже кое что! но ...
3. ... частота 18,433 кГц - это как раз половина 36 кГц! То есть в расчётах вы не приняли во внимание того, что один полный период импульса 36 кГц (Т) состоит из двух половинок: "единицы" (t) и "нуля" (t).

(больше в эту тему читать тут справа в колонке "Из бесед Бибота и Бобота")

В общем ... вам нужно переделать код так, что бы были верные временные переменные.
... либо без переделки прошивки поставить кварц на 16 МГц :)

Правильность опроса TSOP-ноги и остальной алгоритм я не смотрел.
 
 Top
alex1991 Post Id



Генерал


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



понял скачал более новую версию в статье и все заработало Улыбка
и еще вопрос по программе радио управленния

#include <avr/io.h>


unsigned long int t_1 = 9990;


int main(void) /* начало основной программы */
{


DDRC = 0xff; /* все выводы порта C сконфигурировать как выходы */
DDRD = 0x00; /* все выводы порта D сконфигурировать как входы */


PORTD = 0xff; /* установить "1" на всех выводах порта D, включаем подтягивающие резисторы */


while (1) /* бесконечный цикл */
{


if( (PIND & (1<<PIND1)) && /* проверить "1" на линии 1 порта D */
(PIND & (1<<PIND2)) && /* проверить "1" на линии 2 порта D */
(PIND & (1<<PIND3)) && /* проверить "1" на линии 3 порта D */
(PIND & (1<<PIND4)) ) /* проверить "1" на линии 4 порта D */
{

t_1 = t_1 + 1;

}
else
{


if ( PIND & (1<<PIND1) ) /* проверить "1" на линии 1 порта D */
{ PORTC |= _BV(PC1); } /* установить "1" на линии 1 порта C */
else
{ PORTC &= ~_BV(PC1); } /* установить "0" на линии 1 порта C */


if ( PIND & (1<<PIND2) ) /* проверить "1" на линии 2 порта D */
{ PORTC |= _BV(PC2); } /* установить "1" на линии 2 порта C */
else
{ PORTC &= ~_BV(PC2); } /* установить "0" на линии 2 порта C */


if ( PIND & (1<<PIND3) ) /* проверить "1" на линии 3 порта D */
{ PORTC |= _BV(PC3); } /* установить "1" на линии 3 порта C */
else
{ PORTC &= ~_BV(PC3); } /* установить "0" на линии 3 порта C */


if ( PIND & (1<<PIND4) ) /* проверить "1" на линии 4 порта D */
{ PORTC |= _BV(PC4); } /* установить "1" на линии 4 порта C */
else
{ PORTC &= ~_BV(PC4); } /* установить "0" на линии 4 порта C */


t_1 = 0;

}


if( t_1 == 10000 ) /* временная задержка */
{

/* -------------- включаем моторы вперед --------------- */

PORTC |= _BV(PC1); /* установить "1" на линии 1 порта C */
PORTC &= ~_BV(PC2); /* установить "0" на линии 2 порта C */
PORTC |= _BV(PC3); /* установить "1" на линии 3 порта C */
PORTC &= ~_BV(PC4); /* установить "0" на линии 4 порта C */

/* -------------------------------- --------------------- */

t_1 = 0;

}


} /* закрывающая скобка бесконечного цикла */

} /* закрывающая скобка
эта программа работает но мне необходимо чтобы когда появлялся сигнал на PIND1 он ехал назат
я пробовал вставить вот эти строчки
// ------------------ отъезд назад ------------------
PORTC &= ~_BV(PC1); // установить "0" на линии 1 порта C
PORTC |= _BV(PC2); // установить "1" на линии 2 порта C
PORTC &= ~_BV(PC3); // установить "0" на линии 3 порта C
PORTC |= _BV(PC4); // установить "1" на линии 4 порта C
место этого
{ PORTC |= _BV(PC1); } /* установить "1" на линии 1 порта C */
но после этого нечего не работает
если я вам не надоел со своими вопросами помогите правильно вставить этот обрезок программы отъезд назад Улыбка
 
 Top
ОЛЕГ Супермодератор Post Id



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


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



nest пишет:
3. ... частота 18,433 кГц - это как раз половина 36 кГц! То есть в расчётах вы не приняли во внимание того, что один полный период импульса 36 кГц (Т) состоит из двух половинок: "единицы" (t) и "нуля" (t).

Это я считал.

Нужно
TCNT0 = 111;

Самое смешное, что когда-то у меня так и было. Потом эксперименты, копипасты...
Тем не менее, все работает. Замешательство

Nest, спасибо за внимательность! Улыбка
 
 Top
alex1991 Post Id



Генерал


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



спасибо что разобрались с моим .hex nest теперь буду знать Улыбка
 
 Top
ОЛЕГ Супермодератор Post Id



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


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



alex1991, отсутствует отъезд назад по той простой причине, что он присутствует столь мизерное время, что Вы его не замечаете.

Нужно:
CODE:
// ------------------ отъезд назад ------------------
PORTC &= ~_BV(PC1); // установить "0" на линии 1 порта C
PORTC |= _BV(PC2); // установить "1" на линии 2 порта C
PORTC &= ~_BV(PC3); // установить "0" на линии 3 порта C
PORTC |= _BV(PC4); // установить "1" на линии 4 порта C
_delay_ms(100); //время для отъезда назад


Кстати, я Вам уже говорил об этом ранее. Улыбка

Так у Вас заработала моя программа с таймером?
 
 Top
alex1991 Post Id



Генерал


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



да, заработала Улыбка все пока вроде ok и еще раз тысячу благодарностей Улыбка
и по поводы программы для радиоуправления на порт D1,D2,D3,D4 приходят сигналы с приемника радиоуправления и мне необходимо так сделать что-бы D1 к примеру назад D2 стоп D3 правая гусеница вперед левая назад D4 левая гусеница вперед правая назад
вот так Улыбка
когда нет сигнала от пульта он у меня просто едет вперед
 
 Top
ОЛЕГ Супермодератор Post Id



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


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



Тогда лучше вот так:

while(PIND & (1<<PIND1) ) /* пока присутствует "1" на линии 1 порта D */
{// ------------------ осуществляется отъезд назад ------------------
PORTC &= ~_BV(PC1); // установить "0" на линии 1 порта C
PORTC |= _BV(PC2); // установить "1" на линии 2 порта C
PORTC &= ~_BV(PC3); // установить "0" на линии 3 порта C
PORTC |= _BV(PC4); // установить "1" на линии 4 порта C}

while(радиоуправление влево)
{едем влево;}

while(радиоуправление вправо)
{едем вправо;}

едем вперед;

Смысл в том, что цикл выполняется пока есть сигнал с радиоуправления. Как только он исчез- программа побежала дальше и включила порты согласно "едем вперед". Они останутся в таком состоянии до тех пор, пока снова не выполнится какое- либо условие.
 
 Top
alex1991 Post Id



Генерал


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



спасибо))) Улыбка
 
 Top
alex1991 Post Id



Генерал


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



простите за моею надаедливость но у меня снова проблема с бампером на тсор подключил в схему кварц на 8мгц до этого он роботал от внутренего rc на 1 мгц и после этого бампер стал работать неправильно то видит припятствия то не видит и светодиод которые стоят наPB3 PB4 едва светятся когда все-же он увидел приграду перед собой а от пульта ТВ светодиоды реагирует отлично может частоту свечение у ик-светодиода нужно поменять даже не знаю что делать Грустный подскажите пожалуйста не могу разобраться вот код который я использую
#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 = 111;
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  



ОЛЕГ пишет:
Нужно
TCNT0 = 111;

А у Вас что?

CODE:
{cli();
TCNT0 = 222;
TCCR0 = 111;
TIMSK = 1;
sei();
}

Так работать не будет. TCCR0- это предделитель счетчика. Значения 111 у него даже в природе не существует. Правильное значение 1. А TCNT0 = 111.

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

if(modulation<20) //длина пачки (можно менять)
{
PORTB |= (1<<0);
PORTD |= (1<<6) ;
}

else
{
PORTB &= (~(1<<0));
PORTD &= (~(1<<6))
}

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

else
{modulation=0;}
}


А еще лучше вот так:
CODE:
SIGNAL(SIG_OVERFLOW0) //функция модуляции сигнала
{
if(modulation<20) //длина пачки (можно менять)
{
PORTB |= (1<<0);
PORTD |= (1<<6) ;
}

else
{
PORTB &= (~(1<<0));
PORTD &= (~(1<<6))
}

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

else
{modulation=0;}

TCNT0 = 0;
}


И уберите вот это, в начале основной программы, Вы меня не поняли. Вам это не нужно.
CODE:
if ( !(PIND & (1<<5)) ); /* проверить "0" на PD5 */
if ( !(PIND & (1<<7)) ); /* проверить "0" на PD7 */
 
 Top
alex1991 Post Id



Генерал


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



переделал код вот-так ,но он серавно не фурычет но на рульт также реагирует
#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 |= (1<<0);
PORTD |= (1<<6) ;
}

else
{
PORTB &= (~(1<<0));
PORTD &= (~(1<<6));
}

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



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


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



Сделайте все же как я писал:

CODE:

if(modulation<20) //длина пачки
{
PORTB ^= 0b00000001;
PORTD ^= 0b01000000;
}

else
{
PORTB &= 0b00000000;
PORTD &= 0b00000000;
}
 
 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