Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Макросы в C
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
amost
что-то запутался я со вложенными макросами. например есть макрос

Код
#define M_SCAN_INPUT(port, pin, pos, loc)    \
            loc |= ( ((port >> pin) & 0x01) << pos)

теперь хочу значения port, pin, pos спрятать еще в один дефайн :

Код
#define INPUT1    PORTD,2,0

что-бы в конечном итоге вызвать макрос таким образом :

Код
M_SCAN_INPUT(INPUT1, pin_state_cur);

как по мне то должно работать. выдает эррор несоответствия количества аргументов при вызове макроса.
demiurg_spb
Вам нужнен ещё один промежуточный макрос. Как то так:
Код
#define _PIN_SET(X,N)   do {PORT##X |= (1<<(N));} while (0)
#define _PIN_CLR(X,N)   do {PORT##X &= ~(1<<(N));} while (0)
#define _PIN_TEST(X,N)  (PORT##X & (1<<(N)))

#define PIN_SET(PIN)   _PIN_SET(PIN)
#define PIN_CLR(PIN)   _PIN_CLR(PIN)
#define PIN_TEST(PIN)  _PIN_TEST(PIN)
Используем:
Код
#define DF_CS   B,4
#define DF_READY   C,0

if (PIN_TEST(DF_READY))
{
    PIN_CLR(DF_CS);
    ...
}


http://electronix.ru/forum/lofiversion/index.php/t71157.html
amost
спасибо. сделал так :
Код
#define INPUT1    PORTD,2,0
#define INPUT2    PORTD,3,1
#define INPUT3    PORTD,4,2
#define INPUT4    PORTD,5,3

#define _M_SCAN_INPUT(port, pin, pos, loc)    \
        loc |= ( ((port >> pin) & 0x01) << pos)

#define M_SCAN_INPUT(INPUT, loc) _M_SCAN_INPUT(INPUT, loc)

вызываю
Код
M_SCAN_INPUT(INPUT1, pin_state_cur);
M_SCAN_INPUT(INPUT2, pin_state_cur);
M_SCAN_INPUT(INPUT3, pin_state_cur);
M_SCAN_INPUT(INPUT4, pin_state_cur);
demiurg_spb
Нашёл ошибку в своём примере. Надо было так:
Код
#define _PIN_TEST(X,N)  (PIN##X & (1<<(N)))
У Вас тоже ошибка. Надо читать регистр порта PINX а не PORTX.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.