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. Видимо, что-то неправильно оформлено. Но что?
Dorry
 
Сообщения: 17
Зарегистрирован: 11 апр 2011, 12:53
Откуда: Брянск
прог. языки: basic, С
ФИО: Алексей Смирнов

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

Сообщение boez » 16 май 2011, 17:19

Что-то перед этой строчкой. К примеру классическая ошибка - точку с запятой зевнул. А вообще телепатию облегчает конкретный текст ошибки.
boez
 
Сообщения: 1981
Зарегистрирован: 27 авг 2008, 10:45
Откуда: Харьков
прог. языки: С/С++

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

Сообщение figley.migley » 16 май 2011, 17:40

вместо & надо &&
figley.migley
 
Сообщения: 27
Зарегистрирован: 17 фев 2010, 11:39
Откуда: Киев
прог. языки: PHP
ФИО: Сергей

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
Dorry
 
Сообщения: 17
Зарегистрирован: 11 апр 2011, 12:53
Откуда: Брянск
прог. языки: basic, С
ФИО: Алексей Смирнов

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

Сообщение galex1981 » 17 май 2011, 09:14

Вы могли бы выложить либо содержимое файла полностью или прикрепить файл потому как по куску кода я точно не смогу найти эти строки а то может быть и библиотека какая нибудь не подключена
if(!Operate) Read(pDatasheet);
Аватара пользователя
galex1981
 
Сообщения: 4363
Зарегистрирован: 04 дек 2008, 22:44
Откуда: Камышин
Skype: galk-aleksandr1
прог. языки: Kotlin, Java, C, C++, Assm, BasCom, VB, php
ФИО: Галкин Александр Владимирович

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 раз.
Dorry
 
Сообщения: 17
Зарегистрирован: 11 апр 2011, 12:53
Откуда: Брянск
прог. языки: basic, С
ФИО: Алексей Смирнов

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

Сообщение Michael_K » 18 май 2011, 01:19

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

И это... код в теги уберите
Аватара пользователя
Michael_K
 
Сообщения: 6028
Зарегистрирован: 07 окт 2009, 00:29
Откуда: СПб

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

Сообщение Dorry » 19 май 2011, 00:20

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

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

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

Убрал в теги :)
Dorry
 
Сообщения: 17
Зарегистрирован: 11 апр 2011, 12:53
Откуда: Брянск
прог. языки: basic, С
ФИО: Алексей Смирнов

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

Сообщение Michael_K » 19 май 2011, 01:12

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

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

Книжки надо читать и документацию от производителя, а не форумы и сомнительные бложики. :wink:
Аватара пользователя
Michael_K
 
Сообщения: 6028
Зарегистрирован: 07 окт 2009, 00:29
Откуда: СПб

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

Сообщение =DeaD= » 19 май 2011, 08:53

Вот не надо флейм разводить на ровном месте!
Проект [[Open Robotics]] - Универсальные модули для построения роботов
Аватара пользователя
=DeaD=
 
Сообщения: 24218
Зарегистрирован: 06 окт 2004, 18:01
Откуда: Ебург
прог. языки: C++ / PHP / 1C
ФИО: Антон Ботов

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

Сообщение dccharacter » 19 май 2011, 14:10

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

Я что-то не нашел в спецификации Си ни оператора ни зарезервированного слова PINB. Плохо искал?
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

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

Сообщение Michael_K » 19 май 2011, 14:27

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

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

А вот определить констукцию типа #asm или PINB.4 в стандартном Си невозможно.
Это синтаксически неверно.
Аватара пользователя
Michael_K
 
Сообщения: 6028
Зарегистрирован: 07 окт 2009, 00:29
Откуда: СПб

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

Сообщение dccharacter » 19 май 2011, 14:51

я правильно понимаю, что можно сделать структуру, но поле в ней назвать "2" - нельзя?
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

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

Сообщение =DeaD= » 19 май 2011, 15:04

2dccharacter: Как вариант - просто попробуйте написать, какая конструкция в стандартном Си даёт такую же штуку, как "PINC.4" в CvAVR. И всё будет ясно - либо у вас это не получилось и это уже не стандартный Си, либо у вас всё получилось и ваша конструкция есть доказательство вашей правоты.
Проект [[Open Robotics]] - Универсальные модули для построения роботов
Аватара пользователя
=DeaD=
 
Сообщения: 24218
Зарегистрирован: 06 окт 2004, 18:01
Откуда: Ебург
прог. языки: C++ / PHP / 1C
ФИО: Антон Ботов

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

Сообщение Michael_K » 19 май 2011, 15:40

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

Да, можно сделать структуру и, по-моему, даже упаковка битовых полей прописана в стандарте, начиная со С99, но поле нельзя назвать цифрой.
Аватара пользователя
Michael_K
 
Сообщения: 6028
Зарегистрирован: 07 окт 2009, 00:29
Откуда: СПб

Пред.След.

Вернуться в Роботы-пылесосы

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3