Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: битовые переменные в IAR
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему
DES
пытаюсь самостоятельно освоить IAR (8051) и прежде чем задавать вопрос перекопал весь форум - вопросы аналогичные встречал - ответов нет, поэтому повторю в своей редакции:
как в IARе объявить битовую переменную?( например для контроля уровня на лапке порта)
Dog Pawlowa
Цитата(DES @ Jan 5 2008, 19:00) *
пытаюсь самостоятельно освоить IAR (8051) и прежде чем задавать вопрос перекопал весь форум - вопросы аналогичные встречал - ответов нет, поэтому повторю в своей редакции:
как в IARе объявить битовую переменную?( например для контроля уровня на лапке порта)

Лучше всего не связываться с битовыми пеменными на С, так как они не предусматриваются стандартом.
Хотите битовые переменные - используте Pascal smile.gif
spf
Цитата(Dog Pawlowa @ Jan 5 2008, 21:27) *
Лучше всего не связываться с битовыми пеменными на С, так как они не предусматриваются стандартом.
Хотите битовые переменные - используте Pascal smile.gif

В Си нет определения битовые переменные, но есть битовые поля в структурах. Которые можно использовать в качестве битовых переменных.

Но речь похоже не об этом, надо работать с выводом порта, для это должно быть объявлено в заголовочнике компилятора для используемого контроллера что-то типа
Код
sbit P1_0 = 0x90;
sbit P1_1 = 0x91;

Если есть желание работать с другим именем вывода, то его можно "переименовать" при помощи #define
Код
#define INPUT_PIN2 P1_0
Baser
Цитата(DES @ Jan 5 2008, 17:00) *
как в IARе объявить битовую переменную?( например для контроля уровня на лапке порта)

Тип данных bit IAR не поддерживает, зато есть другое полезное расширение Си, которое решает эту проблему:
"Anonymous structs and unions (similar to the C++ anonymous unions) are allowed.
An anonymous structure type defines an unnamed object (and not a type) whose
member names are promoted to the surrounding scope. The member names must be
unique in the surrounding scope. External anonymous structure types are allowed."
Код
struct {
    unsigned Flag1 :1;
    ...
    unsigned FlagN :1;
    };

При этом к элементам структуры можно обращаться напрямую по их имени.

Для прямого побитного объявления портов и других SFR-ов в ИАРовских компиляторах есть встроеные макросы. Можете посмотреть здесь

Но многие скептически относятся к расширениям Си и предпочитают использовать маски с байтом в явном виде.
DES
Baser, spf спасибо за пинок в нужном направлении, это не ирония, это от души. мне приходится учиться только по интернету, поэтому всегда рад деловым советам, а не пустому трепу академических умников.
zltigo
Цитата(DES @ Jan 5 2008, 19:08) *
.. а не пустому трепу академических умников.

Moderator:
С широковещательными заявлениями поаккуратнее. И лично Вам поменьше трепаться о, например,
"перекопал весь форум" за несколько минут после регистрации. И "учиться только по интернету" совершено не мешает прочтение элементарных книг скачанных из того-же интернета, ну хотя-бы для того, что-бы не мусорить на форуме, и задавать осмысленные вопросы.
DES
Цитата(zltigo @ Jan 5 2008, 20:20) *
Moderator:
С широковещательными заявлениями поаккуратнее. И лично Вам поменьше трепаться о, например,
"перекопал весь форум" за несколько минут после регистрации. И "учиться только по интернету" совершено не мешает прочтение элементарных книг скачанных из того-же интернета, ну хотя-бы для того, что-бы не мусорить на форуме, и задавать осмысленные вопросы.

а до регистрации форум что был недоступен? нехочется флуд разводить по поводу книг ру. интернета, благо имеется достаточно в бумажном варианте, а к людям надо ближе быть, уважаемый модератор, а не хамить.
spf
Цитата(DES @ Jan 5 2008, 22:34) *
а до регистрации форум что был недоступен? нехочется флуд разводить по поводу книг ру. интернета, благо имеется достаточно в бумажном варианте, а к людям надо ближе быть, уважаемый модератор, а не хамить.

+1
в правилах вообще-то написано разборками не заниматься в форуме, а когда это начинают модераторы, то это уже не является правилом и примером для подражания.
Форум для начинающих для начинающих и создан, предполагает снесходительного отношения, как я себе понимаю.
zltigo
Цитата(DES @ Jan 5 2008, 19:34) *
а к людям надо ближе быть, уважаемый модератор, а не хамить.

Выступления, когда вместо "здравствуйте" вновь прибывший выдает совершенно не спровоцированные заявления и рассуждения в духе воиствующего ламерства на этом форуме буду пресекать. Неделю на ознакомление с форумом надеюсь хватит.



Цитата(spf @ Jan 5 2008, 19:55) *
Форум для начинающих для начинающих и создан, предполагает снесходительного отношения, как я себе понимаю.

В порядке разъяснения. Первоначальное сообщение было размещено отнюдь не в форуме для начинающих. Несмотря на явные, "преувеличения" Автора сообщение было молча перенесено в эту ветку.
Дополнительные разъяснения готов дать Вам в личной переписке. Любые дальнейшие обсуждения в этой ветке вопросов модерирования будут пресекаться.
Dog Pawlowa
Цитата(DES @ Jan 5 2008, 21:08) *
Baser, spf спасибо за пинок в нужном направлении, это не ирония, это от души. мне приходится учиться только по интернету, поэтому всегда рад деловым советам, а не пустому трепу академических умников.

