Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: прочитать бит из байта
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему
Azat
Считал состояние порта в переменную типа unsigned char, а потом хочу определить состояние скажем 2-го бита. Как это сделать? С помощью сдвигов?! И еще, нужно будет установить скажем 3-й бит порта А в "0". Тоже как это сделать?
vet
CodeVisionAVR, подозреваю?
PORTA.3 = 0;
if (PINA.2==0) { ... }
Палыч
unsigned char x;
if(x & (1< <2)) { /* бит равен 1 */ }
else { /* бит равен 0 */}

PORTA&= ~(1< <3);
Azat
Цитата(vet @ May 12 2008, 16:57) *
CodeVisionAVR, подозреваю?
PORTA.3 = 0;
if (PINA.2==0) { ... }

У меня WinAvr. Или там все равно?

Цитата(Палыч @ May 12 2008, 16:59) *
unsigned char x;
if(x & (1< <2)) { /* бит равен 1 */ }
else { /* бит равен 0 */}

PORTA&= ~(1< <3);

Спасибо smile.gif
mdmitry
Установить бит: a|= _BV(bit_to_set);
сбросить бит: a &= ~BV(bit_to_set);
_BV() макрос из Winavr.

while(!(SPSR &_BV(SPIF)))
;
а это ожидание флага (бита) SPIF в регистре SPSR для SPI.
Палыч
Удобно завести макрос типа такого
#define BIT(n) (1< < n)
и записывать, примерно, так
PORTA &= ~BIT(3);

P.S. Ага! Как видно из поста выше: в WinAVR подобный макрос есть...
smk
Доступ к ячейкам памяти ввода-вывода
Доступ к памяти ввода-вывода микроконтроллера AVR легко выполняется на Си. Все регистры в памяти ввода-вывода объявляются в файле-заголовке, который обычно называется "ioxxxx.h", где xxxx указывает на тип микроконтроллера AVR. Ниже показаны примеры осуществления доступа к ячейкам памяти ввода-вывода. Под каждой строкой кода на Си показан генерируемый для нее ассемблерный код.
#include <io8515.h> /* включить файл-заголовок с символьными именами */
__C_task void main(void)
{
char temp ;/* объявление временной переменной */
/*Для чтения и записи в любой регистр ввода-вывода */
temp = PIND ;/* Считываем PIND в переменную */
TCCR0 = 0x4F ;/* Запись значения в область ввода-вывода */
/*Установка и сброс одного бита */
PORTB |= (1<<PIND2); /* PIND2 - номер линии ввода-вывода (0..7) порта */
ADCSR &= ~(1<<ADEN); /* Сброс бита ADEN в регистре ADCSR */
/* Установка и сброс с помощью битовых масок */
DDRD |= 0x0C ; /* Установка битов 2 и 3 в регистре DDRD */
ACSR &= ~(0x0C) ; /* Сброс бита 2 и 3 в регистре ACSR */
/* Проверка, установлен или сброшен один бит? */
if(USR & (1<<TXC)) /* Проверка, установлен флаг Tx УАПП? */
{
PORTB |= (1<<PB0) ;
В/В сброшен
while(!(SPSR & (1<<WCOL))) ;/* Ожидание установки флага WCOL */
/* Проверка на равность содержимого регистра В/В битовой маске */
if(UDR & 0xF3) /* Проверка на неравность нулю лог. И между регистром UDR и 0xF3
{
}

/* Установка и сброс бит в регистрах ввода-вывода с помощью макроса */
#define SETBIT(ADDRESS,BIT) (ADDRESS |= (1<<BIT))
#define CLEARBIT(ADDRESS,BIT) (ADDRESS &= ~(1<<BIT))
/* Макрос для проверки одного бита в области ввода-вывода */
#define CHECKBIT(ADDRESS,BIT) (ADDRESS & (1<<BIT))
/* Пример использования */
if(CHECKBIT(PORTD,PIND1)) /* Проверка, PIND1 = 1? */
{
CLEARBIT(PORTD,PIND1); /* Сброс PIND1 порта D*/
}
if(!(CHECKBIT(PORTD,PIND1))) /* Проверка, PIND1 = 0? */
{
SETBIT(PORTD,PIND1); /* Установка PIND1 порта D */
}
mdmitry
Цитата(smk @ May 12 2008, 17:51) *
/* Установка и сброс бит в регистрах ввода-вывода с помощью макроса */
#define SETBIT(ADDRESS,BIT) (ADDRESS |= (1<<BIT))
#define CLEARBIT(ADDRESS,BIT) (ADDRESS &= ~(1<<BIT))
/* Макрос для проверки одного бита в области ввода-вывода */
#define CHECKBIT(ADDRESS,BIT) (ADDRESS & (1<<BIT))
/* Пример использования */
if(CHECKBIT(PORTD,PIND1)) /* Проверка, PIND1 = 1? */
{
CLEARBIT(PORTD,PIND1); /* Сброс PIND1 порта D*/
}
if(!(CHECKBIT(PORTD,PIND1))) /* Проверка, PIND1 = 0? */
{
SETBIT(PORTD,PIND1); /* Установка PIND1 порта D */
}


Очень похоже на
Код
#define     inp(port)   (port)
#define     outp(val, port)   (port) = (val)
#define     inb(port)   (port)
#define     outb(port, val)   (port) = (val)
#define     sbi(port, bit)   (port) |= (1 << (bit))
#define     cbi(port, bit)   (port) &= ~(1 << (bit))

которые не рекомендованы к применению sad.gif
Deprecated List:
Код
Global SIGNAL
    Do not use SIGNAL() in new code. Use ISR() instead.

Global ISR_ALIAS
    For new code, the use of ISR(..., ISR_ALIASOF(...)) is recommended.

Global timer_enable_int

Global enable_external_int

Global INTERRUPT

Global inp

Global outp

Global inb

Global outb

Global sbi

Global cbi

Это все описано в документации к avr-libc.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.