Страница 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 компилятор не поймет; если структурой, попробуйте еще вариант:
поскольку PIND.5 суть битовая переменная, сравнивать ее с единицей не надо (PIND.5 == 1). В вышеприведенном коде условие истинно, когда бит установлен. Если надо наоборот, пишем
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
Большое спасибо! И понятия не имел, что у каждого компилятора свой диалект.
Еще раз спасибо всем, вопросов больше нет. Тема закрыта