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


 Страниц (17): « 1 2 3 [4] 5 6 7 8 9 ... » В конец    

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



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


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



помоему лучше перенести или отдельной темой запостить.
 
 Top
zatmenie Post Id



Генерал


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



ОЛЕГ пишет:
А где вопрос? Улыбка

Звиняйте. Как это сделать? желательно попроще.
nest пишет:
помоему лучше перенести или отдельной темой запостить.

да мне без ризницы.
 
 Top
mihail Post Id



Гуру


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



Возможно, в данном случае больше подойдет двухцветный светодиод. Как пример такого светодиода посмотрите http://www.chip-dip.ru/product0/9000061733.aspx

Зачем в программе #include <delay.h>, если не используются стандартные функции задержки?!

Или я что то пропустил Ухмылка
 
 Top
zatmenie Post Id



Генерал


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



mihail пишет:
Возможно, в данном случае больше подойдет двухцветный светодиод. Как пример такого светодиода посмотрите http://www.chip-dip.ru/product0/9000061733.aspx

Зачем в программе #include <delay.h>, если не используются стандартные функции задержки?!

Или я что то пропустил Ухмылка

С 3-мя цветами интересней будет, но если для этого будет нужна сложная программа то можно и 2-х цветный. Первоначально использовал стандартные функции задержки, а потом delay.h забыл убрать.
 
 Top
mihail Post Id



Гуру


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



Если большой точности не требуется, то можно сделать так

CODE:

/* много разного кода */

void main(void)
{

/* много разного кода */

unsigned long int n = 0;

int mood = 40;


while(1)
{

/* много разного кода */

n = n + 1;

if( n == 1000 ) /* изменяя число добиться желаемой задержки */
{

if( фототранзистор освещен )
{
mood = mood + 1;
}
else
{
mood = mood - 1;
}

n = 0;

}


if( mood > 99 ) { mood = 75; }
if( mood < 1 ) { mood = 25; }


if( mood < какое то число )
{
включить красный свет двухцветного светодиода
выключить зеленый свет двухцветного светодиода
}

if( mood > какое то число && mood < какое то число )
{
включить красный свет двухцветного светодиода
включить зеленый свет двухцветного светодиода
/* в теории... должен получится оранжевый или желтый :) */
}

if( mood > какое то число )
{
выключить красный свет двухцветного светодиода
включить зеленый свет двухцветного светодиода
}


}

}


А лучше сделать через прерывание по переполнению таймера. Симпатичней будет код выглядеть Улыбка
 
 Top
zatmenie Post Id



Генерал


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



Не знаю, что то не получается. Пока не было части программы отвечающей за движение все работало. когда добавил её робот вроде ездит но его "настроение" не поднимается когда свечу ему в датчик.

вот что получилось. Если где то есть ошибки я не виноват т.к. в программировании мало что пока понимаю.
/*****************************************************
Chip type : ATtiny2313
Clock frequency : 4,433619 MHz
Memory model : Tiny
External SRAM size : 0
Data Stack size : 32
*****************************************************/

#include <tiny2313.h>
#include <stdlib.h>

void wait0 (void)
{
TCNT0=0;
while (TCNT0<22) {};
}

// Возможные режимы движения
enum {STOP, F, B};
//------------------------------ -------------------------------- ----------------
// Включение комбинации моторов для движения в заданном направлении
//------------------------------ -------------------------------- ----------------
void go(unsigned char direction){

switch (direction) {
case STOP:
PORTB.0=0;
PORTB.1=0;
break;

case F:
PORTB.0=1;
PORTB.1=0;
break;

case B:
PORTB.0=0;
PORTB.1=1;
break;
}
}


void main(void)
{
unsigned long int n = 0;

int mood = 40;

// Input/Output Ports initialization
// Port A initialization
// Func2=In Func1=In Func0=In
// State2=P State1=P State0=P
PORTA=0x07;
DDRA=0x00;

// Port B initialization
// Func7=In Func6=In Func5=In Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
// State7=P State6=P State5=P State4=0 State3=0 State2=0 State1=0 State0=0
PORTB=0xE0;
DDRB=0x1F;

// Port D initialization
// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State6=P State5=P State4=P State3=P State2=P State1=P State0=P
PORTD=0x7F;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 4,330 kHz
// Mode: Normal top=FFh
// OC0A output: Disconnected
// OC0B output: Disconnected
TCCR0A=0x00;
TCCR0B=0x05;
TCNT0=0x16;
OCR0A=0x00;
OCR0B=0x00;

while(1)
{
while(PIND.0==0)
{
if(PIND.0==0) go(F);
wait0();
if(PIND.0==1) go(B);
wait0();
}

n = n + 1;
if( n == 1000 ) /* изменяя число добиться желаемой задержки */
{
if(PIND.0==0)
{
mood = mood + 1;
}
else
{
mood = mood - 1;
}
n = 0;
}

if( mood > 99 ) { mood = 75; }
if( mood < 1 ) { mood = 25; }

if( mood < 30 )
{
PORTB.2=1;
PORTB.3=0;
PORTB.4=0;
}

if( mood > 30 && mood < 60 )
{
PORTB.2=0;
PORTB.3=1;
PORTB.4=0;
}

if( mood > 60 )
{
PORTB.2=0;
PORTB.3=0;
PORTB.4=1;
}

}

}
 
 Top
