Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Работа с битами регистров
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
rekcuf
Впервые делаю проект на атмеге8, компилятор IAR.

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

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

if(PORTA.PA0)
...

?

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

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

Но после компиляторов для микрочипа PICC18 и MCC18 такой способ кажется дикостью и жутко неудобен.
MrYuran
Напишите свои макросы, которые кажутся жутко удобными, либо используйте множество готовых
Я не вижу ничего неудобного в записи
PORTx |= mask
и
PORTx &= ~mask
Если хотите в виде структур - пожалуйста.
Я думаю, в WinAVR можно найти соответствующие h-файлы/
Кстати, компилятор тут вообще ни при чём
sergeeff
Цитата(MrYuran @ Jul 28 2009, 21:00) *
Кстати, компилятор тут вообще ни при чём


Компилятор всегда причем. Неплохо бы посмотреть, как компилятор обрабатывает битовые поля в структуре. Совсем не факт, что также эффективно, как обычное установку/сброс конкретного бита с помощью маски. Тогда и нет смысла на битовые поля переходить.
Rst7
В IAR'е в свойствах проекта найдите и поставьте галочку Enable Bit Definitions.

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

В следующий раз курите документацию на компилятор и среду.
otrog
IAR позволяет делать так:
Код
PORTB_Bit0 = 0;
PORTB_Bit0 = 1;

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

Если нужно работать с битами в переменных, то можно использовать структуры с битовыми полями.
rekcuf
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 */
...
Rst7
Цитата
я так понял, это заголовочник кривой, т.к. в iousb1287.h все нормально прописано:


Да, кривой. Но PORTx_BitN будет работать.
igneous
Помогите, пожалуйста, с аналогичной проблемой но при работе с 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)


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

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

Например:

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

и так далее.
Это обеспечит:
1) Возможность простого осмысленного анализа схемы по тексту проги. Из одного места. Например сразу видно что к PB5 подрублен
светодиод и зажигается он нулём.
2) Возможность быстрого внесения изменений в программу минимальными корректировками. Например сменить порт, поменять пины,
сменить полярность.
3) Возможность ввода нескольких версий платы не меняя логики её работы (например после переразводки)
4) Возможность переноса на другую платформу (необходимо поменять логику работы с портами)
zltigo
Цитата(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;
igneous
Спасибо за ответы - разобрался на свежую голову...

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

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

и появилась возможность делать
Код
GPIO0bf_Bit0=1;
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.