Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Проблема с ATMEGA1244
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
lehacheb
У меня возникла вот такая проблема при написании программы на ATMEGA1244:
когда идет обмен данными с компъютером по UART у меня неожиданно переменные в
ОЗУ портятся, принимают значения, которые никогда не должны принимать в программе,
т.е. в ОЗУ записывается какой-то мусор. Естетственно это приводит к сбою программы.
Это происходит не при каждом запросе, а время от времени на 100-й или 1000-й запрос.
Когда обмена нет, программа работает нормально.
Это происходит, даже если программа не отвечает на запрос, по самому факту прерывания
по UART. Переменные портятся различные, расположенные в разных местах ОЗУ (пробовал
менять расположение переменных в ОЗУ).
Не могу понять что происходит, с чем это связано. Может кто сталкивался с такой проблемой
или может что-то посоветовать.
Среда Atmel Studio 6.
Kompot
Цитата(lehacheb @ Apr 15 2013, 09:04) *
У меня возникла вот такая проблема при написании программы на ATMEGA1244:



1. На чем пишете ? (АСМ, Си)
2. Вы подозрительно легко манипулируете положением переменных в памяти. Наверняка делая это неверно.
3. Проверьте указатель стека. Должен указывать на конец ОЗУ.
4. Взаимодействие прерываний с основной программой - вещь нелегкая для правильной реализации.
volatile знаете?

В качестве теста запретите прерывания от УАРТ и убедитесь что в этом случае данные не портятся.
Кстати, УАРТом можно пользоваться и без прерываний. Пилинг слышали? Так это не он. Поллинг.
lehacheb
Я пишу на си
Volatile не помогает
Портится если только происходят прерывания по UART
Можно переделать наверное и без прерываний, только
почему с прерываниями такое происходит?
SergeBS
Цитата(lehacheb @ Apr 15 2013, 11:21) *
Можно переделать наверное и без прерываний, только
почему с прерываниями такое происходит?

Скорее всего потому, что прием по UART целиком сочинил сам, а не посмотрел в аппнотах, как он правильно делается. И в этом случае переход на обработку без прерываний ничем не поможет. Будет повторена та же ошибка.
lehacheb
А какая ошибка-то? Можете что-то предположить?
lehacheb
Извините, я оказывается вводил в заблуждение, даже если отключить прерывание по UART, и даже отключить прием
все равно переменные портятся если идет запрос! Если запросов нет не глючит.
Получается это электрические помехи? Интерфейс у меня гальванически развязанный....
Xenia
Может быть со стеком проблемы?
На модель посмотрите - в сторону данных стек растёт или в противоположную сторону (т.е. выше или ниже стека расположены данные)?
А то когда стека не хватает он может и по ОЗУ пройтись.
Возможно, что где-то в прерывании вызывается функция, заводящая кучу локальных переменных, которые поедают стек.
Самый простой тест - увеличить размер стека (до возможного максимума) и посмотреть, сказывается ли это на порче содержимого памяти или нет.
SergeBS
Цитата(lehacheb @ Apr 16 2013, 08:54) *
Извините, я оказывается вводил в заблуждение, даже если отключить прерывание по UART, и даже отключить прием все равно переменные портятся если идет запрос! Если запросов нет не глючит.

Все страньше и страньше... А что за запрос такой, который есть, когда UART отключен? По пунктам, что вообще имеет место? Типа
1. Есть прием из компа по UART каждые ... или чтобы скомандовать ... Принятое вызывает ...
Можно отключить? Отключен? Помогло?
2. Есть передача в комп по UART. Когда ..., передается ...
Можно отключить? Отключен? Помогло?
3. Есть запрос (куда, откуда?). Он еще идет куда-то (куда?) или когда-то (когда?). И что при этом происходит (должно происходить)?
Можно отключить? Отключен? Помогло?
Помогает "квадратиками и стрелочками" нарисовать - данные пришли - данные ушли. Поскольку например достаточно просто организовать буфер UART не кольцом (классический), а линейный, и он без очистки забьет все. Вообще такие "глюки" обычно при играх с указателями/массивами возникают.
lehacheb
Проблема решена!
Дело было в неудачной разводке печатной платы:
проводник RX шел праллельно проводнику от кварца
на отрезоке где-то 15 мм на маленьком расстоянии.
Ножки на проце соседние и вот, так получилось, и приводило
к таким последствиям. Так что аккуратно разводите печатные платы!
Спасибо всем кто откликнулся
zombi
Цитата(lehacheb @ Apr 15 2013, 09:04) *
У меня возникла вот такая проблема при написании программы на ATMEGA1244:
когда идет обмен данными с компъютером по UART ...

Цитата(lehacheb @ Apr 17 2013, 13:23) *
проводник RX шел праллельно проводнику от кварца
на отрезоке где-то 15 мм на маленьком расстоянии.
Ножки на проце соседние и вот, так получилось, и приводило
к таким последствиям.

Можете привести DS на Ваш контроллер и пример разводки пп которая приводила к таким катострофическим последствиям?
Пример как не надо делать думаю будет многим полезен.
lehacheb
7 и 8 ножка процессора это кварц а 9 RX0. Внизу трансформатор мешал расположить кварц прямо под процессором
пришлось смещать его вправо, ну и разводка RX0 тоже право пошла. Когда я оторвал дорожку RX0, c расположенной
за ней дорожки TX0 уже не наводится, т.е. расстояния между дорожками в 1 мм вполне хватает, а до RX0 тут расстояние
всего 0,4 мм.
zombi
При такой разводке (кварца, нагрузочных конденсаторов и подключении земли) удивительно что вообще что то работает.
пример 1
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.