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

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

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

Сообщение 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;
      }
   }
} // закрывающая скобка основной программы

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

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

Сообщение stas00n »

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

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

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

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

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

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

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

Сообщение Raxus »

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

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

Сообщение stas00n »

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

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

Сообщение Raxus »

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

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

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

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

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

Сообщение Fasterpast »

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

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

Сообщение 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))
stas00n
Вымогатель припоя
Сообщения: 557
Зарегистрирован: Пн мар 23, 2009 04:03:45

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

Сообщение stas00n »

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

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

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

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

Сообщение Raxus »

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

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