реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Непонятный глюк с Atxmega64A3U, Зависает часть периферии
prottoss
сообщение Mar 14 2013, 16:40
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Привет всем!

Есть устройство в котором задействовано множество периферии.
На PORTD бит 5 является выходом. Используется как стробирующий выход. Пассивное состояние - 0. Управляется программой.
На PORTE задействовано два USART - USARTE0 (для связи с периферийным устройством) и USARTE1 (как отладочный порт для вывода на РС сообщений).

Программа работает следующим образом
1. Инициализируется вся периферия (порты ввода-вывода, USART, таймеры и т.п.)
2. Далее подается строб на PORTD5.

Ситуация следующая:
1. Если питание подано в первый раз то после перехода строба из 0 в 1 вся периферия вешается! Т.е. оба USART не работают и еще часть периферии так же не работает. Программа может зависнуть.

2. Если сбросить процессор не снимая питания, то все работает как задумано.

Отрезал провода от USARTE0, от PORTD5 - ничего не помогло! Начал разбираться с программой. Оказалось, что если я не разрешаю приемник USARTE1, т. е. в регистре CTRLB не устанавливаю бит RXEN то при первой подаче питания все работает как положено.
Далее установил, что если после того, как программа сгенерирует строб, разрешить приемник, то тоже все работает замечательно.

Два дня ломаю голову, чтобы это могло быть? Есть какие нибудь идеи?


--------------------
Go to the top of the page
 
+Quote Post
kovigor
сообщение Mar 14 2013, 17:01
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295



Цитата(prottoss @ Mar 14 2013, 19:40) *
Два дня ломаю голову, чтобы это могло быть? Есть какие нибудь идеи?

-Какие-то из множества выводов питания и земли МК по ошибке остались недодключенными.
-На выводы МК подаются высокие лог. уровни до того, как появляется питание.
-Проблема с питанием, например, оно слишком шумное, или стабилизатор питания возбуждается ...
Go to the top of the page
 
+Quote Post
prottoss
сообщение Mar 14 2013, 17:27
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(kovigor @ Mar 14 2013, 23:01) *
-Какие-то из множества выводов питания и земли МК по ошибке остались недодключенными.
-На выводы МК подаются высокие лог. уровни до того, как появляется питание.
-Проблема с питанием, например, оно слишком шумное, или стабилизатор питания возбуждается ...

1. Все выводы питания подключены
2. Выводы МК все отрезал от периферии. Прозвонил. Ничего не коротит ни на землю, ни на питание.
3. Питание не шумное, вполне себе нормальное.

Кстати, строб подается через 2 секунды после подачи питания, т.е. ни каких пусковых всплесков.


--------------------
Go to the top of the page
 
+Quote Post
maksimp
сообщение Mar 14 2013, 18:42
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 313
Регистрация: 2-07-11
Пользователь №: 66 023



Вероятно ошибка в программе и аппаратные эффекты не при чём.
Цитата(prottoss @ Mar 14 2013, 19:40) *
1. Если питание подано в первый раз то после перехода строба из 0 в 1 вся периферия вешается! Т.е. оба USART не работают и еще часть периферии так же не работает. Программа может зависнуть.
2. Если сбросить процессор не снимая питания, то все работает как задумано.

При сбросе процессора не снимая питания, ОЗУ не стирается. Если какая-нибудь переменная используется без инициализации, такое может быть. Но глабальные переменные всё обнуляются в статовом коде. А стек - не обнуляется. То есть скорее это может быть связано с стековой переменной, или с обращением по указателю совсем мимо.
Go to the top of the page
 
+Quote Post
prottoss
сообщение Mar 15 2013, 04:55
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Да в том то и дело, что нет ни каких переменных и указаталей. Вообще. Выполняется полная инициализация всей периферии, потом этот злополучный строб, который все вешает.

Тестовая программа выглядит так:
1. Инициализация периферии.
2. Строб.
3. Главный цикл

В главном цикле оставил только моргание светодиода.

Если разрешаю именно USARTE0 до выполнения строба - зависон. Если после, программа работает нормально. Главное, что остальные USART- 3 шт., разрешены в инициализации, т.е. до строба.


--------------------
Go to the top of the page
 
+Quote Post
bob1
сообщение Mar 15 2013, 06:13
Сообщение #6


Частый гость
**

Группа: Свой
Сообщений: 82
Регистрация: 17-09-06
Пользователь №: 20 471



Если выставить до строба( PORTD.PIN5CTRL=PORT_ISC_INPUT_DISABLE_gc;) будет зависон?
Go to the top of the page
 
+Quote Post
prottoss
сообщение Mar 15 2013, 07:29
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Сегодня попробую. Вчера просто думал, что это "железная" проблема. В итоге много времени потратил на перерезание дорожек, поисх замыканий, а потом восстановление цепей.
В итоге, когда целых дорожек не осталось, я понял что это ошибка именно внутри контроллера, аппаратная или программная пока мне не понятно. Я закомментировал код инициализации USART и все заработало.
Самое интересное, что для меня более логичным было бы если бы гдюк проявлялся при разрешении передатчика (ибо выход). Но тут оказывается что глюк возникает при разрешении приемника...


--------------------
Go to the top of the page
 
+Quote Post
zombi
сообщение Mar 15 2013, 08:04
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 076
Регистрация: 10-09-08
Пользователь №: 40 106



Цитата(prottoss @ Mar 15 2013, 10:29) *
... аппаратная или программная пока мне не понятно.

