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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> Битовые области в WinAVR
demiurg_spb
сообщение Nov 9 2011, 13:13
Сообщение #16


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Скачайте WinAVR да посмотрите заголовочные файлы любой XMega
а также любой тулчейн для ARM и в нём заголовочные файлы любого контроллера.
Так и сможете понять два применяемых там метода (с разименованными указателями и нет).
CODE
typedef struct ADC_struct /* Analog-to-Digital Converter */
{
register8_t CTRLA; /* Control Register A */
register8_t CTRLB; /* Control Register B */
...
ADC_CH_t CH2; /* ADC Channel 2 */
ADC_CH_t CH3; /* ADC Channel 3 */
} ADC_t;

#define ADCA (*(ADC_t *) 0x0200) /* Analog to Digital Converter A */
#define ADCB (*(ADC_t *) 0x0240) /* Analog to Digital Converter B */


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Палыч
сообщение Nov 9 2011, 15:23
Сообщение #17


Гуру
******

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



Цитата(MaxiMuz @ Nov 9 2011, 16:31) *
как теперь сделать так чтобы битовая область находилась в регистре МК как глобальная переменная ?

О каком регистре идёт речь? General Purpose Working Register? Тогда как-то так:
Код
register struct
{
  char One : 1;
  char bTwo : 1;
  char bFree : 1;
}  Bfield   asm ("r6");
Go to the top of the page
 
+Quote Post
MaxiMuz
сообщение Nov 14 2011, 08:30
Сообщение #18


Местный
***

Группа: Участник
Сообщений: 253
Регистрация: 15-04-10
Из: Волгоград
Пользователь №: 56 658



Спасибо Палыч , работает sm.gif
Go to the top of the page
 
+Quote Post
MaxiMuz
сообщение Jan 18 2012, 18:02
Сообщение #19


Местный
***

Группа: Участник
Сообщений: 253
Регистрация: 15-04-10
Из: Волгоград
Пользователь №: 56 658



Решил не создавать новой темы.
Вообщем нужно в битовую область размером в байт записать некую переменную с таким же размером.
Сделал указатель на структуру (битовую область):
Код
volatile struct
{
  uint8_t bOne : 1;
  uint8_t bTwo : 1;
  uint8_t bThree : 1;
  uint8_t bFour : 1;
}  *RF;

обращаюсь к ней:
Код
(*RF).bOne=1;

но выражение:
Код
volatile uint8_t Cnt1;
.....
(*RF)=Cnt1;
выдает ошибку:
Цитата
error: incompatible types in assignment

Размеры здесь вроде совпадают. Как правильно целиком записать байт в ячейку битового поля?

Сообщение отредактировал MaxiMuz - Jan 18 2012, 18:05
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jan 18 2012, 18:28
Сообщение #20


Гуру
******

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



Цитата(MaxiMuz @ Jan 18 2012, 22:02) *
Как правильно ...?

Используйте union
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Jan 18 2012, 18:36
Сообщение #21


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(MaxiMuz @ Jan 18 2012, 20:02) *
Решил не создавать новой темы.
Вообщем нужно в битовую область размером в байт записать некую переменную с таким же размером.
Сделал указатель на структуру (битовую область):
Код
volatile struct
{
  uint8_t bOne : 1;
  uint8_t bTwo : 1;
  uint8_t bThree : 1;
  uint8_t bFour : 1;
}  *RF;

обращаюсь к ней:
Код
(*RF).bOne=1;

но выражение:
Код
volatile uint8_t Cnt1;
.....
(*RF)=Cnt1;
выдает ошибку:
Размеры здесь вроде совпадают. Как правильно целиком записать байт в ячейку битового поля?


union можно.
Или так:
Код
volatile struct TestbitBield
{
    unsigned char bOne : 1;
    unsigned char bTwo : 1;
    unsigned char bThree : 1;
    unsigned char bFour : 1;
}  RF; /// !!! не *RF
unsigned char Cnt1;

RF.bOne=1;
unsigned char *ptr_dbg=(unsigned char *)&RF;
*ptr_dbg=Cnt1;

Go to the top of the page
 
+Quote Post
Палыч
сообщение Jan 18 2012, 18:46
Сообщение #22


Гуру
******

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



Цитата(_Артём_ @ Jan 18 2012, 22:36) *
Или так

"Наглое" преобразование типа - источник ошибок.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jan 19 2012, 04:43
Сообщение #23


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(MaxiMuz @ Jan 18 2012, 21:02) *
(*RF)=Cnt1;[/code] выдает ошибку:
Правильно выдаёт.
Цитата
Размеры здесь вроде совпадают.
Дело не в размерах а в типах. Вы структуре (агрегату) присваиваете байт.
По аналогии (конечно притянутой за уши): массиву не присвоить значение, это можно сделать лишь его элементу.
Как уже было подмечено, для решения вашей задачи есть специальный инструмент - union.
Он позволяет обращаться к одной сущности по-разному.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
MaxiMuz
сообщение Jan 20 2012, 16:58
Сообщение #24


Местный
***

Группа: Участник
Сообщений: 253
Регистрация: 15-04-10
Из: Волгоград
Пользователь №: 56 658



Всем спасибо!
Используя подставной указатель:
Код
unsigned char *ptr_dbg=(unsigned char *)&RF;
все работает , но код получается грамоздким; с union значительно меньше.

Сообщение отредактировал MaxiMuz - Jan 20 2012, 16:58
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 16th June 2025 - 00:42
Рейтинг@Mail.ru


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