|
|
  |
Программный UART в AVR, Помехоустойчивость |
|
|
|
Sep 13 2005, 08:34
|
Местный
  
Группа: Свой
Сообщений: 235
Регистрация: 9-02-05
Пользователь №: 2 526

|
Цитата(Daisy @ Aug 18 2005, 15:30) Программный УАРТ работает на скорости 115200 в режиме приема. Обмен группами по 4 байта (от Cygnal к AVR), один раз в 700 мс. Однако, где-то один раз в час проскакивает помеха. В результате один байт из 4-х неверен. Помеху можно убрать поставив RC-цепочку на линию передачи. Но ставить не хочется, ибо серия. Какие есть варианты программной фильтрации? Или может быть ещё какие-то идеи? Если помеха проскакивает случайным образом и носит редкий характер, то достаточно передавать контрольную сумму и сравнивать ее на приемном конце. Если она не совпадает - повторить передачу. С Вашей вероятностью возникновения помехи, уверен, три раза повторять передачу не придется.
|
|
|
|
|
Sep 13 2005, 10:37
|
Частый гость
 
Группа: Свой
Сообщений: 96
Регистрация: 29-04-05
Из: г. Жуковский
Пользователь №: 4 606

|
Попробую сейчас объяснить как это было. Исходные данные: *** at90s2313, 10МГц: * с одной стороны принимает данные (4 байта ) по программному УАРТ-у от силабсового сигнала(48МГц) на скорости 115200. интервал посылок 700 мс. * с другой стороны отвечает на однобайтовые запросы т.н. блока искробезопасного пятибайтными ответами по аппаратному УАРТ-у на скорости 2400. Интервал запросов 40 мс. Сначала и то и другое работало по прерываниям. И случалась такая ситуация, что во время обработки прерывания от аппаратного уарт (2400), приходил старт бит байта (прерывание INT1) по программному УАРТ-у(115200). Затем, отслеживая эту ситуация по флагам, приходилось терять посылку, не обращать на неё внимание. И все равно порой что-то да проскакивало, за два часа раз. или за три. Что-то видимо где-то недочищено было, флаг может быть какой-то взводился и не сбрасывался. В настоящее время аппаратный УАРТ (2400) работает без прерывания. В основном цикле анализируются флаги приема и передачи. Так как скорость небольшая, то можно успеть. Программный УАРТ(115200) работает по прерыванию. Принимаю по нему всю посылку до конца, а потом иду проверять флаги аппаратного уарт-а (2400). В таком варианте работает железно. Уже два дня подряд  Про RC-цепочки надо почитать. ТОлько начальство не может и не хочет пойтить на аппаратные доработки, во всяком случае в этой партии. Да и дело-то пока в программе оказалось.
|
|
|
|
|
Sep 14 2005, 09:58
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
Цитата(CDT @ Sep 13 2005, 09:35) Видимо, когда первым вызывал прерывание аппаратный UART, прерывания запрещались, а вложенные не разрешались. В результате со временем возникал конфликт и пропускалась (или откладывалась) обработка очередного фронта программного интерфейса. И я о том же. Отличная иллюстрация того, что у AVR на самом деле НЕТ приоритетной системы прерываний, которая, пусть в урезанном виде (без понятия приоритета процессора) есть у самого захудалого MCS51.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Sep 14 2005, 10:24
|
Знающий
   
Группа: Свой
Сообщений: 709
Регистрация: 3-05-05
Пользователь №: 4 693

|
Цитата Отличная иллюстрация того, что у AVR на самом деле НЕТ приоритетной системы прерываний, которая, пусть в урезанном виде (без понятия приоритета процессора) есть у самого захудалого MCS51. У меня старый-добрый АТ89С2051 выкидывал аналогичные кренделя и с приоритетными прерываниями. Нога ИНТ рядом с ОСЦ, чуть затянутый фронт и подкидон в критичной задаче тут как тут. Емкостишка на ногу рулит.
|
|
|
|
|
Sep 14 2005, 10:49
|
Местный
  
Группа: Свой
Сообщений: 298
Регистрация: 29-08-05
Пользователь №: 8 064