Программная 100%
В программе где нибудь анализируется состояние PORTD5 ?
Обработчики прерываний USARTE ?
Go to the top of the page
 
+Quote Post
prottoss
сообщение Mar 15 2013, 09:17
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(zombi @ Mar 15 2013, 14:04) *
Программная 100%
В программе где нибудь анализируется состояние PORTD5 ?
Обработчики прерываний USARTE ?
Состояние PORTD5 не анализируется, ибо это выход.
До обработчкив программа не доходит.

Объясняю еще раз. Оставлена только инициализация периферии и пустой цикл. Все. Нет никакой программы, ни каких переменных. Ничего.


--------------------
Go to the top of the page
 
+Quote Post
zombi
сообщение Mar 15 2013, 10:50
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 2 076
Регистрация: 10-09-08
Пользователь №: 40 106



Цитата(prottoss @ Mar 15 2013, 13:17) *
Состояние PORTD5 не анализируется, ибо это выход.

А что, выход нельзя анализировать?
Цитата(prottoss @ Mar 15 2013, 13:17) *
До обработчкив программа не доходит.

Почему? Прерывания запрещены?
Цитата(prottoss @ Mar 15 2013, 13:17) *
Объясняю еще раз. Оставлена только инициализация периферии и пустой цикл. Все. Нет никакой программы, ни каких переменных. Ничего.

Если нет ничего то как Вы знаете что все либо работает либо не работает?
Go to the top of the page
 
+Quote Post
prottoss
сообщение Mar 15 2013, 12:26
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(zombi @ Mar 15 2013, 16:50) *
А что, выход нельзя анализировать?

Можно но не нужно. Я его анализирую с помощью осциллографа.

Цитата(zombi @ Mar 15 2013, 16:50) *
Почему? Прерывания запрещены?
Нет не запрещены. А какие должны возникать прерывания если программа еще не дошла до основного цикла?

Цитата(zombi @ Mar 15 2013, 16:50) *
Если нет ничего то как Вы знаете что все либо работает либо не работает?
В основном цикле есть моргалка светодиодом. задержка пол-секунды, инвертирование состояния светодиода и т.д.
Так вот я вижу, что если светодиод моргает, значит программа не висит. Если зависла, то светодиод не моргает.

Кстати, анализировал программу в симуляторе AVRStudio - ни каких глюков не выявил.


--------------------
Go to the top of the page
 
+Quote Post
zombi
сообщение Mar 15 2013, 23:47
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 2 076
Регистрация: 10-09-08
Пользователь №: 40 106



Цитата(prottoss @ Mar 15 2013, 16:26) *
Нет не запрещены. А какие должны возникать прерывания если программа еще не дошла до основного цикла?

Откуда я знаю что делает Ваша программа на пути к основному циклу?
А при запрещённых прерываниях диод моргает или тоже зависает?
Go to the top of the page
 
+Quote Post
prottoss
сообщение Mar 16 2013, 13:26
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



С глюком разобрался.
Прав был уважаемый zombi - моя ошибка в программе.
Поясню. Оба USART работают на прерываниях. Так вот, согласно даташита ATXMEGA_AU прерывание по приему (RXC) будет возникать до тех пор, пока не будет прочитан DATA регистр. У меня в обработчике было сделано так, что этот регистр не читался, если была ошибка Frame Error, Buffer Overflow или Parity Error.
Строб (скорее всего из-за разводки печатной платы) производит наводку на линии приемника USARTE0. Приемник принимает байт с ошибкой, но так как программа не читает DATA регистр, это прерывание возникает постоянно.

Переделал программу. Сначала читаю DATA за тем проверяю ошибки. Нет ошибок, складываю данные в буфер, есть ошибка - выхожу из обработчика. Все стало работать как задумано.

Вот такие пироги sm.gif Спасибо всем кто откликнулся.


--------------------
Go to the top of the page
 
+Quote Post
mempfis_
сообщение Mar 16 2013, 15:56
Сообщение #14


Профессионал
*****

Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409



Цитата(prottoss @ Mar 16 2013, 16:26) *
С глюком разобрался.
Прав был уважаемый zombi - моя ошибка в программе.
Поясню. Оба USART работают на прерываниях. Так вот, согласно даташита ATXMEGA_AU прерывание по приему (RXC) будет возникать до тех пор, пока не будет прочитан DATA регистр. У меня в обработчике было сделано так, что этот регистр не читался, если была ошибка Frame Error, Buffer Overflow или Parity Error.


Совсем не относится к мегам но всё-же.
В ARM-процессорах многих производителей uart работает именно по такому принципу. Ещё они любят генерировать прерывание в случае опустошения передающего регистра. И если не заботится о чтении приёмного регистра или забывать запрещать прерывание TXD_EMPTY то можно практически навечно застрять в этих двух прерываниях.
Go to the top of the page
 
+Quote Post
prottoss
сообщение Mar 16 2013, 16:10
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(mempfis_ @ Mar 16 2013, 21:56) *
Совсем не относится к мегам но всё-же.
Согласен. Но как то не сталкивался с подобным - строб, одиночный и достаточно длинный по ширине импульса, наводит в приемник целый байт... Питание чистое. Разведены все линии питания с блокировочными конденсаторами.

Про DRE мне известно и разрешается это прерывание только если в буфере передатчика есть данные.


--------------------
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 4th July 2025 - 09:16
Рейтинг@Mail.ru


Страница сгенерированна за 0.01481 секунд с 7
ELECTRONIX ©2004-2016