Разделы

В сети

Пользователей: 192
Из них просматривают:
Аналоги: 68. Видео: 2. Даташиты: 75. Инструкции: 4. Магазин: 1. Новости: 7. Остальное: 10. Программы: 2. Производители: 1. Профиль пользователя: 1. Расчёты: 1. Теги: 1. Форум: 19.
Участников: 2
Гостей: 190

Google , Яндекс , далее...
Рекорд 2375 человек онлайн установлен 26.12.2015.

Партнёры


Партнёры

Новые объявления

В настоящее время нет объявлений.

Atmega128. Прием данных - Приемник УСАПП

Написал MACTEP 31.03.2010 5:20:00 (Просмотров: 6337)

Прием данных - Приемник УСАПП



 

Работа приемника УСАПП разрешается, если записать лог. 1 в бит разрешения работы приемника (RXEN) в регистре UCSRB. После разрешения работы приемника обычное назначение вывода RxD заменяется на альтернативное: вход последовательного ввода данных приемника УСАПП. Скорость связи, режим работы и формат посылки должны быть установлены однократно перед началом выполнения приема данных. Если используется синхронная работа, то вывод XCK будет использоваться для синхронизации связи.

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

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

В следующих примерах приведены простые функции для организации приема данных, который основан на опросе состояния флага завершения приема (RXC). Если используется формат посылки с числом бит менее 8, то после считывания содержимого UDR старшие неиспользуемые разряды будет обнулены. Перед вызовом данных функций должна быть выполнена инициализация УСАПП.

Пример кода на Ассемблере (1)
USART_Receive:
; Ожидание окончания приема данных
sbis UCSRA, RXC
rjmp USART_Receive
; Загрузка принятых данных из буфера
in r16, UDR
ret
Пример кода на Си (1)
unsigned char USART_Receive( void )
{
/* Ожидание окончания приема данных */
while ( !(UCSRA & (1<<RXC)) );
/* Загрузка принятых данных из буфера */
return UDR;
}

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

Прежде чем считывается содержимое буфера приемника, в функциях выполняется ожидание появления данных в этом буфере путем опроса флага RXC.

Прием посылок с 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".

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

Флаг и прерывание по завершению приема

Приемник УСАПП имеет один флаг, который индицирует состояние приемника.

Флаг завершения приема (RXC) сигнализирует о наличии несчитанных данных в приемном буфере. Данный флаг равен 1, если имеются несчитанные данные, и равен 0, если буфер приемника свободен (т.е. не содержит каких-либо несчитанных данных). Если приемник отключается (RXEN = 0), то приемный буфер будет сброшен и флаг RXC примет нулевое значение.

Если установлен бит разрешения прерывания по завершению приема (RXCIE) в регистре UCSRB, то при установке флага RXC программа переход не вектор обработки данного прерывания (при условии, что активно общее разрешение прерываний). Если используется организация связи с управлением по прерываниям, то при выполнении процедуры обработки запроса на прерывание по завершению приема необходимо считать данные из UDR, чтобы сбросить флаг RXC. В противном случае новое прерывание возникнет сразу после выхода из текущего.

Флаги ошибок приемника

Приемник УСАПП имеет три флага ошибок: ошибка посылки (кадра) FE, переполнение данных DOR и ошибка паритета UPE. Данные флаги входят в состав регистра UCSRA. Общим свойством данных флагов является то, что они хранятся в приемном буфере вместе с той посылкой данных, для которой они отражают состояние ошибок. С учетом этого, необходимо следить, чтобы флаги ошибок считывались из регистра UCSRA перед чтением данных из приемного буфера (UDR), т.к. после чтения из UDR изменяется состояние буфера. Другим сходством флагов ошибок является невозможность программно повлиять на их состояние. Однако, в целях совместимости с УСАПП последующих микроконтроллеров во время записи регистра UCSRA в позициях флагов ошибок необходимо указывать нулевые значения. Ни один из флагов ошибок не может вызвать прерывание.