Вы все перепутали.
Если Вам действительно нужен "контроль уровня на лапке порта", то достаточно написать
if (PORTX & BIT_MASK) pritntf("High level");
else printf("Low level");

Если же Вам нужны шашечки (а заодно поучить советчиков), то дерзайте biggrin.gif
Непомнящий Евгений
IAR AVR работает PORTX_BitN. В хедере можете посмотреть, как они это описали...
Igor26
Цитата
IAR AVR работает PORTX_BitN.

это для записи на вывод порта, для чтения - PINX_BitN :-)
sergeyip
Для того, чтобы объявить битовую переменную на уровне обращения к ножкам SFR Десу достаточно было посмотреть основной недер файл. Там все это приводится. Интересно было узнать, как в битовом виде в ИАРЕ обратиться к области адресов 20-2F в мк 51. Все вышевысказанные идеи не работают.
Достаточно оттранслировать прикрепленный файл в ИАРЕ для МК AT89S52 и вы увидите, что в ассемблере транслятор с битовыми переменными работает через арифметические операции, то есть как с байтами. Кейл здесь корректнее.

файл не зацепился, почемуто, поэтому пример гружу в текст smile.gif
#include <ioAT89S8252.H>
#include <stdbool.h>


unsigned char PORTC_BITS;
struct
{
unsigned char bit_00 : 1;
unsigned char bit_01 : 1;
unsigned char ACTIVE : 1;//Признак активности канала,сигнал ACN
unsigned char CHANNEL : 1;//Номер канала (0,1)
unsigned char INTC_EXT : 1;//Cигнал запроса от схемы контроля
unsigned char bit_05 : 1;
unsigned char bit_O6 : 1;
unsigned char bit_O7 : 1;
} PORTC_BITS_bit;
struct
{
unsigned FLAG_INT0:1;//ЗАПРОС ВЫЗОВА ОБРАБОТКИ ПРЕРЫВАНИЯ INT0
unsigned DEMAND_4ms:1;//Запрос вызова группы 4mS
unsigned DEMAND_8ms:1;//Запрос вызова группы 8mS
};
signed int __idata *INF_BUFF_PTR1;
signed int __idata *INF_BUFF_PTR2;

unsigned int __idata TIME_CURRENT;//СЧЕТЧИК ТЕКУЩЕГО ВРЕМЕНИ
unsigned char __idata NUMBER_CHECK;//СЧЕТЧИК ЗАПРОСОВ ОТ СХЕМЫ КОНТРОЛЯ
unsigned int __idata TC_CUR;//CЧЕТЧИК 100mS ИНТЕРВАЛОВ ДЛЯ ПРОГРАММ ТЕХН.ЦИКЛА

const unsigned char SETUP_TC = 35;//Количество запросов от схемы контроля
//до вызова технологического цикла Ttc =~ 200(53-305) ms

const unsigned char __code PAR_EXCH,SIZE_BUF_EXCH = 2;
const unsigned char __code MAX_NUM_EXCH_ERR = 3;
const unsigned char __code NUM_BYTE_PAR = 1;

__pdata struct OUT_DRV_BUFF_EXT
{
unsigned char COLUMNN_EXT_RAM;//
unsigned char ERROREPK_EXT_RAM;//ТАЙМЕР НЕИСПРАВНОСТИ
unsigned char TOFFEPK_EXT_RAM;//КОНТРОЛЬ
}OUT_DRV_DATA_EXT_RAM;

__pdata unsigned char RECDATA_EXT_RAM;//ПРИНЯТЫЙ БАЙТ

__pdata unsigned char MATR_OLD_EXT_RAM;//БАЙТ ПРЕДЫДУЩЕГО СОСТОЯНИЯ ВХОДНЫХ ЦЕПЕЙ
__pdata unsigned char CNBYT1_EXT_RAM;//БАЙТ ВХОДНЫХ СИГНАЛОВ ДЛЯ МЕЖПРОЦЕССОРНОГО ОБМЕНА

__pdata unsigned char RECDATA2_EXT_RAM;//ВТОРОЙ ПРИНЯТЫЙ БАЙТ
__pdata unsigned char CONTROL1_EXT_RAM;//ПЕРВЫЙ БАЙТ ВНЕШНИХ СИГНАЛОВ
__pdata unsigned char CONTROL2_EXT_RAM;//ВТОРОЙ БАЙТ ВНЕШНИХ СИГНАЛОВ

/******************************************************************************/
/********************** ГОЛОВНОЙ ПРОГРАММНЫЙ МОДУЛЬ ***************************/
void main(void)
{
FLAG_INT0=0;
DEMAND_4ms =1;
P3 = 0xFF;
P2=0;
P1 = 0xED;
PCON = 0x80;//10000000 DOUBLE BAUD RATE
TMOD = 0x25;//00100101 T0 - Режим 1,счетчик,Т1 - Режим 2,таймер
DEMAND_8ms = FLAG_INT0 | DEMAND_4ms;
if( DEMAND_8ms) TC_CUR = 0;
}
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.