Как проще прочитать один бит из регистра? (Си)

Обсуждаем контроллеры компании Atmel.
Ответить
Мучитель микросхем
Сообщения: 430
Зарегистрирован: Вс апр 18, 2021 15:43:55

Сообщение Kalisnik »

Можно вычислить сумму регистра, но это отнимает время. Как быстро и универсально прочитать один бит из регистра в среде программирования Си?
Реклама
Мудрый кот
Сообщения: 1759
Зарегистрирован: Пт июн 01, 2018 07:28:45

Сообщение parovoZZ »

считываешь регистр и накладываешь битовую маску.
Реклама
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

Смотря для чего читать бит.

Самый простоя вариант накладываем маску
Спойлер

Код: Выделить всё

	if(main_registr & (1<<2))
	{	// бит = 1
		x=1;
	} else 
	{ 	// бит = 0
		x=0;
	}
то же самое и с портом

Код: Выделить всё

	if(PORTB & (1<<2))
	{	// бит = 1
		x=1;
	} else 
	{ 	// бит = 0
		x=0;
	}
но при попытке прочитать

Код: Выделить всё

	x = main_registr & (1<<2);
	x = PORTB & (1<<2);
x=0 либо x=(1<<2)=4
но, существует и другой способ
Спойлерсоюз union

Код: Выделить всё

union mmByte {
struct {
unsigned  b0:1;
unsigned  b1:1;
unsigned  b2:1;
unsigned  b3:1;
unsigned  b4:1;
unsigned  b5:1;
unsigned  b6:1;
unsigned  b7:1;
} mbyte;
 volatile char m_byte;
}__attribute__((packed));

union mmByte mym_reg;
запись в переменную напрямую числом

Код: Выделить всё

mym_reg.m_byte = 196;
либо напрямую в бит

Код: Выделить всё

mym_reg.mbyte.b2 = 1;
соответственно прочитать бит можно так

Код: Выделить всё

x = mym_reg.mbyte.b2;
x=0 либо x=1

Ну а это из области фантастики, работа с регистром порта

Код: Выделить всё

union mmByte * mym_reg2;
mym_reg2  = (void *)&PORTB;
запись число в порт

Код: Выделить всё

mym_reg2->m_byte = 196;
отдельно бит

Код: Выделить всё

mym_reg2->mbyte.b2 = 1;
теперь чтение:
полностью порт

Код: Выделить всё

x = mym_reg2->m_byte;
отдельно бит

Код: Выделить всё

x = mym_reg2->mbyte.b2;
x=0 либо x=1
Достаточно исчерпывающий ответ?
Собутыльник Кота
Аватара пользователя
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01

Сообщение Eddy_Em »

Битовые поля - хуже, т.к. не факт, что компилятор развернет поле в считывание и наложение маски.
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

Eddy_Em писал(а):Битовые поля - хуже,
Смотря какая конечная цель.
Eddy_Em писал(а):т.к. не факт, что компилятор развернет поле в считывание и наложение маски
а мне все равно во что он разворачивает, главное что бы разворачивал так, как мне нужно.
Реклама
Мучитель микросхем
Сообщения: 430
Зарегистрирован: Вс апр 18, 2021 15:43:55

Сообщение Kalisnik »

Dimon456, спасибо.
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18675
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

в "среде" программирования на Си под названием avr-gcc, например, давно все встроено, есть набор макросов для чтения битов
bit_is_set
bit_is_clear
ну а запись битов - это обычная операция И или ИЛИ
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Мучитель микросхем
Сообщения: 430
Зарегистрирован: Вс апр 18, 2021 15:43:55

Сообщение Kalisnik »

ARV, да, проще уже некуда. Спасибо. :)
Ответить

Вернуться в «AVR»