Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Хитрая склейка лексем на Си
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
ibiza11
Приветствую всех!
Пытаюсь реализовать вот что:
CODE
/* линия 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\... "
Гуру, подскажите что я делаю не так. Спасибо.
megajohn
это вечный лисапед !

возьмите готовое
http://electronix.ru/forum/index.php?showt...t&p=1216345
ibiza11
rolleyes.gif действительно!))) спасибо! Причем я точно помню, что эти макросы я видел, пытался применить, но почему то решил, что они не совсем подходят. smile3046.gif
Сейчас вижу, что я тогда тупанул! biggrin.gif

ЗЫ Поторопился с выводами
вот код:
Код
#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)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.