Помогите с кодом, в строке PIND.5==1 выдает ошибку

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Родился
Сообщения: 9
Зарегистрирован: Пн янв 24, 2011 20:48:06

Сообщение Raxus »

Только взялся изучать микроконтроллеры, и застрял. Необходимо считать состояние определенной ноги на порту D, но при компиляции выдает ошибку "error: expected ')' before numeric constant". Может кто-то сможет помочь?

Код: Выделить всё

#define F_CPU 1000000UL  // указываем частоту в герцах
   #include <avr/io.h>

int main(void) // начало основной программы
{  
   DDRD = 0x00; // все выводы порта D сконфигурировать как входы
   DDRB = 0xff; // все выводы порта B сконфигурировать как выходы   
   while(1)
   {
	   if (PIND.5==1) // вот тут выдает ошибку expected ')' before numeric constant
	   { 
		 PORTB = 0b00000111;
	   }
	   else 
	   {
		 PORTB = 0b00000100;
	   }
   }
} // закрывающая скобка основной программы
Если не правильно делаю, то как правильно?
Реклама
Вымогатель припоя
Сообщения: 557
Зарегистрирован: Пн мар 23, 2009 04:03:45

Сообщение stas00n »

А регистр PIND в .h файле у Вас структурой описан? Если нет, то запись PIND.5 компилятор не поймет; если структурой, попробуйте еще вариант:

Код: Выделить всё

if (PIND.5){
//...
}
поскольку PIND.5 суть битовая переменная, сравнивать ее с единицей не надо (PIND.5 == 1). В вышеприведенном коде условие истинно, когда бит установлен. Если надо наоборот, пишем

Код: Выделить всё

if (!PIND.5){
//...
}
Реклама
Родился
Сообщения: 9
Зарегистрирован: Пн янв 24, 2011 20:48:06

Сообщение Raxus »

Понял, а прописано должно быть в io.h ?
Вымогатель припоя
Сообщения: 557
Зарегистрирован: Пн мар 23, 2009 04:03:45

Сообщение stas00n »

при чем тут io? В хидере вашего контроллера, типа mega8.h или какой там у вас... Компилятор-то какой у Вас?
Реклама
Эиком - электронные компоненты и радиодетали
Родился
Сообщения: 9
Зарегистрирован: Пн янв 24, 2011 20:48:06

Сообщение Raxus »

Win AVR стоит
Реклама
Друг Кота
Аватара пользователя
Сообщения: 5800
Зарегистрирован: Ср ноя 11, 2009 17:19:30
Откуда: Воронеж

Сообщение >TEHb< »

А он разве понимает? CVAVR так точно умеет. В противном случае можно написать "(PIND>>5)&1"
Усложнять просто. Упрощать сложно.
Контактная информация:
Реклама
Мучитель микросхем
Аватара пользователя
Сообщения: 493
Зарегистрирован: Ср фев 14, 2007 12:07:58
Откуда: Москва

Сообщение Fasterpast »

Не-не, всякие извращения типа PIND.3 - это тока в CVAVR =) Чтобы на другом компиле работало, нужно макросы писать... (или переписывать всё как сказали выше).
Да и то я смотрю в новой версии CVAVR они уже от таких выражений отходят потихоньку применяя отдельный хидер с битовыми операциями...
Контактная информация:
Встал на лапы
Сообщения: 125
Зарегистрирован: Вс мар 01, 2009 20:41:19

Сообщение xVekx »

Код: Выделить всё

#define BIT(B)                  (1<<B)// преобр. номера бита в позицию в байте
#define TSTBIT0(ADDRESS,B)      (!(ADDRESS & (BIT(B))))// проверка бита на ноль
#define TSTBIT1(ADDRESS,B)      (ADDRESS & (BIT(B)))// проверка бита на единицу
#define SETBIT(ADDRESS,B)       (ADDRESS |= BIT(B))// установка бита
#define CLRBIT(ADDRESS,B)       (ADDRESS&=~BIT(B))// сброс бита
#define SETMASK(ADDRESS,BYTE)   (ADDRESS |= BYTE)// установка битов по байтовой маске
#define CLRMASK(ADDRESS,BYTE)   (ADDRESS &= ~(BYTE))// очистка битов по байтовой маске
//if (TSTBIT1(PIND,5))
Вымогатель припоя
Сообщения: 557
Зарегистрирован: Пн мар 23, 2009 04:03:45

Сообщение stas00n »

Raxus, вот вам несколько вариантов - все генерят один и тот же код, выбирайте какой больше по душе.

Код: Выделить всё

if (PIND>>5 & 1){}
if (PIND & 1<<5){}
if (PIND & 0b00100000){}
if (PIND & 0x20){}
if (PIND & 1<<PIND5){}
Родился
Сообщения: 9
Зарегистрирован: Пн янв 24, 2011 20:48:06

Сообщение Raxus »

Большое спасибо! И понятия не имел, что у каждого компилятора свой диалект.
Еще раз спасибо всем, вопросов больше нет. Тема закрыта
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»