Флаг ошибки посылки (кадра) FE индицирует состояние первого стоп-бита сохраненной в приемном буфере посылки. Флаг FE равен 0, если стоп-бит имел корректное значение (лог. 1), и равен 1, если некорректное, т.е. 0. Данный флаг может использоваться для выявления условия разсинхронизации, обрыва связи и манипуляции над протоколом связи. Флаг FE не изменяется при установке бита USBS в регистре UCSRC, т.к. приемник игнорирует все стоп-биты за исключением первого. Для совместимости с последующими микроконтроллерами в позиции данного бита необходимо указывать 0 во время записи в регистр UCSRA.

Флаг переполнения данных (DOR) сигнализирует о потере данных из-за переполнения приемного буфера. Переполнение данных возникает, если приемный буфер заполнен (две посылки), в сдвиговом регистре ожидает считывания только что принятая посылка и обнаружен новый старт-бит. Если флаг DOR установлен, то значит одна или более последовательных посылок потеряны между последним и следующим считанными значениями из UDR. Для совместимости с будущими микроконтроллерами в позицию данного бита необходимо всегда записывать лог.0 во время записи в регистр UCSRA. Флаг DOR сбрасывается, если принятая посылка была успешно перемещена из сдвигового регистра в приемный буфер.

Флаг ошибки паритета (UPE) сигнализирует, что во время приема посылки была обнаружена ошибка паритета. Если контроль паритета отключен, то данный флаг всегда имеет нулевое значение. Для совместимости с новыми разработками микроконтроллеров в позицию данного бита необходимо всегда записывать 0 во время записи в регистр UCSRA. См. также "Вычисление бита паритета" и "Устройство проверки паритета"

Устройство проверки паритета

Устройство проверки паритета становится активным после установки бита режима паритета УСАПП UPM1. Тип контроля паритета: четность или нечетность задается битом UPM0. После активизации устройство проверки паритета вычисляет паритет принятых данных и сравнивает полученное значение с принятым вместе с этими данными в одной посылке битом паритета. Результат сравнения запоминается в приемном буфере вместе с принятыми данными и стоп-битом. Флаг ошибки паритета UPE может быть считан программно тогда, когда в посылке имеется ошибка паритета. Бит UPE устанавливается, если в посылке, которая может быть считана из приемного буфера, имеется ошибка паритета и во время приема этой посылки был разрешен контроль паритета (UPM1 = 1). Данный бит должен быть опрошен до считывания буфера приемника (UDR).

Отключение приемника

В отличие от передатчика, отключение приемника происходит незамедлительно. При этом, принимаемые данные будут потеряны. После отключения (т.е. когда RXEN =0) приемник далее не поддерживает альтернативные настройки вывода порта RxD. Приемный буфер FIFO сбрасывается после отключения приемника, следовательно, оставшиеся в нем данные будут потеряны.

Сброс приемного буфера

Приемный буфер FIFO сбрасывается после отключения приемника, т.е. полностью освобождается от своего содержимого. Несчитанные данные будут потеряны. Если буфер необходимо очистить в процессе нормальной работы, например, при возникновении ошибок, то необходимо считывать содержимое UDR пока не очиститься флаг RXC. В следующем примере показано как очистить буфер приемника.

Пример кода на Ассемблере (1)
USART_Flush:
sbis UCSRA, RXC
ret
in r16, UDR
rjmp USART_Flush
Пример кода на Си (1)
void USART_Flush( void )
{
unsigned char dummy;
while ( UCSRA & (1<<RXC) ) dummy = UDR;
}

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


 

<< Предыдущая страница Оглавление Следующая страница >>

Теги:

Комментарии принадлежат их авторам. Мы не несем ответственности за их содержание.

Разное

Интересно

Во время ремонта телевизора не ставьте настольную лампу на его корпус.
Она обязательно упадёт и отобьёт горловину кинескопа.

Похожие статьи