rekcuf 0 28 июля, 2009 Опубликовано 28 июля, 2009 · Жалоба Впервые делаю проект на атмеге8, компилятор IAR. Что надо сделать, чтобы работать с битами похожим образом: PORTB.PB1 = 1; PORTB_PB1 = 0; PC1 = 0; if(PORTA.PA0) ... ? Сейчас работает только один способ: PORTB |= (1 << PB2); if((PORTB & (1 << PB2))) ... Но после компиляторов для микрочипа PICC18 и MCC18 такой способ кажется дикостью и жутко неудобен. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrYuran 29 28 июля, 2009 Опубликовано 28 июля, 2009 · Жалоба Напишите свои макросы, которые кажутся жутко удобными, либо используйте множество готовых Я не вижу ничего неудобного в записи PORTx |= mask и PORTx &= ~mask Если хотите в виде структур - пожалуйста. Я думаю, в WinAVR можно найти соответствующие h-файлы/ Кстати, компилятор тут вообще ни при чём Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sergeeff 1 28 июля, 2009 Опубликовано 28 июля, 2009 · Жалоба Кстати, компилятор тут вообще ни при чём Компилятор всегда причем. Неплохо бы посмотреть, как компилятор обрабатывает битовые поля в структуре. Совсем не факт, что также эффективно, как обычное установку/сброс конкретного бита с помощью маски. Тогда и нет смысла на битовые поля переходить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Rst7 5 29 июля, 2009 Опубликовано 29 июля, 2009 · Жалоба В IAR'е в свойствах проекта найдите и поставьте галочку Enable Bit Definitions. Тогда у Вас появится возможность писать PORTC_Bit4=1 или TIMSK_OCIE1A=0. В следующий раз курите документацию на компилятор и среду. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
otrog 0 29 июля, 2009 Опубликовано 29 июля, 2009 · Жалоба IAR позволяет делать так: PORTB_Bit0 = 0; PORTB_Bit0 = 1; Ну и соответственно: if ( PINB_Bit7 == 1 ) { //......... } Если нужно работать с битами в переменных, то можно использовать структуры с битовыми полями. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rekcuf 0 29 июля, 2009 Опубликовано 29 июля, 2009 · Жалоба 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 5 29 июля, 2009 Опубликовано 29 июля, 2009 · Жалоба я так понял, это заголовочник кривой, т.к. в iousb1287.h все нормально прописано: Да, кривой. Но PORTx_BitN будет работать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
igneous 0 26 февраля, 2010 Опубликовано 26 февраля, 2010 · Жалоба Помогите, пожалуйста, с аналогичной проблемой но при работе с 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) Подскажите, пожалуйста, как бы это все согласовать, чтобы работало? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SapegoAL 0 26 февраля, 2010 Опубликовано 26 февраля, 2010 · Жалоба Рекомендую пользоваться стандартным представлением. Типа PORTB |= (1<<PIN5); Это поможет вам легко переходить от камня к камню и исключит некоторые ошибки. Для того чтобы всё было лаконично - заведите файл описаний (у меня, к примеру, port.h) и поименуйте осмысленно там ваши ноги. Например: // PORTB #define LEDPWR 5 #define LEDPWR_ON PORTB &= ~(1<<LEDPWR) и так далее. Это обеспечит: 1) Возможность простого осмысленного анализа схемы по тексту проги. Из одного места. Например сразу видно что к PB5 подрублен светодиод и зажигается он нулём. 2) Возможность быстрого внесения изменений в программу минимальными корректировками. Например сменить порт, поменять пины, сменить полярность. 3) Возможность ввода нескольких версий платы не меняя логики её работы (например после переразводки) 4) Возможность переноса на другую платформу (необходимо поменять логику работы с портами) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 2 26 февраля, 2010 Опубликовано 26 февраля, 2010 · Жалоба Рекомендую пользоваться стандартным представлением. Полностью поддерживаю. Что надо... Надо не привыкать к дикостям и ненужным уродствам производителей компиляторов и писателей хидеров к контроллерам (им надо несмышленышей к своей кормушке привязывать и не более того). Иначе неизбежно будете обречены изрекать: "после компиляторов для микрочипа 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 0 1 марта, 2010 Опубликовано 1 марта, 2010 · Жалоба Спасибо за ответы - разобрался на свежую голову... Рекомендую пользоваться стандартным представлением. Типа PORTB |= (1<<PIN5); Это поможет вам легко переходить от камня к камню и исключит некоторые ошибки. Ну это - да, в основном этим и пользуюсь просто необходимо было быстро портировать готовую прогу с одного камня на другой. И в проге как раз использовались обращения к битовым полям. Просто сделал копию структуры с битовыми полями: SFR_B_R(0x0000, GPIO0bf); и появилась возможность делать GPIO0bf_Bit0=1; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться