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

 
 
 
Reply to this topicStart new topic
> Работа с битами регистров
rekcuf
сообщение Jul 28 2009, 17:43
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 28
Регистрация: 5-10-08
Пользователь №: 40 704



Впервые делаю проект на атмеге8, компилятор IAR.

Что надо сделать, чтобы работать с битами похожим образом:

Код
PORTB.PB1 = 1;
PORTB_PB1 = 0;
PC1 = 0;

if(PORTA.PA0)
...

?

Сейчас работает только один способ:
Код
PORTB |= (1 << PB2);

if((PORTB & (1 << PB2)))
...

Но после компиляторов для микрочипа PICC18 и MCC18 такой способ кажется дикостью и жутко неудобен.
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Jul 28 2009, 18:00
Сообщение #2


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Напишите свои макросы, которые кажутся жутко удобными, либо используйте множество готовых
Я не вижу ничего неудобного в записи
PORTx |= mask
и
PORTx &= ~mask
Если хотите в виде структур - пожалуйста.
Я думаю, в WinAVR можно найти соответствующие h-файлы/
Кстати, компилятор тут вообще ни при чём


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Jul 28 2009, 22:16
Сообщение #3


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

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Цитата(MrYuran @ Jul 28 2009, 21:00) *
Кстати, компилятор тут вообще ни при чём


Компилятор всегда причем. Неплохо бы посмотреть, как компилятор обрабатывает битовые поля в структуре. Совсем не факт, что также эффективно, как обычное установку/сброс конкретного бита с помощью маски. Тогда и нет смысла на битовые поля переходить.
Go to the top of the page
 
+Quote Post
Rst7
сообщение Jul 29 2009, 04:51
Сообщение #4


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



В IAR'е в свойствах проекта найдите и поставьте галочку Enable Bit Definitions.

Тогда у Вас появится возможность писать PORTC_Bit4=1 или TIMSK_OCIE1A=0.

В следующий раз курите документацию на компилятор и среду.


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
otrog
сообщение Jul 29 2009, 05:33
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 232
Регистрация: 22-02-06
Из: Воронеж
Пользователь №: 14 589



IAR позволяет делать так:
Код
PORTB_Bit0 = 0;
PORTB_Bit0 = 1;

Ну и соответственно:
Код
if ( PINB_Bit7 == 1 )
{
//.........
}

Если нужно работать с битами в переменных, то можно использовать структуры с битовыми полями.


--------------------
Истина рождается в спорах; но когда страсти кипят, истина испаряется.
Go to the top of the page
 
+Quote Post
rekcuf
сообщение Jul 29 2009, 10:16
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 28
Регистрация: 5-10-08
Пользователь №: 40 704



otrog, Rst7

Посмотрел заголовочник iom8.h:

Код
#ifdef ENABLE_BIT_DEFINITIONS

/* Bit definitions for use with the IAR Assembler  
   The Register Bit names are represented by their bit number (0-7).
*/

/* General Interrupt Control register */
#define    INT1     7
#define    INT0     6

#define    IVSEL    1
#define    IVCE     0
...

т.е. ENABLE_BIT_DEFINITIONS делает совсем другое.

я так понял, это заголовочник кривой, т.к. в iousb1287.h все нормально прописано:
Код
SFR_B_N(0xF9, OTGTCON, 1, PAGE1, PAGE0, Dummy4, Dummy3, Dummy2, VALUE1, VALUE0)
SFR_B_N(0xF8, UPINT, PINT7, PINT6, PINT5, PINT4, PINT3, PINT2, PINT1, PINT0)
...


а в iom8.h прописаны только голые регистры:

Код
SFR_B(TWBR,   0x00) /* TWI Bit rate Register */
SFR_B(TWSR,   0X01) /* TWI status Register */
SFR_B(TWAR,   0x02) /* TWI Address Register */
...
Go to the top of the page
 
+Quote Post
Rst7
сообщение Jul 29 2009, 10:25
Сообщение #7


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Цитата
я так понял, это заголовочник кривой, т.к. в iousb1287.h все нормально прописано:


Да, кривой. Но PORTx_BitN будет работать.


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
igneous
сообщение Feb 26 2010, 12:44
Сообщение #8





Группа: Участник
Сообщений: 8
Регистрация: 17-10-07
Из: Чебоксары
Пользователь №: 31 432



