lehacheb 0 15 апреля, 2013 Опубликовано 15 апреля, 2013 · Жалоба У меня возникла вот такая проблема при написании программы на ATMEGA1244: когда идет обмен данными с компъютером по UART у меня неожиданно переменные в ОЗУ портятся, принимают значения, которые никогда не должны принимать в программе, т.е. в ОЗУ записывается какой-то мусор. Естетственно это приводит к сбою программы. Это происходит не при каждом запросе, а время от времени на 100-й или 1000-й запрос. Когда обмена нет, программа работает нормально. Это происходит, даже если программа не отвечает на запрос, по самому факту прерывания по UART. Переменные портятся различные, расположенные в разных местах ОЗУ (пробовал менять расположение переменных в ОЗУ). Не могу понять что происходит, с чем это связано. Может кто сталкивался с такой проблемой или может что-то посоветовать. Среда Atmel Studio 6. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kompot 0 15 апреля, 2013 Опубликовано 15 апреля, 2013 · Жалоба У меня возникла вот такая проблема при написании программы на ATMEGA1244: 1. На чем пишете ? (АСМ, Си) 2. Вы подозрительно легко манипулируете положением переменных в памяти. Наверняка делая это неверно. 3. Проверьте указатель стека. Должен указывать на конец ОЗУ. 4. Взаимодействие прерываний с основной программой - вещь нелегкая для правильной реализации. volatile знаете? В качестве теста запретите прерывания от УАРТ и убедитесь что в этом случае данные не портятся. Кстати, УАРТом можно пользоваться и без прерываний. Пилинг слышали? Так это не он. Поллинг. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
lehacheb 0 15 апреля, 2013 Опубликовано 15 апреля, 2013 · Жалоба Я пишу на си Volatile не помогает Портится если только происходят прерывания по UART Можно переделать наверное и без прерываний, только почему с прерываниями такое происходит? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SergeBS 0 15 апреля, 2013 Опубликовано 15 апреля, 2013 · Жалоба Можно переделать наверное и без прерываний, только почему с прерываниями такое происходит? Скорее всего потому, что прием по UART целиком сочинил сам, а не посмотрел в аппнотах, как он правильно делается. И в этом случае переход на обработку без прерываний ничем не поможет. Будет повторена та же ошибка. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
lehacheb 0 16 апреля, 2013 Опубликовано 16 апреля, 2013 · Жалоба А какая ошибка-то? Можете что-то предположить? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
lehacheb 0 16 апреля, 2013 Опубликовано 16 апреля, 2013 · Жалоба Извините, я оказывается вводил в заблуждение, даже если отключить прерывание по UART, и даже отключить прием все равно переменные портятся если идет запрос! Если запросов нет не глючит. Получается это электрические помехи? Интерфейс у меня гальванически развязанный.... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Xenia 36 16 апреля, 2013 Опубликовано 16 апреля, 2013 · Жалоба Может быть со стеком проблемы? На модель посмотрите - в сторону данных стек растёт или в противоположную сторону (т.е. выше или ниже стека расположены данные)? А то когда стека не хватает он может и по ОЗУ пройтись. Возможно, что где-то в прерывании вызывается функция, заводящая кучу локальных переменных, которые поедают стек. Самый простой тест - увеличить размер стека (до возможного максимума) и посмотреть, сказывается ли это на порче содержимого памяти или нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SergeBS 0 16 апреля, 2013 Опубликовано 16 апреля, 2013 · Жалоба Извините, я оказывается вводил в заблуждение, даже если отключить прерывание по UART, и даже отключить прием все равно переменные портятся если идет запрос! Если запросов нет не глючит. Все страньше и страньше... А что за запрос такой, который есть, когда UART отключен? По пунктам, что вообще имеет место? Типа 1. Есть прием из компа по UART каждые ... или чтобы скомандовать ... Принятое вызывает ... Можно отключить? Отключен? Помогло? 2. Есть передача в комп по UART. Когда ..., передается ... Можно отключить? Отключен? Помогло? 3. Есть запрос (куда, откуда?). Он еще идет куда-то (куда?) или когда-то (когда?). И что при этом происходит (должно происходить)? Можно отключить? Отключен? Помогло? Помогает "квадратиками и стрелочками" нарисовать - данные пришли - данные ушли. Поскольку например достаточно просто организовать буфер UART не кольцом (классический), а линейный, и он без очистки забьет все. Вообще такие "глюки" обычно при играх с указателями/массивами возникают. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
lehacheb 0 17 апреля, 2013 Опубликовано 17 апреля, 2013 · Жалоба Проблема решена! Дело было в неудачной разводке печатной платы: проводник RX шел праллельно проводнику от кварца на отрезоке где-то 15 мм на маленьком расстоянии. Ножки на проце соседние и вот, так получилось, и приводило к таким последствиям. Так что аккуратно разводите печатные платы! Спасибо всем кто откликнулся Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zombi 0 18 апреля, 2013 Опубликовано 18 апреля, 2013 · Жалоба У меня возникла вот такая проблема при написании программы на ATMEGA1244: когда идет обмен данными с компъютером по UART ... проводник RX шел праллельно проводнику от кварца на отрезоке где-то 15 мм на маленьком расстоянии. Ножки на проце соседние и вот, так получилось, и приводило к таким последствиям. Можете привести DS на Ваш контроллер и пример разводки пп которая приводила к таким катострофическим последствиям? Пример как не надо делать думаю будет многим полезен. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
lehacheb 0 23 апреля, 2013 Опубликовано 23 апреля, 2013 · Жалоба 7 и 8 ножка процессора это кварц а 9 RX0. Внизу трансформатор мешал расположить кварц прямо под процессором пришлось смещать его вправо, ну и разводка RX0 тоже право пошла. Когда я оторвал дорожку RX0, c расположенной за ней дорожки TX0 уже не наводится, т.е. расстояния между дорожками в 1 мм вполне хватает, а до RX0 тут расстояние всего 0,4 мм. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zombi 0 23 апреля, 2013 Опубликовано 23 апреля, 2013 · Жалоба При такой разводке (кварца, нагрузочных конденсаторов и подключении земли) удивительно что вообще что то работает. пример 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться