roboforum.ru

Технический форум по робототехнике.

Пришло время убирать !!!

Re: Пришло время убирать !!!

Dorry » 16 май 2011, 16:58

Нужна помощь по Си!!!

Не могу разобраться, как написать программу отъезда пылесоса от препятствия. Точнее, как работает оператор IF.

Датчики подсоединены к портам PD4 и PD3.

Кусок кода:

// если удар на всех бамперах. Т.е. и левом, и правом

if ((PIND.4)&(PIND.3)) { // Если лог. "1" на обоих портах PD4 и PD3

PORTC &= ~_BV(PC0); // Остановить ход!!!

_delay_ms(4000); // Ждем 4 сек.

PORTC |= _BV(PC0); // Включаем ход!
PORTC |= _BV(PC1); // назад реле левого двигателя
PORTC |= _BV(PC2); // назад реле правого двигателя

for (int i = 0; i < 1; i++)
{
_delay_ms(4000); // Робот отъезжает
}

// уходим влево
PORTC |= _BV(PC0); // лог "1" hod
PORTC |= _BV(PC1); // лог "1" lev
PORTC &= ~_BV(PC2); // лог "0" prav

}

И так далее...
Компилятору не нравится строчка с оператором IF. Видимо, что-то неправильно оформлено. Но что?

Re: Пришло время убирать !!!

boez » 16 май 2011, 17:19

Что-то перед этой строчкой. К примеру классическая ошибка - точку с запятой зевнул. А вообще телепатию облегчает конкретный текст ошибки.

Re: Пришло время убирать !!!

figley.migley » 16 май 2011, 17:40

вместо & надо &&

Re: Пришло время убирать !!!

Dorry » 17 май 2011, 09:04

Прошу прощения. Ошибка такая:

kirbi.c: In function 'main':
kirbi.c:19: error: expected ')' before numeric constant
kirbi.c:19: error: expected ')' before numeric constant
kirbi.c:45: error: expected ')' before numeric constant
kirbi.c:71: error: expected ')' before numeric constant

figley.migley: Поставил &&, но не помогло ((

Добавлено спустя 2 минуты 24 секунды:
Ошибка в строках 19, 45, 71. Это как раз строчка с IF

Re: Пришло время убирать !!!

galex1981 » 17 май 2011, 09:14

Вы могли бы выложить либо содержимое файла полностью или прикрепить файл потому как по куску кода я точно не смогу найти эти строки а то может быть и библиотека какая нибудь не подключена

Re: Пришло время убирать !!!

Dorry » 18 май 2011, 00:24

Вот код целиком. Но в том-то и дело, что ничего особенного в нем нет :)
Пояснение - для управления двигателями использую три выхода атмеги. Логическая единица на PC0 включает реле хода. PC1 и PC2 управляют реле разворота - левого и правого двигателя. При логическом нуле двигатели работают "вперед". При единице - разворачиваются назад.

Код: Выделить всёРазвернуть
#define F_CPU 1000000UL  // 1 MHz
#include <avr/io.h>
#include <util/delay.h>

char x;

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

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

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

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


// если удар на всех бамперах

if ((PIND.4)&&(PIND.3)) {

PORTC &= ~_BV(PC0); // hod stop!!!

_delay_ms(4000);   // Ждем 4 сек.

PORTC |= _BV(PC0); // hod!
PORTC |= _BV(PC1); // nazad leviy
PORTC |= _BV(PC2); // nazad praviy

           for (int i = 0; i < 1; i++)
           {
           _delay_ms(4000);   // Ждем 4 сек.
           }

// uhod vlevo
PORTC |= _BV(PC0); //  1 hod
PORTC |= _BV(PC1); //  1 lev
PORTC &= ~_BV(PC2); // 0 prav

}



// если удар на левом бампере

if (PIND.4) {

PORTC &= ~_BV(PC0); // hod stop!!!

_delay_ms(4000);   // Ждем .

PORTC |= _BV(PC0); // hod!
PORTC |= _BV(PC1); // nazad leviy
PORTC |= _BV(PC2); // nazad praviy

           for (int i = 0; i < 1; i++)
           {
           _delay_ms(4000);   // Ждем 4 сек.
           }


// уход вправо

PORTC |= _BV(PC0); //   1 на ход
PORTC &= ~_BV(PC1); //  0 на лево
PORTC |= _BV(PC2); //   1 на право

}

// если удар на правом бампере

if (PIND.3) {

PORTC &= ~_BV(PC0); // hod stop!!!

_delay_ms(4000);   // Ждем .

PORTC |= _BV(PC0); // hod!
PORTC |= _BV(PC1); // nazad leviy
PORTC |= _BV(PC2); // nazad praviy

           for (int i = 0; i < 1; i++)
           {
           _delay_ms(4000);   // Ждем 4 сек.
           }


// уход влево

PORTC |= _BV(PC0); //  1 hod
PORTC |= _BV(PC1); //  1 lev
PORTC &= ~_BV(PC2); // 0 pra

}

// если бамперы не включены, то едем вперед

PORTC |= _BV(PC0); //    1 на ход
PORTC &= ~_BV(PC1); //   0 на лево
PORTC &= ~_BV(PC2); //   0 на право

}
}
Последний раз редактировалось Dorry 19 май 2011, 00:21, всего редактировалось 1 раз.