Помогите, пожалуйста, с аналогичной проблемой но при работе с ATxmega32A4.
Галка Enable_bit_definitions установлена. Хочется, чтобы банально была возможность работы с PORTX_BitN, SREG_BitN и GPION_BitN.

В самом хедере ATxmega32A4.h имеем:
Код
sfrb GPIO0 = 0x0000        // General Purpose IO Register 0
sfrb SREG = 0x003F        // Status Register
sfrb PORTA_OUT = 0x0604        // I/O Port Output

Как раскрывется sfbr я не нашел...
В mega32 например периферия описывается как:
Код
SFR_B (SREG,0x003F)

ну и в iomacro.h есть определение:
Код
#define SFR_B(_NAME, _ADDR) SFR_B_BITS(_NAME, _ADDR, \
                                    Bit0,Bit1,Bit2,Bit3,Bit4,Bit5,Bit6,Bit7)


Подскажите, пожалуйста, как бы это все согласовать, чтобы работало?
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Feb 26 2010, 13:43
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Рекомендую пользоваться стандартным представлением.
Типа
PORTB |= (1<<PIN5);
Это поможет вам легко переходить от камня к камню и исключит некоторые ошибки.

Для того чтобы всё было лаконично - заведите файл описаний (у меня, к примеру, port.h) и поименуйте осмысленно там ваши ноги.

Например:

// PORTB
#define LEDPWR 5
#define LEDPWR_ON PORTB &= ~(1<<LEDPWR)

и так далее.
Это обеспечит:
1) Возможность простого осмысленного анализа схемы по тексту проги. Из одного места. Например сразу видно что к PB5 подрублен
светодиод и зажигается он нулём.
2) Возможность быстрого внесения изменений в программу минимальными корректировками. Например сменить порт, поменять пины,
сменить полярность.
3) Возможность ввода нескольких версий платы не меняя логики её работы (например после переразводки)
4) Возможность переноса на другую платформу (необходимо поменять логику работы с портами)
Go to the top of the page
 
+Quote Post
zltigo
сообщение Feb 26 2010, 15:31
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(SasaVitebsk @ Feb 26 2010, 16:43) *
Рекомендую пользоваться стандартным представлением.

Полностью поддерживаю.
Цитата
Что надо...

Надо не привыкать к дикостям и ненужным уродствам производителей компиляторов и писателей хидеров к контроллерам (им надо несмышленышей к своей кормушке привязывать и не более того). Иначе неизбежно будете обречены изрекать: "после компиляторов для микрочипа PICC18 и MCC18 такой способ кажется дикостью и жутко неудобен". Хотя неудобен, нечитаем и ограничен (давайте пару бит за раз установим) именно кажущийся Вам "удобным" способ.
Пример приличного описания битов в регистре:

Код
#define S5_LIG1        BIT7
#define S5_LIG0        BIT6
#define S5_LIG(x)    (((x)&0x3)<<6)
#define S5_LIM        BIT5

#define S5_MCG1        BIT4
#define S5_MCG0        BIT3
#define S5_MCG(x)    (((x)&0x3)<<3)
#define S5_MCM        BIT2
#define S5_HIM        BIT1
#define S5_IIR        BIT0

.......

SI3000_S5 = S5_LIG(3)|S5_MCG(0)|S5_MCM|S5_HIM);

.....
SI3000_S5 |= S5_LIM;


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
igneous
сообщение Mar 1 2010, 05:47
Сообщение #11





Группа: Участник
Сообщений: 8
Регистрация: 17-10-07
Из: Чебоксары
Пользователь №: 31 432



Спасибо за ответы - разобрался на свежую голову...

Цитата(SasaVitebsk @ Feb 26 2010, 16:43) *
Рекомендую пользоваться стандартным представлением.
Типа
PORTB |= (1<<PIN5);
Это поможет вам легко переходить от камня к камню и исключит некоторые ошибки.

Ну это - да, в основном этим и пользуюсь просто необходимо было быстро портировать готовую прогу с одного камня на другой.
И в проге как раз использовались обращения к битовым полям. Просто сделал копию структуры с битовыми полями:
Код
SFR_B_R(0x0000, GPIO0bf);

и появилась возможность делать
Код
GPIO0bf_Bit0=1;
Go to the top of the page
 
+Quote Post

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

 


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


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