Перейти к содержанию
    

Работа с битами регистров

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

 

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

 

PORTB.PB1 = 1;
PORTB_PB1 = 0;
PC1 = 0;

if(PORTA.PA0)
...

?

 

Сейчас работает только один способ:

PORTB |= (1 << PB2);

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

Но после компиляторов для микрочипа PICC18 и MCC18 такой способ кажется дикостью и жутко неудобен.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Напишите свои макросы, которые кажутся жутко удобными, либо используйте множество готовых

Я не вижу ничего неудобного в записи

PORTx |= mask

и

PORTx &= ~mask

Если хотите в виде структур - пожалуйста.

Я думаю, в WinAVR можно найти соответствующие h-файлы/

Кстати, компилятор тут вообще ни при чём

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Кстати, компилятор тут вообще ни при чём

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

IAR позволяет делать так:

PORTB_Bit0 = 0;
PORTB_Bit0 = 1;

Ну и соответственно:

if ( PINB_Bit7 == 1 )
{
//.........
}

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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 */
...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Помогите, пожалуйста, с аналогичной проблемой но при работе с 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)

 

Подскажите, пожалуйста, как бы это все согласовать, чтобы работало?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Рекомендую пользоваться стандартным представлением.

Типа

PORTB |= (1<<PIN5);

Это поможет вам легко переходить от камня к камню и исключит некоторые ошибки.

 

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

 

Например:

 

// PORTB

#define LEDPWR 5

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

 

и так далее.

Это обеспечит:

1) Возможность простого осмысленного анализа схемы по тексту проги. Из одного места. Например сразу видно что к PB5 подрублен

светодиод и зажигается он нулём.

2) Возможность быстрого внесения изменений в программу минимальными корректировками. Например сменить порт, поменять пины,

сменить полярность.

3) Возможность ввода нескольких версий платы не меняя логики её работы (например после переразводки)

4) Возможность переноса на другую платформу (необходимо поменять логику работы с портами)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Рекомендую пользоваться стандартным представлением.

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

Что надо...

Надо не привыкать к дикостям и ненужным уродствам производителей компиляторов и писателей хидеров к контроллерам (им надо несмышленышей к своей кормушке привязывать и не более того). Иначе неизбежно будете обречены изрекать: "после компиляторов для микрочипа 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;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Рекомендую пользоваться стандартным представлением.

Типа

PORTB |= (1<<PIN5);

Это поможет вам легко переходить от камня к камню и исключит некоторые ошибки.

Ну это - да, в основном этим и пользуюсь просто необходимо было быстро портировать готовую прогу с одного камня на другой.

И в проге как раз использовались обращения к битовым полям. Просто сделал копию структуры с битовыми полями:

SFR_B_R(0x0000, GPIO0bf);

и появилась возможность делать

GPIO0bf_Bit0=1;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...