Форум myROBOT.ru » Шаг за шагом » Программирование микроконтроллеров » Вопросы чайника

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

46. nest - 01 Июня, 2010 - 19:48:34 - перейти к сообщению
помоему лучше перенести или отдельной темой запостить.
47. zatmenie - 01 Июня, 2010 - 21:45:46 - перейти к сообщению
ОЛЕГ пишет:
А где вопрос? Улыбка

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

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

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

Или я что то пропустил Ухмылка
49. zatmenie - 02 Июня, 2010 - 13:04:34 - перейти к сообщению
mihail пишет:
Возможно, в данном случае больше подойдет двухцветный светодиод. Как пример такого светодиода посмотрите http://www.chip-dip.ru/product0/9000061733.aspx

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

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

С 3-мя цветами интересней будет, но если для этого будет нужна сложная программа то можно и 2-х цветный. Первоначально использовал стандартные функции задержки, а потом delay.h забыл убрать.
50. mihail - 02 Июня, 2010 - 23:55:42 - перейти к сообщению
Если большой точности не требуется, то можно сделать так

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 > какое то число )
{
выключить красный свет двухцветного светодиода
включить зеленый свет двухцветного светодиода
}


}

}


А лучше сделать через прерывание по переполнению таймера. Симпатичней будет код выглядеть Улыбка
51. zatmenie - 03 Июня, 2010 - 20:52:28 - перейти к сообщению
Не знаю, что то не получается. Пока не было части программы отвечающей за движение все работало. когда добавил её робот вроде ездит но его "настроение" не поднимается когда свечу ему в датчик.

вот что получилось. Если где то есть ошибки я не виноват т.к. в программировании мало что пока понимаю.
/*****************************************************
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;
}

}

}
52. mihail - 03 Июня, 2010 - 23:26:42 - перейти к сообщению
Может попробовать сделать так

CODE:

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


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

В чем смысл используемых задержек? Что они должны там делать, по Вашему замыслу? Может они и правда там лишние? Улыбка
53. zatmenie - 04 Июня, 2010 - 16:15:41 - перейти к сообщению
mihail пишет:
Может попробовать сделать так

CODE:

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


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

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

задержки делал что бы мотор туда сюда сильно не дёргало, но работают они там или нет я не знаю Голливудская улыбка
54. mihail - 04 Июня, 2010 - 17:18:56 - перейти к сообщению
zatmenie пишет:
Лампочка с желтого на красный меняется а вот обратно на желтый и зелёный не меняется.


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

Возможно ошибка не в программе, а в алгоритме. Для того чтобы светодиод стал зеленым, по данной программе, необходимо довольно долго и непрерывно освещать фототранзистор. Если реально совершаемые действия не соответствуют алгоритму, то надо что то менять Улыбка либо действовать иначе Улыбка либо менять алгоритм.
55. zatmenie - 04 Июня, 2010 - 17:37:54 - перейти к сообщению
mihail пишет:
Как Вы это проверяли?

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

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

unsigned long int n = 0;

int mood = 40;
56. mihail - 04 Июня, 2010 - 18:27:40 - перейти к сообщению
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
57. zatmenie - 04 Июня, 2010 - 23:08:17 - перейти к сообщению
Спасибо. Будем посмотреть и пробовать
58. zatmenie - 12 Июля, 2010 - 19:39:35 - перейти к сообщению
mihail пишет:
Если большой точности не требуется, то можно сделать так

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


Я так понял длительность такой задержки зависит от тактовой частоты. Как можно посчитать сколько сек будет задержка если я поставлю например число 87651 (тактовая частота 4,433619 МГц)
59. nest - 12 Июля, 2010 - 21:30:32 - перейти к сообщению
zatmenie, а что вам мешает использовать стандартные функции задержки ?
60. mihail - 12 Июля, 2010 - 21:41:40 - перейти к сообщению
Правильней эту задержку написать так
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);