Страница 1 из 1

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

Добавлено: Ср янв 26, 2011 21:40:00
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;
	   }
   }
} // закрывающая скобка основной программы
Если не правильно делаю, то как правильно?

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

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

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

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

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

if (!PIND.5){
//...
}

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

Добавлено: Ср янв 26, 2011 22:58:30
Raxus
Понял, а прописано должно быть в io.h ?

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

Добавлено: Ср янв 26, 2011 23:01:28
stas00n
при чем тут io? В хидере вашего контроллера, типа mega8.h или какой там у вас... Компилятор-то какой у Вас?

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

Добавлено: Ср янв 26, 2011 23:10:48
Raxus
Win AVR стоит

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

Добавлено: Чт янв 27, 2011 01:07:18
>TEHb<
А он разве понимает? CVAVR так точно умеет. В противном случае можно написать "(PIND>>5)&1"

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

Добавлено: Чт янв 27, 2011 01:12:48
Fasterpast
Не-не, всякие извращения типа PIND.3 - это тока в CVAVR =) Чтобы на другом компиле работало, нужно макросы писать... (или переписывать всё как сказали выше).
Да и то я смотрю в новой версии CVAVR они уже от таких выражений отходят потихоньку применяя отдельный хидер с битовыми операциями...

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

Добавлено: Чт янв 27, 2011 02:57:07
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))

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

Добавлено: Чт янв 27, 2011 03:36:21
stas00n
Raxus, вот вам несколько вариантов - все генерят один и тот же код, выбирайте какой больше по душе.

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

if (PIND>>5 & 1){}
if (PIND & 1<<5){}
if (PIND & 0b00100000){}
if (PIND & 0x20){}
if (PIND & 1<<PIND5){}

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

Добавлено: Пт янв 28, 2011 14:03:50
Raxus
Большое спасибо! И понятия не имел, что у каждого компилятора свой диалект.
Еще раз спасибо всем, вопросов больше нет. Тема закрыта