Перейти к содержанию
    

Хитрая склейка лексем на Си

Приветствую всех!

Пытаюсь реализовать вот что:

/* линия 0 */
#define _PORT0  B	//определение буквы порта микроконтроллера
#define _PINN0  2	//определение номера бита порта

/* линия 1 */
#define _PORT1  C
#define _PIN1   3

/* линия 2 */
#define _PORT2  D
#define _PIN2   4

/* макрос склейки лексем */
#define _concatuate(a,b )      (a##b )
#define con(a,b )              _concatuate(a,b )

#define _PORTCHAR(line)       con(_PORT,line)		//здесь я ожидаю получить букву порта, в зависимости от номера линии. т.е. если указываю line = 0, то на выходе получаю B

#define _PORT(line)        con(PORT,_PORTCHAR(line))	//здесь ожидаю получить лексему вида "PORTx", где х - буква порта, полученная в предыдущем пункте.
#define _DDR(line)         (DDR##_PORTCHAR(line))	//здесь аналогично _PORT(line)
#define _PIN(line)         (PIN##_PORTCHAR(line))	//здесь аналогично _PORT(line)

#define _PINNUMBER(line)  (_PIN##line)		//здесь я ожидаю получить номер бита порта в зависимости от значения line. т.е. если line = 0, то на выходе получаю 2.
#define _PINN(line)       (1<<_PINNUMBER(line))	// здесь уже получаю маску этого бита.

при попытке использовать _PORT() - выдает ошибку

"Warning[Pe223]: function "PORT" declared implicitly D:\PRJ\MCU\AVR Projects\....

Error[Pe137]: expression must be a modifiable lvalue D:\PRJ\MCU\AVR Projects\... "

Гуру, подскажите что я делаю не так. Спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

это вечный лисапед !

 

возьмите готовое

http://electronix.ru/forum/index.php?showt...t&p=1216345

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

:rolleyes: действительно!))) спасибо! Причем я точно помню, что эти макросы я видел, пытался применить, но почему то решил, что они не совсем подходят. :smile3046:

Сейчас вижу, что я тогда тупанул! :biggrin:

 

ЗЫ Поторопился с выводами

вот код:

#define __AVR__
#include "pin_macros.h"
#include <ioavr.h>

#define __SEPARATELY

#define Line0  B,2,H
#define Line1  B,3,H
#define Line2  B,4,H
#define Line3  B,5,H

#define SetLine(line)      do{DRIVER(line,INPUT);  SET(line);           }while(0)   /* input with pullup */
#define ClrLine(line)      do{CLR(line);           DRIVER(line,OUTPUT); }while(0)   /* output with log "0" */

void test(void){
#if __SEPARATELY
   SET(Line0);
   CLR(Line0);
   DRIVER(Line0,INPUT);
   DRIVER(Line0,OUTPUT);
#else
   SetLine(Line0);
   ClrLine(Line1);
#endif
}

В таком виде работает (правда с допиливанием двух макросов PIN_ON_H и PIN_ON_L в файле AVR_pin_macros.h). Но если использовать мои макросы SetLine и ClrLine, состоящие из двух макросов Волкова, то компилятор опять выдает ошибки.

Error[Pe055]: too many arguments in macro invocation ... 23

Error[Pe054]: too few arguments in macro invocation .... 23

Warning[Pe223]: function "PIN_SET_" declared implicitly ... 23

Error[Pe020]: identifier "B" is undefined ... 23

Error[Pe020]: identifier "INPUT" is undefined .... 23

Error[Pe054]: too few arguments in macro invocation ... 23

....

Никак нельзя это обойти?

 

PPS. Вбил свои макросы SetLine ClrLine без макросов Волкова, но по образу и подобию

#define Line0  B,2
#define Line1  B,3
#define Line2  B,4
#define Line3  B,5

#define _SetLine(port,bit)    do{DDR##port   &= ~(1<<bit);  PORT##port  |= (1<<bit); }while(0)  /* input with pullup */
#define _ClrLine(port,bit)    do{PORT##port  &= ~(1<<bit);  DDR##port   |= (1<<bit); }while(0)  /* output with log "0" */
#define SetLine(line) _SetLine(line)
#define ClrLine(line) _ClrLine(line)

Изменено пользователем ibiza11

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...