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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> Директива #define, Научить считать препроцессор
andrvisht
сообщение Nov 24 2005, 11:23
Сообщение #16


Местный
***

Группа: Свой
Сообщений: 298
Регистрация: 29-08-05
Пользователь №: 8 064



Цитата(starter48 @ Nov 24 2005, 14:36) *
Посмотри как PORT в .h задаётся.
там даже специально дан пример:
Код
union {
  unsigned char AVR;
  struct {
    unsigned char AVR_Bit0:1,
    AVR_Bit1:1,
    AVR_Bit2:1,
    AVR_Bit3:1,
    AVR_Bit4:1,
    AVR_Bit5:1,
    AVR_Bit6:1,
    AVR_Bit7:1;
  };
};

Здесь к переменной AVR можно обращаться как к char: AVR=111,
а можно через биты: AVR_Bit5=1


Понял, а если я вот так захочу
AVR = (1<<AVR_Bit7)|(1<<AVR_Bit2)
то компилятор ме ругается, но у него AVR_Bitx все нули,
значит мне нужно их тоже определить в желаемом порядке ...
Исходя из описания портов вроде как да, но как на самом деле?
Go to the top of the page
 
+Quote Post
starter48
сообщение Nov 24 2005, 11:56
Сообщение #17


Частый гость
**

Группа: Свой
Сообщений: 112
Регистрация: 15-10-05
Из: Томск
Пользователь №: 9 680



Цитата(&-rey @ Nov 24 2005, 17:23) *
Понял, а если я вот так захочу
AVR = (1<<AVR_Bit7)|(1<<AVR_Bit2)
то компилятор ме ругается, но у него AVR_Bitx все нули,
значит мне нужно их тоже определить в желаемом порядке ...
Исходя из описания портов вроде как да, но как на самом деле?

А что ты этим выражением хотел сделать? blink.gif
Если установить биты7 и 2, то надо писать AVR |= (1<<7)|(1<<2),
или AVR_Bit7=AVR_Bit2=1.

Можешь ещё сделать по варианту, предложенному Rash:
Код
#include<avr_macros.h> //здесь макросы SETBIT, CLEARBIT...

void main(void)
{
  SETBIT(AVR, 7);SETBIT(AVR, 2);
}
Go to the top of the page
 
+Quote Post
andrvisht
сообщение Nov 24 2005, 12:09
Сообщение #18


Местный
***

Группа: Свой
Сообщений: 298
Регистрация: 29-08-05
Пользователь №: 8 064



AVR_Bit7=AVR_Bit2=1
пробовал, но оно разделяет код на 2 команды, только если оптимизацию врубить тогда оно их сложит.
вообщем я понял, биты тоже нужно переопределить как хочеться.
Одной записью не обойтись sad.gif
Go to the top of the page
 
+Quote Post
starter48
сообщение Nov 24 2005, 12:21
Сообщение #19


Частый гость
**

Группа: Свой
Сообщений: 112
Регистрация: 15-10-05
Из: Томск
Пользователь №: 9 680



Цитата(&-rey @ Nov 24 2005, 18:09) *
AVR_Bit7=AVR_Bit2=1
пробовал, но оно разделяет код на 2 команды, только если оптимизацию врубить тогда оно их сложит.

Да, так и должно быть.
Цитата(&-rey @ Nov 24 2005, 18:09) *
вообщем я понял, биты тоже нужно переопределить как хочеться.
Одной записью не обойтись sad.gif

Если хочешь одной записью и с выключенной оптимизацией, то только явная запись поможет AVR |= (1<<7)|(1<<2). Что-то ты себе лишние проблемы создаешь smile.gif. Может книжек по С дать почитать?
Обычно бывает обратная проблема, когда пишешь
SETBIT(AVR,7);
SETBIT(AVR,2);
а оно их в одну команду ORI сливает. Тогда надо AVR объявить как volatile, чтобы выключить излишнюю оптимизацию этой переменной.
Go to the top of the page
 
+Quote Post
andrvisht
сообщение Nov 24 2005, 12:37
Сообщение #20


Местный
***

Группа: Свой
Сообщений: 298
Регистрация: 29-08-05
Пользователь №: 8 064



Цитата(starter48 @ Nov 24 2005, 16:21) *
Если хочешь одной записью и с выключенной оптимизацией, то только явная запись поможет AVR |= (1<<7)|(1<<2). Что-то ты себе лишние проблемы создаешь smile.gif.

Это я понял, я имелл ввиду символьные имена битов. Их придеться еще раз определять
так же как PORTB_Bit0 и PB0
Цитата
Может книжек по С дать почитать?

Да вроде есть пока, только плохо без примеров применительно к AVR c точки зрения компактности.
Цитата
Обычно бывает обратная проблема, когда пишешь
SETBIT(AVR,7);
SETBIT(AVR,2);
а оно их в одну команду ORI сливает. Тогда надо AVR объявить как volatile, чтобы выключить излишнюю оптимизацию этой переменной.

Да, это я пробовал..
Вообщем я все понял, sanks.
Go to the top of the page
 
+Quote Post

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

 


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


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