реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Хитрая склейка лексем на Си, с помощью директивы ##
ibiza11
сообщение Dec 13 2013, 14:45
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 54
Регистрация: 13-01-09
Пользователь №: 43 304



Приветствую всех!
Пытаюсь реализовать вот что:
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\... "
Гуру, подскажите что я делаю не так. Спасибо.
Go to the top of the page
 
+Quote Post
megajohn
сообщение Dec 13 2013, 15:55
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 080
Регистрация: 16-11-04
Из: СПб
Пользователь №: 1 143



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

возьмите готовое
http://electronix.ru/forum/index.php?showt...t&p=1216345


--------------------
Марс - единственная планета, полностью населенная роботами (около 7 штук).
Go to the top of the page
 
+Quote Post
ibiza11
сообщение Dec 15 2013, 06:47
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 54
Регистрация: 13-01-09
Пользователь №: 43 304



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)


Сообщение отредактировал ibiza11 - Dec 15 2013, 09:09
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th July 2025 - 18:11
Рейтинг@Mail.ru


Страница сгенерированна за 0.01355 секунд с 7
ELECTRONIX ©2004-2016