ibiza11 0 13 декабря, 2013 Опубликовано 13 декабря, 2013 · Жалоба Приветствую всех! Пытаюсь реализовать вот что: /* линия 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 3 13 декабря, 2013 Опубликовано 13 декабря, 2013 · Жалоба это вечный лисапед ! возьмите готовое http://electronix.ru/forum/index.php?showt...t&p=1216345 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ibiza11 0 15 декабря, 2013 Опубликовано 15 декабря, 2013 (изменено) · Жалоба :rolleyes: действительно!))) спасибо! Причем я точно помню, что эти макросы я видел, пытался применить, но почему то решил, что они не совсем подходят. :smile3046: Сейчас вижу, что я тогда тупанул! ЗЫ Поторопился с выводами вот код: #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) Изменено 15 декабря, 2013 пользователем ibiza11 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться