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

 
 
> Непонятный глюк с 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
 
Start new topic
Ответов
prottoss
сообщение Mar 16 2013, 13:26
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 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
Сообщение #3


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

Группа: Свой
Сообщений: 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
Сообщение #4


Гуру
******

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



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

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


--------------------
Go to the top of the page
 
+Quote Post
ARV
сообщение Mar 16 2013, 17:25
Сообщение #5


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

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



Цитата(prottoss @ Mar 16 2013, 20:10) *
Согласен. Но как то не сталкивался с подобным - строб, одиночный и достаточно длинный по ширине импульса, наводит в приемник целый байт...
думаю, наводит-то он только стартовый бит...


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- prottoss   Непонятный глюк с Atxmega64A3U   Mar 14 2013, 16:40
- - kovigor   Цитата(prottoss @ Mar 14 2013, 19:40) Два...   Mar 14 2013, 17:01
|- - prottoss   Цитата(kovigor @ Mar 14 2013, 23:01) -Как...   Mar 14 2013, 17:27
- - maksimp   Вероятно ошибка в программе и аппаратные эффекты н...   Mar 14 2013, 18:42
- - prottoss   Да в том то и дело, что нет ни каких переменных и ...   Mar 15 2013, 04:55
- - bob1   Если выставить до строба( PORTD.PIN5CTRL=PORT_ISC_...   Mar 15 2013, 06:13
- - prottoss   Сегодня попробую. Вчера просто думал, что это ...   Mar 15 2013, 07:29
|- - zombi   Цитата(prottoss @ Mar 15 2013, 10:29) ......   Mar 15 2013, 08:04
|- - prottoss   Цитата(zombi @ Mar 15 2013, 14:04) Програ...   Mar 15 2013, 09:17
|- - zombi   Цитата(prottoss @ Mar 15 2013, 13:17) Сос...   Mar 15 2013, 10:50
|- - prottoss   Цитата(zombi @ Mar 15 2013, 16:50) А что,...   Mar 15 2013, 12:26
|- - zombi   Цитата(prottoss @ Mar 15 2013, 16:26) Нет...   Mar 15 2013, 23:47
- - ILYAUL   ЦитатаСтроб (скорее всего из-за разводки печатной ...   Mar 16 2013, 18:31


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

 


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


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