|
|
  |
Вопрос по макросу в С, Сброс/установка битов в двух разных портах |
|
|
|
Sep 16 2008, 10:22
|

Профессионал
    
Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409

|
Помогите пожалуйста с макросом  Необходимо с помощью макроса записать установку бита в одном порту и сброс в другом т.е. чтобы в макросе выполнялись такие строчки: PORTA |= (1<<BIT1) PORTB &= ~(1<<BIT2) В IAR нашёл макрос #define input_block_dec(PORT,ADDRESS,COUNT)\ { \ unsigned char i;\ unsigned char *addr=(ADDRESS);\ for(i=0;i<(COUNT);i++)\ *addr--=(PORT);\ } Пробовал подобным образом переделать под свой: #define Set1()\ { \ PORTA |= (1<<BIT1);\ PORTB &= ~(1<<BIT2);\ } Пока не использую его компилятор не ругается, только вставляю где-нибудь пишет что нужна ; Компилятор IAR 5.10a
|
|
|
|
|
Sep 16 2008, 10:49
|

Профессионал
    
Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409

|
Цитата(Сергей Борщ @ Sep 16 2008, 14:41)  Покажите, как используете. собственно макрос: Код #define Set1()\ { \ PORTA |= (1<<BIT1);\ PORTB &= ~(1<<BIT2);\ } использую в таком виде: Код ...код.......... //пытаюсь установить бит одного порта и сбросить в другом Set1(); ...код...... макрос из одной строчки работает: Код #define Set1() PORTA |= (1<<BIT1) А из двух не хочет  И ещё попутно вопрос каково назначение \ ?
|
|
|
|
|
Sep 16 2008, 10:50
|

Гуру
     
Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954

|
Например, можно записать так #define Set1() ( PORTA |= (1<<BIT1), PORTB &= ~(1<<BIT2) ) Это, если всегда для одних и тех же битов одних и тех же портов. Иначе - добавить параметры #define Set1(Port1, Bit1, Port2, Bit2) ( Port1 |= (1<<Bit1), Port2 &= ~(1<<Bit2) ) Вызывать Set1(); или Set1(PORTA, BIT1, PORTB, BIT2);
|
|
|
|
|
Sep 16 2008, 11:00
|

Профессионал
    
Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409

|
Цитата(Палыч @ Sep 16 2008, 14:50)  Например, можно записать так #define Set1() ( PORTA |= (1<<BIT1), PORTB &= ~(1<<BIT2) ) Это, если всегда для одних и тех же битов одних и тех же портов. Иначе - добавить параметры #define Set1(Port1, Bit1, Port2, Bit2) ( Port1 |= (1<<Bit1), Port2 &= ~(1<<Bit2) ) Вызывать Set1(); или Set1(PORTA, BIT1, PORTB, BIT2); Спасибо Ваш вариант работает Кстати и мой тоже (там была ошибка - случайно не удалил одну скобочку  ) Но вопрос про "\" всёже остался
|
|
|
|
|
Sep 16 2008, 11:08
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(mempfis_ @ Sep 16 2008, 14:01)  Проблема решена  Не, вы еще не на все грабли наступили  . Попробуйте так: Код if(var) Set1(); else var = 1;
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Sep 16 2008, 11:19
|

Начинающий профессионал
    
Группа: Свой
Сообщений: 1 215
Регистрация: 25-10-06
Из: СПб
Пользователь №: 21 648

|
Цитата(Сергей Борщ @ Sep 16 2008, 15:08)  Не, вы еще не на все грабли наступили  . Попробуйте так: Код if(var) Set1(); else var = 1; +1. Без препроцесора не разобраться
--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
|
|
|
|
|
Sep 16 2008, 11:37
|

Профессионал
    
Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409

|
Цитата(Сергей Борщ @ Sep 16 2008, 15:08)  Не, вы еще не на все грабли наступили  . Попробуйте так: Код if(var) Set1(); else var = 1; Если не затруднит, расскажите в чём могут быть грабли? И что Вы имели ввиду под этой строчкой Код if(var) Set1(); else var = 1; Вызоа макроса в операторе if-else в программе? Проверил у себя в вроде всё работает.
|
|
|
|
|
Sep 16 2008, 12:23
|

Начинающий профессионал
    
Группа: Свой
Сообщений: 1 215
Регистрация: 25-10-06
Из: СПб
Пользователь №: 21 648

|
Определение блока (фигурные скобки) может сыграть злую шутку: Код #define Set1()/ { / PORTA |= (1<<BIT1);/ PORTB &= ~(1<<BIT2);/ }
if(var) Set1(); else var = 1; Разбираем подстановку: Код if(var) { PORTA |= (1<<BIT1); PORTB &= ~(1<<BIT2); } ; else var = 1; Посмотрите как сделаны макросы в GCC. Заложены очень хорошие идеи.
--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
|
|
|
|
|
Sep 16 2008, 12:33
|

Профессионал
    
Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409

|
Цитата(mdmitry @ Sep 16 2008, 16:23)  Определение блока (фигурные скобки) может сыграть злую шутку: Код #define Set1()/ { / PORTA |= (1<<BIT1);/ PORTB &= ~(1<<BIT2);/ }
if(var) Set1(); else var = 1; Разбираем подстановку: Код if(var) { PORTA |= (1<<BIT1); PORTB &= ~(1<<BIT2); } ; else var = 1; Посмотрите как сделаны макросы в GCC. Заложены очень хорошие идеи. Спасибо, понял в чём может быть проблема. К счастью эти макросы не будут применятся в условных операторах (только чтобы установить/сбросить нужные пины контроллера). Если что то просто перепишу их без фигурных скобок
|
|
|
|
|
Sep 16 2008, 12:42
|

Начинающий профессионал
    
Группа: Свой
Сообщений: 1 215
Регистрация: 25-10-06
Из: СПб
Пользователь №: 21 648

|
Пример макроса (идея из GCC) Код #define Set1() \ do { \ PORTA |= (1<<BIT1);\ PORTB &= ~(1<<BIT2);\ } while (0) Сергей Борщ в форуме по AVR комментировал используемую здесь идею. Оптимизатор компилятора выкинет цикл, но оставит тело цикла. Безопасное использование гарантировано. Сам пишу сложные макросы на основе этой идеи.
--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|