проблема с #define

Обсуждаем цифровые устройства...
Ответить
Аватара пользователя
слушатель
Первый раз сказал Мяу!
Сообщения: 26
Зарегистрирован: Пт ноя 05, 2010 11:12:51
Контактная информация:

проблема с #define

Сообщение слушатель »

Доброго времени суток!
Пользую CVAVR 1.25.9
симулирую в студии

есть код

#define Key1 3 //
#define Key2 4
#define Key3 5 //
#define Key4 6
#define Key5 7
#define KeyLeds 2
#define KeyPort PORTA
#define KeyPin PINA
#define KeyDdr DDRA
#define KeyMask ((1<<Key5)|(1<<Key4)|(1<<Key3)|(1<<Key2)|(1<<Key1))

void KeyInit(void) {
KeyDdr|=KeyMask; //
KeyPort|=KeyMask;
}

все прекрасно...
а вот так уже не работает

void KeyInit(void) {
KeyDdr|=KeyMask&(1<<KeyLeds); //
KeyPort|=KeyMask&(1<<KeyLeds);
KeyPort&=(~(1<<KeyLeds));
}
то есть вроде как работает, но в порты не записывает.
при чем даже варнинги не выскакивают...

Может я не правильно понимаю этот дефайн
хотельсь сделать независимую функцию для клавиатуры...
Реклама
Аватара пользователя
Goodefine
Держит паяльник хвостом
Сообщения: 906
Зарегистрирован: Ср апр 16, 2008 13:22:54
Откуда: Приднестровье, Тирасполь

Re: проблема с #define

Сообщение Goodefine »

слушатель писал(а): то есть вроде как работает, но в порты не записывает.
при чем даже варнинги не выскакивают...
С какой радости там "&" ? Для единицы нужно "|":

Код: Выделить всё

void KeyInit(void) {
KeyDdr|=KeyMask|(1<<KeyLeds);      
KeyPort|=KeyMask|(1<<KeyLeds);
KeyPort&=~(1<<KeyLeds);
}
И еще, не пишите никогда так:

Код: Выделить всё

#define Key3 5    //
Только так:

Код: Выделить всё

#define Key3 5    /* */ 
Подумайте почему....
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
Реклама
Аватара пользователя
слушатель
Первый раз сказал Мяу!
Сообщения: 26
Зарегистрирован: Пт ноя 05, 2010 11:12:51
Контактная информация:

Re: проблема с #define

Сообщение слушатель »

Что делает ф-я неважно. Там еще куча разных ф-й естькоторые используют макроопределения. У меня клавиатура на 5 кнопок , в каждой из которой стоит св.диод. В прерывании меняется направление порта и считывается значение кнопок в переменную соотвктственно макросу.
Проблема в том, что программа не инициализирует порт соответственно макроопределениям. В итоге не работает ни одна ф-я.
вроде так... :music:
Аватара пользователя
Goodefine
Держит паяльник хвостом
Сообщения: 906
Зарегистрирован: Ср апр 16, 2008 13:22:54
Откуда: Приднестровье, Тирасполь

Re: проблема с #define

Сообщение Goodefine »

Еще раз, вы разницу между своим первоначальным кодом:

Код: Выделить всё

void KeyInit(void) {
KeyDdr|=KeyMask&(1<<KeyLeds); //
KeyPort|=KeyMask&(1<<KeyLeds);
KeyPort&=(~(1<<KeyLeds));
}
и исправленным:

Код: Выделить всё

void KeyInit(void) {
KeyDdr|=KeyMask|(1<<KeyLeds);     
KeyPort|=KeyMask|(1<<KeyLeds);
KeyPort&=~(1<<KeyLeds);
}
видите?...
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
слушатель
Первый раз сказал Мяу!
Сообщения: 26
Зарегистрирован: Пт ноя 05, 2010 11:12:51
Контактная информация:

Re: проблема с #define

Сообщение слушатель »

пордон... :o не видел...
уже мозги квадратные у этого компа...
вопрос снят.
Реклама
vovik15
Опытный кот
Сообщения: 768
Зарегистрирован: Сб ноя 08, 2008 18:32:36
Контактная информация:

Re: проблема с #define

Сообщение vovik15 »

а почему именно /*так*/ ?
//может я вот так хочу
что это изменит?
Реклама
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18647
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: проблема с #define

Сообщение ARV »

vovik15 писал(а):а почему именно /*так*/ ?
//может я вот так хочу
что это изменит?
в некоторых компиляторах препроцессор сначала делает подстановки макросов, и только затем удаляет комментарии, в некоторых - наоборот. честно говоря, я не знаю, какой вариант ПРАВИЛЬНЫЙ, а может, стандарт вообще об этом умалчивает... но комментарии в макросах /* такого вида */ и в том и в другом случае не исказят код программы, в то время как комментарии // такого вида могут привести к катастрофе для компиляторов, действующих по первому варианту. вот пример:

Код: Выделить всё

#define foo(x) (1<<x) // простой сдвиг
a = b + foo(c) / 12; 
компилятор первого варианта запустит препроцессор и получит такой код:

Код: Выделить всё

a = b + (1<<c) // простой сдвиг / 12;
на этапе удаления комментариев получится такой код:

Код: Выделить всё

a = b + (1<<c)
очевидно, это даже если и скомпилируется без ошибки, то даст совсем не тот результат, который должен был получиться.

в случае с /* таким комментарием */ проблема отсутствует
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
vovik15
Опытный кот
Сообщения: 768
Зарегистрирован: Сб ноя 08, 2008 18:32:36
Контактная информация:

Re: проблема с #define

Сообщение vovik15 »

все понял,спасибо вам
Ответить

Вернуться в «Цифровая техника»