Перейти к содержанию
    

Проблема с ATMEGA1244

У меня возникла вот такая проблема при написании программы на ATMEGA1244:

когда идет обмен данными с компъютером по UART у меня неожиданно переменные в

ОЗУ портятся, принимают значения, которые никогда не должны принимать в программе,

т.е. в ОЗУ записывается какой-то мусор. Естетственно это приводит к сбою программы.

Это происходит не при каждом запросе, а время от времени на 100-й или 1000-й запрос.

Когда обмена нет, программа работает нормально.

Это происходит, даже если программа не отвечает на запрос, по самому факту прерывания

по UART. Переменные портятся различные, расположенные в разных местах ОЗУ (пробовал

менять расположение переменных в ОЗУ).

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

или может что-то посоветовать.

Среда Atmel Studio 6.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У меня возникла вот такая проблема при написании программы на ATMEGA1244:

 

 

1. На чем пишете ? (АСМ, Си)

2. Вы подозрительно легко манипулируете положением переменных в памяти. Наверняка делая это неверно.

3. Проверьте указатель стека. Должен указывать на конец ОЗУ.

4. Взаимодействие прерываний с основной программой - вещь нелегкая для правильной реализации.

volatile знаете?

 

В качестве теста запретите прерывания от УАРТ и убедитесь что в этом случае данные не портятся.

Кстати, УАРТом можно пользоваться и без прерываний. Пилинг слышали? Так это не он. Поллинг.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я пишу на си

Volatile не помогает

Портится если только происходят прерывания по UART

Можно переделать наверное и без прерываний, только

почему с прерываниями такое происходит?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Можно переделать наверное и без прерываний, только

почему с прерываниями такое происходит?

Скорее всего потому, что прием по UART целиком сочинил сам, а не посмотрел в аппнотах, как он правильно делается. И в этом случае переход на обработку без прерываний ничем не поможет. Будет повторена та же ошибка.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Извините, я оказывается вводил в заблуждение, даже если отключить прерывание по UART, и даже отключить прием

все равно переменные портятся если идет запрос! Если запросов нет не глючит.

Получается это электрические помехи? Интерфейс у меня гальванически развязанный....

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Может быть со стеком проблемы?

На модель посмотрите - в сторону данных стек растёт или в противоположную сторону (т.е. выше или ниже стека расположены данные)?

А то когда стека не хватает он может и по ОЗУ пройтись.

Возможно, что где-то в прерывании вызывается функция, заводящая кучу локальных переменных, которые поедают стек.

Самый простой тест - увеличить размер стека (до возможного максимума) и посмотреть, сказывается ли это на порче содержимого памяти или нет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Извините, я оказывается вводил в заблуждение, даже если отключить прерывание по UART, и даже отключить прием все равно переменные портятся если идет запрос! Если запросов нет не глючит.

Все страньше и страньше... А что за запрос такой, который есть, когда UART отключен? По пунктам, что вообще имеет место? Типа

1. Есть прием из компа по UART каждые ... или чтобы скомандовать ... Принятое вызывает ...

Можно отключить? Отключен? Помогло?

2. Есть передача в комп по UART. Когда ..., передается ...

Можно отключить? Отключен? Помогло?

3. Есть запрос (куда, откуда?). Он еще идет куда-то (куда?) или когда-то (когда?). И что при этом происходит (должно происходить)?

Можно отключить? Отключен? Помогло?

Помогает "квадратиками и стрелочками" нарисовать - данные пришли - данные ушли. Поскольку например достаточно просто организовать буфер UART не кольцом (классический), а линейный, и он без очистки забьет все. Вообще такие "глюки" обычно при играх с указателями/массивами возникают.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Проблема решена!

Дело было в неудачной разводке печатной платы:

проводник RX шел праллельно проводнику от кварца

на отрезоке где-то 15 мм на маленьком расстоянии.

Ножки на проце соседние и вот, так получилось, и приводило

к таким последствиям. Так что аккуратно разводите печатные платы!

Спасибо всем кто откликнулся

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У меня возникла вот такая проблема при написании программы на ATMEGA1244:

когда идет обмен данными с компъютером по UART ...

проводник RX шел праллельно проводнику от кварца

на отрезоке где-то 15 мм на маленьком расстоянии.

Ножки на проце соседние и вот, так получилось, и приводило

к таким последствиям.

Можете привести DS на Ваш контроллер и пример разводки пп которая приводила к таким катострофическим последствиям?

Пример как не надо делать думаю будет многим полезен.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 и 8 ножка процессора это кварц а 9 RX0. Внизу трансформатор мешал расположить кварц прямо под процессором

пришлось смещать его вправо, ну и разводка RX0 тоже право пошла. Когда я оторвал дорожку RX0, c расположенной

за ней дорожки TX0 уже не наводится, т.е. расстояния между дорожками в 1 мм вполне хватает, а до RX0 тут расстояние

всего 0,4 мм.

post-47508-1366720287_thumb.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

При такой разводке (кварца, нагрузочных конденсаторов и подключении земли) удивительно что вообще что то работает.

пример 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...