mihail Post Id



Гуру


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



Может попробовать сделать так

CODE:

while(PIND.0==0)
{
if(PIND.0==0) go(F);
/* wait0(); */
if(PIND.0==1) go(B);
/* wait0(); */
}


А вдруг заработает как надо Ухмылка

В чем смысл используемых задержек? Что они должны там делать, по Вашему замыслу? Может они и правда там лишние? Улыбка
 
 Top
zatmenie Post Id



Генерал


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



mihail пишет:
Может попробовать сделать так

CODE:

while(PIND.0==0)
{
if(PIND.0==0) go(F);
/* wait0(); */
if(PIND.0==1) go(B);
/* wait0(); */
}


А вдруг заработает как надо Ухмылка

Неа все равно не то. мотор крутится. Лампочка в желтого на красный меняется а вот обратно на желтый и зелёный не меняется.
mihail пишет:
В чем смысл используемых задержек? Что они должны там делать, по Вашему замыслу? Может они и правда там лишние? Улыбка

задержки делал что бы мотор туда сюда сильно не дёргало, но работают они там или нет я не знаю Голливудская улыбка
 
 Top
mihail Post Id



Гуру


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



zatmenie пишет:
Лампочка с желтого на красный меняется а вот обратно на желтый и зелёный не меняется.


Как Вы это проверяли?

Возможно ошибка не в программе, а в алгоритме. Для того чтобы светодиод стал зеленым, по данной программе, необходимо довольно долго и непрерывно освещать фототранзистор. Если реально совершаемые действия не соответствуют алгоритму, то надо что то менять Улыбка либо действовать иначе Улыбка либо менять алгоритм.
 
 Top
zatmenie Post Id



Генерал


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



mihail пишет:
Как Вы это проверяли?

В протеусе
mihail пишет:
Возможно ошибка не в программе, а в алгоритме. Для того чтобы светодиод стал зеленым, по данной программе, необходимо довольно долго и непрерывно освещать фототранзистор. Если реально совершаемые действия не соответствуют алгоритму, то надо что то менять Улыбка либо действовать иначе Улыбка либо менять алгоритм.

Сделал вот так
if(PIND.0==0)
{
mood = mood + 5;
}
else
{
mood = mood - 1;
}
т.е. меняться с желтого на красный он будет медленно, а обратно в 5 раз быстрей. и все равно не меняется хотя кнопку (вместо фоторезистора в протеусе) держал нажатой довольно долго.
(Добавление)
Так ладно будем вникать в суть программы. что означают вот эти строчки?

unsigned long int n = 0;

int mood = 40;
 
 Top
mihail Post Id



Гуру


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



zatmenie пишет:
Так ладно будем вникать в суть программы. что означают вот эти строчки?

unsigned long int n = 0;

int mood = 40;


Этими строчками объявляются и инициируются переменные n и mood

unsigned long int от 0 до 4294967295 (занимает 4 байта)

unsigned int от 0 до 65535 (занимает 2 байта)
signed int от-32768 до 32767 (занимает 2 байта)

По умолчанию int является signed
(Добавление)
Вообще, начинать писать программу, лучше всего, после завершения работы над алгоритмом этой программы.

И вот еще
http://myrobot.ru/stepbystep/pr_introduction.php
http://myrobot.ru/stepbystep/pr_variables.php
http://myrobot.ru/stepbystep/pr_mcports.php
http://myrobot.ru/stepbystep/pr_loops.php
 
 Top
zatmenie Post Id



Генерал


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



Спасибо. Будем посмотреть и пробовать
 
 Top
zatmenie Post Id



Генерал


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



mihail пишет:
Если большой точности не требуется, то можно сделать так

if( n == 1000 ) /* изменяя число добиться желаемой задержки */


Я так понял длительность такой задержки зависит от тактовой частоты. Как можно посчитать сколько сек будет задержка если я поставлю например число 87651 (тактовая частота 4,433619 МГц)
 
 Top
nest Администратор Post Id



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


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



zatmenie, а что вам мешает использовать стандартные функции задержки ?
 
 Top
mihail Post Id



Гуру


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



Правильней эту задержку написать так
CODE:

n = n + 1;
if( n == 1000 ) /* изменяя число добиться желаемой задержки */
{
/* какие то действия */
n = 0;
}

zatmenie пишет:
Я так понял длительность такой задержки зависит от тактовой частоты.

И да и нет. Тактовая частота имеет решающее значение, но время задержки так же зависит от общего объема кода и того как программа оптимизируется компилятором (CVAVR). Время задержки определяется опытным путем (путем проведения опыта) и при изменении кода или степени оптимизации программы компилятором, время задержки тоже изменится.
(Добавление)
Еще мысли по изменению кода

Было так
CODE:

while(PIND.0==0)
{
if(PIND.0==0) go(F);
wait0();
if(PIND.0==1) go(B);
wait0();
}


Попробовать сделать так
CODE:

wait0();
if(PIND.0==0) go(F);
else go(B);
 
 Top
Страниц (17): « 1 2 3 [4] 5 6 7 8 9 ... » В конец
« Программирование микроконтроллеров »


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





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