|
[/quote] И я о том же. Отличная иллюстрация того, что у AVR на самом деле НЕТ приоритетной системы прерываний, которая, пусть в урезанном виде (без понятия приоритета процессора) есть у самого захудалого MCS51. [/quote] Как понять НЕТ. Есть. и будет есть. Самый старший приоритет RESET. Затем внешние прерывания, UART где-то в конце. А если надо иначе - то разрешайте глобальное в обработчике прерывания. Лично пользовался и все работало.
|
|
|
|
|
Sep 14 2005, 11:17
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
[quote=&-rey,Sep 14 2005, 13:49] [/quote] И я о том же. Отличная иллюстрация того, что у AVR на самом деле НЕТ приоритетной системы прерываний [/quote] Как понять НЕТ. Есть. и будет есть. Самый старший приоритет RESET. Затем внешние прерывания, UART где-то в конце. А если надо иначе - то разрешайте глобальное в обработчике прерывания. Лично пользовался и все работало. [/quote] Есть??? Ну извините. Берём мегу128. Берём прерывание TIMER1CAPT. Прерывания от таймера 2 и внешние прерывания INT как бы имеют больший приоритет, а прерывания от остальных таймеров и UART как бы имеют меньший приоритет. Пожалуйста, объясните мне, неразумному, как сделать такую вещь. Я хочу, чтобы обработчик TIMER1_CAPT было можно прервать любым внешним прерыванием или прерываниями таймера2, но нельзя прервать прерываниями от таймера3 и от USART-ов. Если я в начале обработчика TIMER1_CAPT поставлю sei, то прерывание TIMER3_OVF, якобы самое низкоприоритетное, сможет прервать мой обработчик наравне с INT0. Ну и где тут приоритетная система??? У AVR НЕТУ приоритетной системы прерываний. Есть "близость к процессору в цепочке запросов", которая решает - кто из двух и более возьмёт управление при одновремённом возникновении запросов, такт в такт. И как часто это происходит? А если "более приоритетное" возникнет на такт позже "менее приоритетного"? А если при этом этом "менее приоритетное" ну очень не хочется прерывать "ещё менее приоритетным", так как "более приоритеное" выписано так, что быстро отработате и выставит флаги, а "ещё менее" может занять процессор на милисекунду, так как для фонового процесса это совсем до лампочки? Итого я утверждаю, что слово "приоритет" применительно к прерываниям у AVR - это скорее маркетинговый термин, чем технический. Когда такая система есть, то более приоритетное прерывание прервёт менее приоритетное как только более приоритетное возникнет - независимо от желания менее приоритетного. У MCS51 это возможно, более приоритетное может прервать менее приоритетное, менее приоритетное не будет вызвано пока более приоритетное не выполнит команду reti. Но у MCS51 нет понятия приоритета процессора и там нельзя "вот на этот период" запретить только менее приоритетные прерывания, а более приоритетные оставить. === MIPS - Meanless Indicator of Performance for Salesmen
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Sep 14 2005, 12:12
|
Местный
  
Группа: Свой
Сообщений: 298
Регистрация: 29-08-05
Пользователь №: 8 064

