|
|
  |
Работа с битами регистров |
|
|
|
Jul 28 2009, 17:43
|
Участник

Группа: Участник
Сообщений: 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 такой способ кажется дикостью и жутко неудобен.
|
|
|
|
|
Jul 29 2009, 05:33
|
Местный
  
Группа: Свой
Сообщений: 232
Регистрация: 22-02-06
Из: Воронеж
Пользователь №: 14 589

|
IAR позволяет делать так: Код PORTB_Bit0 = 0; PORTB_Bit0 = 1; Ну и соответственно: Код if ( PINB_Bit7 == 1 ) { //......... } Если нужно работать с битами в переменных, то можно использовать структуры с битовыми полями.
--------------------
Истина рождается в спорах; но когда страсти кипят, истина испаряется.
|
|
|
|
|
Jul 29 2009, 10:16
|
Участник

Группа: Участник
Сообщений: 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 */ ...
|
|
|
|
|
Feb 26 2010, 12:44
|
Группа: Участник
Сообщений: 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) Подскажите, пожалуйста, как бы это все согласовать, чтобы работало?
|
|
|
|
|
Feb 26 2010, 15:31
|

Гуру
     
Группа: Свой
Сообщений: 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
|
|
|
|
|
Mar 1 2010, 05:47
|
Группа: Участник
Сообщений: 8
Регистрация: 17-10-07
Из: Чебоксары
Пользователь №: 31 432

|
Спасибо за ответы - разобрался на свежую голову... Цитата(SasaVitebsk @ Feb 26 2010, 16:43)  Рекомендую пользоваться стандартным представлением. Типа PORTB |= (1<<PIN5); Это поможет вам легко переходить от камня к камню и исключит некоторые ошибки. Ну это - да, в основном этим и пользуюсь просто необходимо было быстро портировать готовую прогу с одного камня на другой. И в проге как раз использовались обращения к битовым полям. Просто сделал копию структуры с битовыми полями: Код SFR_B_R(0x0000, GPIO0bf); и появилась возможность делать Код GPIO0bf_Bit0=1;
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|