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

 
 
 
Reply to this topicStart new topic
> прочитать бит из байта
Azat
сообщение May 12 2008, 12:55
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 24
Регистрация: 18-04-08
Пользователь №: 36 883



Считал состояние порта в переменную типа unsigned char, а потом хочу определить состояние скажем 2-го бита. Как это сделать? С помощью сдвигов?! И еще, нужно будет установить скажем 3-й бит порта А в "0". Тоже как это сделать?
Go to the top of the page
 
+Quote Post
vet
сообщение May 12 2008, 12:57
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 550
Регистрация: 16-06-04
Из: Казань
Пользователь №: 32



CodeVisionAVR, подозреваю?
PORTA.3 = 0;
if (PINA.2==0) { ... }


--------------------
Главная линия этого опуса ясна мне насквозь!
Go to the top of the page
 
+Quote Post
Палыч
сообщение May 12 2008, 12:59
Сообщение #3


Гуру
******

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



unsigned char x;
if(x & (1< <2)) { /* бит равен 1 */ }
else { /* бит равен 0 */}

PORTA&= ~(1< <3);
Go to the top of the page
 
+Quote Post
Azat
сообщение May 12 2008, 13:08
Сообщение #4


Участник
*

Группа: Новичок
Сообщений: 24
Регистрация: 18-04-08
Пользователь №: 36 883



Цитата(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
Go to the top of the page
 
+Quote Post
mdmitry
сообщение May 12 2008, 13:42
Сообщение #5


Начинающий профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 25-10-06
Из: СПб
Пользователь №: 21 648



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

while(!(SPSR &_BV(SPIF)))
;
а это ожидание флага (бита) SPIF в регистре SPSR для SPI.


--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
Go to the top of the page
 
+Quote Post
Палыч
сообщение May 12 2008, 13:46
Сообщение #6


Гуру
******

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



Удобно завести макрос типа такого
#define BIT(n) (1< < n)
и записывать, примерно, так
PORTA &= ~BIT(3);

P.S. Ага! Как видно из поста выше: в WinAVR подобный макрос есть...
Go to the top of the page
 
+Quote Post
smk
сообщение May 12 2008, 13:51
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



Доступ к ячейкам памяти ввода-вывода
Доступ к памяти ввода-вывода микроконтроллера 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 */
}


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
mdmitry
сообщение May 12 2008, 14:09
Сообщение #8


Начинающий профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 25-10-06
Из: СПб
Пользователь №: 21 648



Цитата(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.


--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
Go to the top of the page
 
+Quote Post

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

 


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


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