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

Подскажите где ошибка в коде. Хочу записывать значение массива Latchs по битам в порт P2.5 (Data_out). Компилятор ошибок не видит, но и не работает.

Main.c

Код
sbit CLK_out  = P2^6;
sbit Data_out = P2^5;
sbit LE_out     = P2^3;
.......................................
void Init_latch(void)

    {
      unsigned char i;
      for(i=0; i<24; i++)

         {
               CLK_out = 0;      
           Data_out = Latchs[0]^i;
           CLK_out = 1;
           CLK_out = 0;        
         }
             LE_out = 0;
           LE_out = 1;
           LE_out = 0;
    }


Latchs.h

Код
#define Length_shift_register 0x01    

long bdata Latchs [Length_shift_register] =
      
       {
      
      0xAA // 00000000000000000000000010101010
                    
    };
Палыч
Цитата(Makeda @ Oct 17 2012, 11:14) *
Подскажите где ошибка в коде.
Код
Data_out = Latchs[0]^i;

Выражение Latchs[0]^i - сложение по модулю 2 (исключающее ИЛИ) двух операндов, а не взятие бита i из Latchs[0], как это, вероятно, Вы подумали. Вероятно, Вас ввело в заблуждение записи типа:
Код
sbit CLK_out  = P2^6;
Но, в данном случае, это исключение из правил - расширение языка, где символ " ^ " не является оператором...
Правильнее записать, что-то типа этого:
Код
Data_out = (Latchs[0] >> i) & 0x01;

Выделять под массив Latchs область памяти BDATA в вашем случае не имеет никакого смысла...

P.S. Хорошо бы при вопросе указывать информацию о трансляторе и микроконтроллере.
Makeda
Ввел в заблуждение вот этот пример

Цитата
Bit-Addressable Objects
Bit-addressable objects are objects that may be addressed as words or as bits. Only data objects that occupy the bit-addressable area of the 8051 internal memory fall into this category.

The Cx51 Compiler places variables declared with the bdata memory type into the bit-addressable area. Furthermore, variables declared with the bdata memory type must be global (declared outside the scope of a function). You may declare these variables as shown below:

int bdata ibase; /* Bit-addressable int */

char bdata bary [4]; /* Bit-addressable array */
The variables ibase and bary are bit-addressable. Therefore, the individual bits of these variables may be directly accessed and modified. Use the sbit keyword to declare new variables that access the bits of bdata variables. For example:

sbit mybit0 = ibase ^ 0; /* bit 0 of ibase */
sbit mybit15 = ibase ^ 15; /* bit 15 of ibase */

sbit Ary07 = bary[0] ^ 7; /* bit 7 of bary[0] */
sbit Ary37 = bary[3] ^ 7; /* bit 7 of bary[3] */


Использую AT89S52, пишу в Keil uVision.

Цитата
Data_out = (Latchs[0] >> i) & 0x01;


В вашем примере при присваивании значения типа long переменной Data_out типа sbit старшие разряды отбрасываются, а присваивается только нулевой разряд. Так?
Палыч
Цитата(Makeda @ Oct 17 2012, 14:04) *
Так?

Значение Latchs[0] сдвигается вправо на i разрядов, младший бит получившегося значения пересылается в Data_out. Т.е. в теле цикла в Data_out передается i-ый бит Latchs[0].
Makeda
Ясно. Спасибо.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.