Пн июн 07, 2021 23:36:12
Вт июн 08, 2021 13:09:22
Ср июн 09, 2021 11:08:08
Ср июн 09, 2021 22:24:37
unsigned int USART_Receive( void ) // Получим статус и 9-й бит, затем данные из буфера приемника
{
unsigned char status, resh, resl; // объявим переменные
while ( !(UCSR0A & (1<<RXC0)) ); // ожидаем завершения приема (получение данных)
status = UCSR0A; // считываем значение регистра статуса (UCSR0A) в переменную (status), ( тут у нас флаги FE0, DOR0, UPE0)
resh = UCSR0B; // считываем значение регистра управления (UCSR0B) в переменную (resh), в нем же 9 по счету бит (RXB80)
resl = UDR0; // считываем полученный 8 битный байт данных из регистра данных (UDR0)
if ( status & (1<<FE0)|(1<<DOR0)|(1<<UPE0) ) // проверяем установлены ли биты (FE0, DOR0, UPE0), если хоть один бит установлен, то выполняем код в скобках
{
return -1; // ошибка приемопередачи модуля USART0
}
resh = (resh >> 1) & 0x01; // сместим байт (resh) на одну позицию вправо, тем самым бит принимаемых данных (RXB80) с 1 позиции в байте перейдет на 0 позицию,
// затем затем на этот байт набросим маску 0x01 и все разряды обнулятся кроме нулевого разряда, в нем будет значение бита (RXB80)
return ((resh << 8) | resl); // сместим бит (RXB80) в 9 по счету бит, а в восемь остальных младших бит поместим значение из (UDR0)
}
uint16_t USART_Receive( void ) // прием 9-ти битной посылки в режиме (9-N-1). выдаем из функции через ретурн 2-х байтное слово
{ // 8-0-ой разряд ---------- младший байт посылки
// 9-ой разряд --- бит (RXB80) -- 9 бит посылки
// 10-ый разряд --- бит (UPE0) -- Флаг ошибки контроля четности
// 11-ой разряд --- бит (DOR0) -- Флаг переполнения
// 12-ий разряд --- бит (FE0) -- Флаг ошибки кадрирования
while ( !(UCSR0A & (1<<RXC0)) ); // ожидаем завершения приема ( ПРИМЕНЯЕМ ЭТУ СТРОКУ, ЕСЛИ ФУНКЦИЯ РАБОТАЕТ НЕ В ПРЕРЫВАНИИ ПО ЗАВЕРШЕНИЮ ПРИЕМА)
uint8_t status, resh, resl, err_stat; // объявим переменные
status = UCSR0A; // считываем значение регистра статуса (UCSR0A) в переменную (status), ( тут у нас флаги FE0, DOR0, UPE0)
resh = UCSR0B; // считываем значение регистра управления (UCSR0B) в переменную (resh), в нем же 9 бит (RXB80)
resl = UDR0; // считываем полученый 8 битный байт данных из регистра данных (UDR0)
status = (status >> 1) & 0x0E; // сместим байт (status) на одну позицию вправо, тем самым бит (UPE0) со 2-го разряда перейдет в 1-ой, бит (DOR0) с 3-го
// во 2-ый, бит (FE0) с 4-го в 3-ой, затем на байт набросим маску 0x0E и все разряды обнулятся кроме 1,2,3 в которых
// теперь наши статусные биты (FE0, DOR0, UPE0)
if (resh & 0x02) // проверяем 1 разряд переменной (resh) он же (RXB80) , если этот бит = 1, то выполняется выражение в скобках
{
status |= (1<<0); // установить в 1 нулевой разряд переменной (status), остальные биты не трогаем
}
else // иначе если 1 бит переменной (resh) равен 0 , то выполняется выражение в скобках
{
status &= ~(1<<0); // сбросить в 0 нулевой разряд переменной (status), остальные биты не трогаем
}
// теперь в переменной (status) у нас биты: 0-ой разряд --- бит (RXB80)
// 1-ый разряд --- бит (UPE0)
// 2-ой разряд --- бит (DOR0)
// 3-ий разряд --- бит (FE0)
return ((status << 8) | resl); // сместим байт (status) в старший байт двухбайтового слова и получится такая картина--
// 9-ой разряд --- бит (RXB80) -- 9 бит посылки
// 10-ый разряд --- бит (UPE0) -- Флаг ошибки контроля четности
// 11-ой разряд --- бит (DOR0) -- Флаг переполнения
// 12-ий разряд --- бит (FE0) -- Флаг ошибки кадрирования
// а в восемь остальных младших бит поместим значение из (UDR0)
Пн июн 14, 2021 22:59:02
Вт июн 15, 2021 23:16:17