Re: Пришло время убирать !!!

Michael_K » 18 май 2011, 01:19

Ищите в хеадерах, как объявлено PIND.4
наверняка эта конструкция на чтение не работает.
А может и вообще не работает, вы откуда такое срисовали?
Что за компилятор?

И это... код в теги уберите

Re: Пришло время убирать !!!

Dorry » 19 май 2011, 00:20

"Конструкция не работает на чтение". Что это значит? Надо что-то объявить?

Взял отсюда. В конце страницы есть примеры с IF:
http://www.123avr.com/05a.htm

Компилятор WinAVR.

Убрал в теги :)

Re: Пришло время убирать !!!

Michael_K » 19 май 2011, 01:12

Меньше читайте всякой ерунды. То что там описано не имеет к Си никакого отношения. Фокусы типа #asm("") или PINB.2 - это выкрутасы специфичные для компилятора.
Конкретно на той страничке описан компилятор CodeVisionAVR - наверное в нем это бы сработало.

Напишите по-человечески - на СТАНДАРТНОМ СИ, который все понимают:
(PINB & 0x04)
и не парьте мозг себе и окружающим :)

Книжки надо читать и документацию от производителя, а не форумы и сомнительные бложики. :wink:

Re: Пришло время убирать !!!

=DeaD= » 19 май 2011, 08:53

Вот не надо флейм разводить на ровном месте!

Re: Пришло время убирать !!!

dccharacter » 19 май 2011, 14:10

Michael_K писал(а):Напишите по-человечески - на СТАНДАРТНОМ СИ, который все понимают:
(PINB & 0x04)
и не парьте мозг себе и окружающим :)

Я что-то не нашел в спецификации Си ни оператора ни зарезервированного слова PINB. Плохо искал?

Re: Пришло время убирать !!!

Michael_K » 19 май 2011, 14:27

В _спецификации_ Си также нет слова printf()
Потому что это не ключевое слово языка, а библиотечная функция.
Точно такая же, как и любая другая.

Ровно то же самое касается и PINB - оно определено дефайном в хеадере
и к языку не имеет никакого отношения.

А вот определить констукцию типа #asm или PINB.4 в стандартном Си невозможно.
Это синтаксически неверно.

Re: Пришло время убирать !!!

dccharacter » 19 май 2011, 14:51

я правильно понимаю, что можно сделать структуру, но поле в ней назвать "2" - нельзя?

Re: Пришло время убирать !!!

=DeaD= » 19 май 2011, 15:04

2dccharacter: Как вариант - просто попробуйте написать, какая конструкция в стандартном Си даёт такую же штуку, как "PINC.4" в CvAVR. И всё будет ясно - либо у вас это не получилось и это уже не стандартный Си, либо у вас всё получилось и ваша конструкция есть доказательство вашей правоты.

Re: Пришло время убирать !!!

Michael_K » 19 май 2011, 15:40

dccharacter писал(а):я правильно понимаю, что можно сделать структуру, но поле в ней назвать "2" - нельзя?

Да, можно сделать структуру и, по-моему, даже упаковка битовых полей прописана в стандарте, начиная со С99, но поле нельзя назвать цифрой.


Rambler\'s Top100 Mail.ru counter