Технический форум по робототехнике.
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. Видимо, что-то неправильно оформлено. Но что?
boez » 16 май 2011, 17:19
Что-то перед этой строчкой. К примеру классическая ошибка - точку с запятой зевнул. А вообще телепатию облегчает конкретный текст ошибки.
figley.migley » 16 май 2011, 17:40
вместо & надо &&
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
galex1981 » 17 май 2011, 09:14
Вы могли бы выложить либо содержимое файла полностью или прикрепить файл потому как по куску кода я точно не смогу найти эти строки а то может быть и библиотека какая нибудь не подключена
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 раз.
Michael_K » 18 май 2011, 01:19
Ищите в хеадерах, как объявлено PIND.4 наверняка эта конструкция на чтение не работает. А может и вообще не работает, вы откуда такое срисовали? Что за компилятор? И это... код в теги уберите
Dorry » 19 май 2011, 00:20
"Конструкция не работает на чтение". Что это значит? Надо что-то объявить?
Взял отсюда. В конце страницы есть примеры с IF:
http://www.123avr.com/05a.htm Компилятор WinAVR.
Убрал в теги
Michael_K » 19 май 2011, 01:12
Меньше читайте всякой ерунды. То что там описано не имеет к Си никакого отношения. Фокусы типа #asm("") или PINB.2 - это выкрутасы специфичные для компилятора.
Конкретно на той страничке описан компилятор CodeVisionAVR - наверное в нем это бы сработало.
Напишите по-человечески - на СТАНДАРТНОМ СИ, который все понимают:
(PINB & 0x04)
и не парьте мозг себе и окружающим
Книжки надо читать и документацию от производителя, а не форумы и сомнительные бложики.
=DeaD= » 19 май 2011, 08:53
Вот не надо флейм разводить на ровном месте!
dccharacter » 19 май 2011, 14:10
Michael_K писал(а): Напишите по-человечески - на СТАНДАРТНОМ СИ, который все понимают:
(PINB & 0x04)
и не парьте мозг себе и окружающим
Я что-то не нашел в спецификации Си ни оператора ни зарезервированного слова PINB. Плохо искал?
Michael_K » 19 май 2011, 14:27
В _спецификации_ Си также нет слова printf() Потому что это не ключевое слово языка, а библиотечная функция. Точно такая же, как и любая другая. Ровно то же самое касается и PINB - оно определено дефайном в хеадере и к языку не имеет никакого отношения. А вот определить констукцию типа #asm или PINB.4 в стандартном Си невозможно. Это синтаксически неверно.
dccharacter » 19 май 2011, 14:51
я правильно понимаю, что можно сделать структуру, но поле в ней назвать "2" - нельзя?
=DeaD= » 19 май 2011, 15:04
2dccharacter: Как вариант - просто попробуйте написать, какая конструкция в стандартном Си даёт такую же штуку, как "PINC.4" в CvAVR. И всё будет ясно - либо у вас это не получилось и это уже не стандартный Си, либо у вас всё получилось и ваша конструкция есть доказательство вашей правоты.
Michael_K » 19 май 2011, 15:40
dccharacter писал(а): я правильно понимаю, что можно сделать структуру, но поле в ней назвать "2" - нельзя?
Да, можно сделать структуру и, по-моему, даже упаковка битовых полей прописана в стандарте, начиная со С99, но поле нельзя назвать цифрой.