|
"Я хочу, чтобы обработчик TIMER1_CAPT было можно прервать любым внешним прерыванием или прерываниями таймера2, но нельзя прервать прерываниями от таймера3 и от USART-ов. Если я в начале обработчика TIMER1_CAPT поставлю sei, то прерывание TIMER3_OVF, якобы самое низкоприоритетное, сможет прервать мой обработчик наравне с INT0. Ну и где тут приоритетная система???"
Да, конечно если так ставить задачу, то нужно будет запрещать прерывания по соответствующим таймера3 и USART-ы. а по выходу разрешать их. Изврат ? - согласен. Но если нужно...
" У MCS51 это возможно, более приоритетное может прервать менее приоритетное, менее приоритетное не будет вызвано пока более приоритетное не выполнит команду reti. Но у MCS51 нет понятия приоритета процессора и там нельзя "вот на этот период" запретить только менее приоритетные прерывания, а более приоритетные оставить." А, понял. У MCS51 можно разделить на 2 группы ? Конечно так довольно удобнее. Но ведь они все тратят 12 тактов на команду если Вы не имеете ввиду новые которые как и AVR восновном 1 тактные, но вроде это ядро называют 52 или нет? А с расчета разницы 12 тактов 51 и 1-го AVR разницы заметно не будет.
|
|
|
|
|
Sep 14 2005, 13:26
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
Цитата(mse @ Sep 14 2005, 14:38) "Итого я утверждаю, что слово "приоритет" применительно к прерываниям у AVR - это скорее маркетинговый термин, чем технический." Дык, Атмел никогда не говорил про прерывания с приоритетом. Даже была инфа, что в какие-то АВРы только планируется её ставить. Цитата(doc2467M.pdf @ page 9) The interrupts have priority in accordance with their interrupt vector position. The lower the interrupt vector address, the higher the priority. Т.е. атмел НЕ говорит о наличии приоритетной схемы прерываний (ибо их LSI-11 засмеяла бы), но слово "приортет" упоминает, так как звучит красиво.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Sep 14 2005, 13:35
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
Цитата(&-rey @ Sep 14 2005, 15:12) Да, конечно если так ставить задачу, то нужно будет запрещать прерывания по соответствующим таймера3 и USART-ы. а по выходу разрешать их. Изврат ? - согласен. Но если нужно... А, понял. У MCS51 можно разделить на 2 группы ? Конечно так довольно удобнее. Но ведь они все тратят 12 тактов на команду если Вы не имеете ввиду новые которые как и AVR восновном 1 тактные, но вроде это ядро называют 52 или нет? А с расчета разницы 12 тактов 51 и 1-го AVR разницы заметно не будет. Причём тут число тактов? Это параметр более технологический (что те же цигналы демонстрируют), чем архитектурный. Да и если в каждом прерывании сохранять состояние разрешения прерываний по менее приоритетным, а потом восстанавливать (так как, вообще говоря, может быть неизвестно, разрешены ли они в данный момент), то в терминологии времени заданного процессора (в машинных циклах, а не в тактах кварца) это будет слишком долго до разрешения прерываний более приоритетным и задача класса обсуждаемой выполнена всё равно не будет. Ну и если время не сильно дваит (хотя необходимость в приоритетности прерываний возникает как раз тогда, когда оно давит  ), то всё равно изврат и изврат именно потому, что приоритетной схемы у AVR просто нет.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Sep 14 2005, 14:34
|

Профессионал
    
Группа: Свой
Сообщений: 1 301
Регистрация: 30-11-04
Из: Россия, Н.Новгород
Пользователь №: 1 264

|
Цитата(mse @ Sep 14 2005, 17:46) "Т.е. атмел НЕ говорит о наличии приоритетной схемы прерываний (ибо их LSI-11 засмеяла бы), но слово "приортет" упоминает, так как звучит красиво" Думаю, дело не в красоте. Надо-же как-то объяснить, что из N, одновременно случившихся событий исполнится одно по определённому правилу, и оставшиеся, аналогично. В любом фирменном атмеловском описании на AVR расписана иерархия прерываний и она выполняется - железно. Можете сами проверить - запрограммировав прерывания по входу и подав на них один и тот-же импульсный сигнал. В теле каждого прерывания сделайте вывод в порт и посмотрите осцилографом, 'чья возьмет'...
--------------------
Не корысти ради, не в целях наживы, а во исполнение велений души!
|
|
|
|
|
Sep 15 2005, 05:06
|

Профессионал
    
Группа: Свой
Сообщений: 1 301
Регистрация: 30-11-04
Из: Россия, Н.Новгород
Пользователь №: 1 264

|
Цитата(Andy Mozzhevilov @ Sep 15 2005, 06:53) Цитата(BVU @ Sep 14 2005, 19:34) В любом фирменном атмеловском описании на AVR расписана иерархия прерываний и она выполняется - железно. Можете сами проверить - запрограммировав прерывания по входу и подав на них один и тот-же импульсный сигнал. В теле каждого прерывания сделайте вывод в порт и посмотрите осцилографом, 'чья возьмет'...  О том и речь, что это не приоритетность в нормальном ее понимании. А об приоритетности в 'ее понимании' должен позаботиться сам программист. Аппаратной реализации тут не требуется, а уж если очень хочеться делайте внешние навороты своими руками.
--------------------
Не корысти ради, не в целях наживы, а во исполнение велений души!
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|