реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Использование bdata, Как павельно работать с bdata
Makeda
сообщение Oct 17 2012, 07:14
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 60
Регистрация: 9-08-12
Пользователь №: 73 076



Здравствуйте.

Подскажите где ошибка в коде. Хочу записывать значение массива 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
                    
    };
Go to the top of the page
 
+Quote Post
Палыч
сообщение Oct 17 2012, 08:03
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(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. Хорошо бы при вопросе указывать информацию о трансляторе и микроконтроллере.
Go to the top of the page
 
+Quote Post
Makeda
сообщение Oct 17 2012, 10:04
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 60
Регистрация: 9-08-12
Пользователь №: 73 076



Ввел в заблуждение вот этот пример

Цитата
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 старшие разряды отбрасываются, а присваивается только нулевой разряд. Так?
Go to the top of the page
 
+Quote Post
Палыч
сообщение Oct 17 2012, 10:27
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(Makeda @ Oct 17 2012, 14:04) *
Так?

Значение Latchs[0] сдвигается вправо на i разрядов, младший бит получившегося значения пересылается в Data_out. Т.е. в теле цикла в Data_out передается i-ый бит Latchs[0].
Go to the top of the page
 
+Quote Post
Makeda
сообщение Oct 17 2012, 12:04
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 60
Регистрация: 9-08-12
Пользователь №: 73 076



Ясно. Спасибо.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 05:43
Рейтинг@Mail.ru


Страница сгенерированна за 0.01376 секунд с 7
ELECTRONIX ©2004-2016