Главная Случайная страница


Полезное:

Как сделать разговор полезным и приятным Как сделать объемную звезду своими руками Как сделать то, что делать не хочется? Как сделать погремушку Как сделать так чтобы женщины сами знакомились с вами Как сделать идею коммерческой Как сделать хорошую растяжку ног? Как сделать наш разум здоровым? Как сделать, чтобы люди обманывали меньше Вопрос 4. Как сделать так, чтобы вас уважали и ценили? Как сделать лучше себе и другим людям Как сделать свидание интересным?


Категории:

АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника






Прием посылок с 9 битами данных





 

Если используется передача 9 бит данных (UCSZ=7), то непосредственно перед чтением младшего байта из UDR необходимо считать значение 9-го бита данных RXB8 в регистре UCSRB. Данное правило также относится к флагам статуса FE, DOR и UPE: сначала опрашиваем состояние UCSRA, а только затем считываем данные из UDR. Данное ограничение связано с тем, что принимаемые данные буферизуются вместе с флагами статуса, поэтому, считывание регистра UDR приводит к изменению состояния приемного буфера FIFO и, следовательно, связанные со считанными данными биты TXB8, FE, DOR и UPE будут потеряны.

 

Ниже приведены примеры функций для организации приема 9 бит данных с флагами статуса.

 

Пример кода на Ассемблере (1)

USART_Receive:

; Ожидание окончания приема данных

sbis UCSRA, RXC

rjmp USART_Receive

; Опрос статусных бит и 9-го бита данных перед чтением данных из буфера

in r18, UCSRA

in r17, UCSRB

in r16, UDR

; Если ошибка, то возврат -1

andi r18,(1<<FE)|(1<<DOR)|(1<<UPE)

breq USART_ReceiveNoError

ldi r17, HIGH(-1)

ldi r16, LOW(-1)

USART_ReceiveNoError:

; Выделение 9-го бита данных перед выходом

lsr r17

andi r17, 0x01

ret

 

Пример кода на Си (1)

unsigned int USART_Receive(void)

{

unsigned char status, resh, resl;

/* Ожидание окончания приема данных */

while (!(UCSRA & (1<<RXC)));

/* Опрос статусных бит и 9-го бита данных перед чтением данных из буфера */

status = UCSRA;

resh = UCSRB;

resl = UDR;

/* Если ошибка, то возврат -1 */

if (status & (1<<FE)|(1<<DOR)|(1<<UPE))

return -1;

/* Выделение 9-го бита данных перед выходом */

resh = (resh >> 1) & 0x01;

return ((resh << 8) | resl);

}

 

Прим. 1: В примере предполагается, что подключен файл специфических заголовков. Для регистров ввода-вывода, которые расположены в области памяти расширенного ввода-вывода необходимо заменить инструкции "IN", "OUT", "SBIS", "SBIC", "CBI" и "SBI" на инструкции, осуществляющие доступ к расширенной памяти ввода-вывода. Обычно это инструкции "LDS" и "STS" в сочетании с "SBRS", "SBRC", "SBR" и "CBR".

 

В данных функциях считываются все регистры ввода-вывода в файл регистров перед выполнением каких-либо вычислений. Такой подход позволяет наиболее оптимально использовать заполняемость буфера, т.к. буфер становится свободным для приема новых данных, как только это станет возможным.

 

Date: 2016-07-05; view: 220; Нарушение авторских прав; Помощь в написании работы --> СЮДА...



mydocx.ru - 2015-2024 year. (0.005 sec.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав - Пожаловаться на публикацию