Полезное:
Как сделать разговор полезным и приятным
Как сделать объемную звезду своими руками
Как сделать то, что делать не хочется?
Как сделать погремушку
Как сделать так чтобы женщины сами знакомились с вами
Как сделать идею коммерческой
Как сделать хорошую растяжку ног?
Как сделать наш разум здоровым?
Как сделать, чтобы люди обманывали меньше
Вопрос 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".
В данных функциях считываются все регистры ввода-вывода в файл регистров перед выполнением каких-либо вычислений. Такой подход позволяет наиболее оптимально использовать заполняемость буфера, т.к. буфер становится свободным для приема новых данных, как только это станет возможным.
|