Форум myROBOT.ru » Шаг за шагом » Программирование микроконтроллеров » Как правильно написать?

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

31. ОЛЕГ - 08 Марта, 2010 - 17:38:24 - перейти к сообщению
Вы вообще читаете, что Вам пишут? Злость
(Добавление)
Сконфигурируйте порты вот так:

ОЛЕГ пишет:
ОЛЕГ пишет:
Например:
DDRC = 0b11111101; //порт С- выход, но пин1 порта С- вход с оптопары
PORTC = 0b00000000; //установить на всех выходах логический 0

DDRD = 0b11111111; //порт D- целиком выход
PORTD = 0b00000000;//установить на всех выходах логический 0


(Добавление)
Вот это
CODE:
if (!(PINC & (1<<PINC1)))

проверяет 0 на С1. А Вам нужно проверять единицу, вот так:
CODE:
if (PINC & (1<<PINC1))


Если Вы хотите, чтобы светодиоды горели все время, пока оптопара выдает 1, Вам нужно написать так, как я писал еще на первой странице:
CODE:
while(PINC & (1<<PINC1))


Все уже было написано для Вас.
32. akustik - 08 Марта, 2010 - 19:48:40 - перейти к сообщению
Добрый вечер!
подскажите пожайлуста такой синтаксес являеться правильным?
так как компилятор выдает синтаксическую ошибку на фигурные скобки...

#define WAIT_i2c if(TWCR & (1<<TWINT))
{цикл
}

спасибо!
33. nest - 08 Марта, 2010 - 19:58:02 - перейти к сообщению
akustik, кирилицу нельзя.
34. redcat - 08 Марта, 2010 - 19:59:55 - перейти к сообщению
Скобки уже находятся вне определения подстановки. И зачем вообще нужна подстановка?
Пишите просто в нужном месте программы -

if ( TWCR & ( 1<<TWINT ))
{
//Цикл
}

Не нужно этого определения - #define WAIT_i2c ......
или ставите обе скобки в одной строке. Типа -
#define WAIT_i2c if(TWCR & (1<<TWINT)){ код; код; }
35. akustik - 08 Марта, 2010 - 20:20:49 - перейти к сообщению
спасибо!

необходимо контролировать флаг TWINT , и принимать решение что делать при установке его или сбросе....
Вы правы лутьше это сдель в другом месте программы.

не подскажите возможно выйти как-то из цикла while(!(PINC & (1<<PINC1))) если у меня установлен 0, или этот цикл будет круться пока не установится 1 на PINC?
(Добавление)
nest пишет:
akustik, кирилицу нельзя.


Да вроде кирилица стоит
36. redcat - 08 Марта, 2010 - 20:23:33 - перейти к сообщению
Пока на PINC1 - 0 Цикл будет продолжаться.
37. beam - 08 Марта, 2010 - 21:55:55 - перейти к сообщению
ОЛЕГ while(PINC & (1<<PINC1)) это сразу после While писать или While вобще ненада?
38. ОЛЕГ - 08 Марта, 2010 - 22:58:25 - перейти к сообщению
ОЛЕГ пишет:
CODE:

Бла-бла-бла, подключаем библиотеки.

int main(void)
{
Бла-бла-бла, конфигурируем порты.

while(1)
{

while(проверяем 1 на С1)
{светодиоды горят;}

светодиоды не горят;
}
}

39. nest - 08 Марта, 2010 - 23:27:12 - перейти к сообщению
beam, while переводится с английского "пока".
так что получается:
пока (условие)
{
действие
}


так все операторы можно перевести напрямую и понять смысл и немного синтаксис.
40. beam - 09 Марта, 2010 - 18:52:34 - перейти к сообщению
все...получилось...вам большое спасибо...)
41. redcat - 09 Марта, 2010 - 20:30:48 - перейти к сообщению
beam - Может всё-же стоит какуюнить книгу по программированию почитать?
42. Ulman - 09 Марта, 2010 - 21:44:16 - перейти к сообщению
Хмм... критикуйте... Ламер

Робот должен аццко по умному искать свет. Всего на борту три фотоэлемента и два бампера. один фотоэлемент находится около баттареи от которой робот заряжается.
Ухмылка (это типо зверская улыбочка такая...)

Кстати программа непроверенна - как накатал сразу вывесил Улыбка
CODE:
include <avr/io.h>


void delay(unsigned short ms)
{
unsigned short i, j, k, s;

for (i=0; i<ms; i++)
for (j=0; j<185; j++)
k++;
}

void forward()
{
PORTC |= _BV(PC1);
PORTC |= _BV(PC0);
}

void left()
{
PORTC |= _BV(PC1);
PORTC &= ~_BV(PC0);
}

void right()
{
PORTC |= _BV(PC0);
PORTC &= ~_BV(PC1);
}

void stop()
{
PORTC &= ~_BV(PC1);
PORTC &= ~_BV(PC0);
}

int solar() //здесь и далее если bool выдает ошибку. Почему?
{
stop();
while (PINB & (1<<PINB1)) // если = 1 стоять
{}
}

int leftsolar()
{
if (PINC & (1<<PINC5)) //если левый = 1 делать правым пока правый = 0
{
right();
while (!(PINC & (1<<PINC4)))
{}
stop();
}
}

int rightsolar()
{
if (PINC & (1<<PINC4)) //аналогично но наоборот
{
left();
while (!(PINC & (1<<PINC5)))
{}
stop();
}
}

int leftbumper()
{
if (!(PINC & (1<<PINC3))) //если левый бампер зажат ( у меня стоят NC ) делать левым пока зажат
{
left();
while (!(PINC & (1<<PINC3)))
{}
stop();
}
}

int rightbumper()
{
if (!(PINC & (1<<PINC2))) //аналогично но наоборот =)

{
right();
while (!(PINC & (1<<PINC2)))
{}
stop();
}
}

int main(void)
{

DDRС = 0x1f;
DDRB = 0xff;
while (1)
{

while (((PINC & _BV(PINC5))) & ((PINC & _BV(PINC4)))) //пока на обоих фотосенсорах 1 двигаться вперед
{
forward();
}
//ну тут я подумал: а если нет 1? то пусть фигарит покругу =)
Solar();
leftsolar();
rightsolar();
leftbumper();
rightbumper();

{
stop();
left(); //посмотреть свет слева...
delay (1000);
right(); //справа...
delay (2000);
forward(); //и если нету... двигать вперед. в итоге получится что он будет каждый раз поворачивать на определенный градус, засчет этого будет происходить движение по кругу
delay (10000);
}
}
}
43. nest - 09 Марта, 2010 - 21:48:18 - перейти к сообщению
Ulman, так делать в прерываниях нельзя, точнее это плохой тон. В прерывание нужно быстро зайти и быстро выйти, а не сидеть там пока что нибудь не нажмётся.
44. Ulman - 09 Марта, 2010 - 22:15:57 - перейти к сообщению
эмм процитируй тот кусок про что ты говоришь, пожалуйста, а то я не очень понял
45. nest - 09 Марта, 2010 - 22:22:25 - перейти к сообщению
int leftbumper() - я почему то подумал, что это прерывание :)