Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту


 
Опции темы
Непрочитано 20.07.2018, 07:11  
yellow87
Вид на жительство
 
Аватар для yellow87
 
Регистрация: 29.04.2007
Адрес: Иркутск
Сообщений: 311
Сказал спасибо: 0
Сказали Спасибо 12 раз(а) в 12 сообщении(ях)
yellow87 на пути к лучшему
Печаль запутался с УАРТом

Регистр приёма байта RCREG имеет вид двухуровнего буфера FIFO, данные в который поступают из программно-недоступного регистра RSR.

Отсюда можно сделать вывод, что обработать первый байт программа может только по пришествии второго, потому что считанный байт записывается в верхний уровень RCREGa, а считывается программой с нижнего. Чтобы принятый байт с верхнего уровня провалился в нижний, придётся по пришествии первого байта считать мусор из нижнего уровня RCREG, и сразу же считать провалившийся с верхнего уровня на нижний этот самый первый пришедший байт. Тогда на верхнем уровне что будет? Случайный мусор, который в следующий раз придётся пропустить? Значит байты надо обрабатывать через один?

Наверное можно до цикла считывания приходящих байт, считать этот самый первый мусор из нижнего уровня, а потом просто с задержкой отправки в один байт проводить обработку. То есть отправленный, к примеру, пятый по очереди байт, будет всего лишь навсего обрабатываться по счёту шестым.

Что ж делать если произошла ошибка фрейма?
Вроде бы как делают так:

Код:
#int_rda  // наступило прерывание по приёму байта в УСАРТ
void  RDA_isr(void)
{
error_rcv=false;
if(FERR) {readbyte=RCREG; error_rcv=true;}
if(OERR) {/////.....................................}
if(error_rcv) return;
switch(readbyte)
	{case 0: ....... break;
	case 1: ....... break;
	case 2: ....... break;
	}
}
Но ведь сомнителен только байт верхнего уровня, поэтому при FERR нужно считать и употребить байт нижнего уровня, тогда сомнительный переместится сверху вниз и только в последующем прерывании его нужно будет пропустить.

А что же тогда происходит при ошибке переполнения приёмника? Выставляется флаг OERR и логика приёмника выключается. Нужно считать два ожидающих байта и включить-выключить разрешение приёма, чтобы работа продолжилась. При этом потерян будет только один байт, который переполнил RSR. Но если я считаю два ожидающих обработки байта чтоже тогда останется в RCREG? Случайный мусор или нули? А при следующем прерывании что делать? Нижний уровень считать и проигнорировать, а уже при следующем прерывании считать и употребить байт нижнего уровня? Или при OERR считать RCREG только один раз, чтобы снова начать опаздывать с обработкой на один байт?

Что-то я совсем запутался в этих условиях... Если кто разобрался, пожалуйста разъясните.
А то я в одном проекте сделал так, в другом сяк, а всё равно глюки случаются

И ещё непонятки с getc();
RCREG расположен по адресу 0x01A
Дизассемблировав код на С я вообще не увидел где-то использование регистра с этим адресом.
Как компилятор CCS это делает?
И как же лучше писать: readbyte=RCREG или readbyte=getc(); ???
Реклама:
yellow87 вне форума  
Непрочитано 20.07.2018, 09:31  
mimuh64
Прописка
 
Регистрация: 29.10.2008
Сообщений: 272
Сказал спасибо: 0
Сказали Спасибо 102 раз(а) в 95 сообщении(ях)
mimuh64 на пути к лучшему
По умолчанию Re: запутался с УАРТом

Сообщение от yellow87 Посмотреть сообщение
Отсюда можно сделать вывод, что обработать первый байт программа может только по пришествии второго, потому что считанный байт записывается в верхний уровень RCREGa, а считывается программой с нижнего. Чтобы принятый байт с верхнего уровня провалился в нижний, придётся по пришествии первого байта считать мусор из нижнего уровня RCREG, и сразу же считать провалившийся с верхнего уровня на нижний этот самый первый пришедший байт.
Не верно, изначально RCREG пустой, поэтому принятый байт протолкнется в самый верх, возникнет прерывание, выполняем прерывание var=RCREG;, обнуляем флаг. Таким образом - прерывание - это минимизация ситуации потери данных.
Вариант второй - работа без прерывания - вот здесь и необходимо то, что написано.
Для прерывания нет необходимости анализировать все перечисленные выше регистры (разве что FERR). Чем короче прерывание тем лучше.

Последний раз редактировалось mimuh64; 20.07.2018 в 09:38.
mimuh64 вне форума  
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Запутался с volatile... MikhailSh Песочница (вопросы новичков) 25 10.03.2017 21:36
DS1307 запутался SerGO_83 Микроконтроллеры, АЦП, память и т.д 11 12.09.2012 10:54
Запутался в даташитах KOL151 Микроконтроллеры, АЦП, память и т.д 23 15.06.2011 11:44
С арифмметика. Запутался приведениях типов AndryG Микроконтроллеры, АЦП, память и т.д 3 10.12.2009 21:56
Программаторы... Запутался совсем. Elya Микроконтроллеры, АЦП, память и т.д 46 09.10.2009 09:00


Часовой пояс GMT +4, время: 21:52.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot