![]() |
|
Модераторы: PILOT, ManiaK, Mazzi |
![]()
|
|
| UniBomb |
|
||||
|
Новичок ![]() ![]() ![]() Награды: 1 Профиль Группа: Завсегдатай Сообщений: 1754 Регистрация: 24.10.2006 Где: Санкт-Петербург Репутация: 9 Всего: 97 |
Добрый день. Есть устройство на восьмой меге, которая по шине TWI общается с температурной микросхемой (ADT75). Так вот иногда температура отваливалась (т.е. функции работы с ней возвращали 0), но т.к. устройство пока в разработке я на это внимания не обращал. Потом, когда программа была уже написана я стал её вычищать, оптимизировать и производить другие весёлые действия. Причём функции работы с TWI я не трогал вообще. И как это ни сранно TWI отвалился вообще
Симптомы следующие - после любого действия взвращается код 0xF8, что говорит о том, что предыдущее действие небыло выполнено и флаг TWINT небыл установлен в "1". И после чего установки этого флага можно ждать бесконечно долго. Вот незнаю прям даже что делать... Гляньте поалуйста свежим взглядом на мои функции, может я чего то напортачил:
соответсвенно для работы с ADT75 я использую следующие функции:
Из других полезных сведений - avr-gcc, 0s, подтягивающие резюки номиналом 6,8к(пробовал разные), на шине также ещё висит атмеловский EEPROM 24C04N. |
||||
|
|||||
| UniBomb |
|
|||
|
Новичок ![]() ![]() ![]() Награды: 1 Профиль Группа: Завсегдатай Сообщений: 1754 Регистрация: 24.10.2006 Где: Санкт-Петербург Репутация: 9 Всего: 97 |
я в отчаянии....
|
|||
|
||||
| Severyanin |
|
|||
![]() Исследователь ![]() ![]() Профиль Группа: Участник Сообщений: 554 Регистрация: 31.7.2007 Где: Россия, Омск Репутация: нет Всего: 9 |
UniBomb, на первый взгляд кажется немного диким условие цикла в функции twi_wait_TWINT. Почему ты ждешь именно 0xFF циклов? думаю, логичнее было бы while(1) или for(;;) юзать
Добавлено через 22 секунды попозже подробнее вникнуть попытаюсь))) -------------------- "Звонким вереском скроются наши следы, и не вспомнят о них. Кто поверит нам, рыцарям павшей звезды из отвергнутых книг? Пусть в узоре времен ни стихов. ни имен, но напомнит забывшим их полуночный крик." Тэм Гринхилл "Ужели суслик твоего коварства нагадит в плов доверья моего?". Л.Филатов |
|||
|
||||
| UniBomb |
|
|||
|
Новичок ![]() ![]() ![]() Награды: 1 Профиль Группа: Завсегдатай Сообщений: 1754 Регистрация: 24.10.2006 Где: Санкт-Петербург Репутация: 9 Всего: 97 |
Severyanin, мне наоборот кажется диким
Ведь если флаг TWINT не установится, то программа зависнет в этом месте. Придётся заводить ватчдог, придётся после сброса по ватчдогу восстанавливать последнее стабильное состояние программы и т.д. Число 0xFF взято с потолка, хотя я пробовал и 0xFFFF - результат не меняется. Почему я вообще беру конечное число иттераций? Да потому что если за это время флаг не установился, то я могу смело говорить, что возникла какая то ошибка в модуле TWI и продолжать работать дальше... |
|||
|
||||
| Severyanin |
|
|||
![]() Исследователь ![]() ![]() Профиль Группа: Участник Сообщений: 554 Регистрация: 31.7.2007 Где: Россия, Омск Репутация: нет Всего: 9 |
насколько я помню, задержка на TWI может достигать десятков микросекунд, поэтому он может не успеть за 0xFF циклов сработать. Поэтому все-таки вачдог будет корректнее. А адреса между EEPROM и датчиком правильно распределил? Ты точно обращаешься к датчику? может, по ошибке твои посылки принимает память и, видя некорректные для себя кманды, просто забивает на них?
-------------------- "Звонким вереском скроются наши следы, и не вспомнят о них. Кто поверит нам, рыцарям павшей звезды из отвергнутых книг? Пусть в узоре времен ни стихов. ни имен, но напомнит забывшим их полуночный крик." Тэм Гринхилл "Ужели суслик твоего коварства нагадит в плов доверья моего?". Л.Филатов |
|||
|
||||
| UniBomb |
|
|||
|
Новичок ![]() ![]() ![]() Награды: 1 Профиль Группа: Завсегдатай Сообщений: 1754 Регистрация: 24.10.2006 Где: Санкт-Петербург Репутация: 9 Всего: 97 |
Severyanin, с адресами всё хоршо. Проверено-пеепроверено тыщу раз. Но...
Заметил, что если написать простую программку, которая работает только с температурой. И всё заработало. Значит у меня где то в программе ошибка. Методом исключения я определил, что если убрать одну функцию, то температура работает и в большой программе. Эта функция работы с АЦП. Выяснилось, что если во время преобразования АЦП не уводить мк в спящий режим, то всё работает. Если же как положено перевести мк в режим понижения шумов ацп, то TWI отваливается и программа ведёт себя как написано выше. Вообще мне это кажется странным, ведь функции работы с ацп и twi никогда не работают в одно время. Имею следующую структуру программы:
Это сообщение отредактировал(а) UniBomb - 7.4.2009, 08:38 |
|||
|
||||
| Goodefine |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 11.2.2009 Где: Приднестровье, Ти располь Репутация: нет Всего: нет |
Несколько настораживает массив флоатных чисел в get_from_adc(). Вычислений прибавится на порядок, а то и больше. Это совершенно необязательно:
Вообще, флоат тоже необязательно - практически всегда можно обойтись без него, с достаточной точностью... Я бы сделал примерно так:
И все дальнейшие манипуляции проводить с возвращенным средним значением за восемь последних отсчетов Кстати, а Вы уверены, что после преобразования мега вообще просыпается? Это сообщение отредактировал(а) Goodefine - 8.4.2009, 21:22 |
||||
|
|||||
| UniBomb |
|
|||
|
Новичок ![]() ![]() ![]() Награды: 1 Профиль Группа: Завсегдатай Сообщений: 1754 Регистрация: 24.10.2006 Где: Санкт-Петербург Репутация: 9 Всего: 97 |
На самом деле это черновой вариант. Конечно там есть много чего, что можно упростить. Я просто не занимался ещё этой функцией)))
Нет, не уверен. С одной стороны работают все остальные функции, которые вызываются из главного бесконечного цикла, с другой стороны непросыпание меги могло бы объяснить траблы с TWI, т.к. в режиме сна для понижения шумов в моделу TWI работает только блок сравнения адреса. Можно ли как-нибудь проверить выход из спячки? Это сообщение отредактировал(а) UniBomb - 8.4.2009, 22:15 |
|||
|
||||
| Goodefine |
|
||||||
|
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 11.2.2009 Где: Приднестровье, Ти располь Репутация: нет Всего: нет |
Из-за этого существует вероятность порчи стека. Попробуйте сделать эту функцию минималистической, не тягающей через стек такое... Если дальше вечный цикл крутится, то значит просыпается. Кстати, ждать:
вроде как ненужно - до прерывания АЦП, счетчик флеши (команд) МК и так тактироваться не будет. Соответственно после sleep-а, проц будет спать до самого прерывания. Поэтому лучше убрать этот кусок, дабы не раскладывать потенциальные грабли... Возможно, стоит еще попробовать после преобразования переинициализировать TWI... P.S. Попробуйте также убрать строчку:
Поскольку в режиме подавления шумов, преобразование ацп начнется само, сразу после команды sleep... Внешние прерывания по входам применяются? Если да, тогда лучше записать не MCUCR=0x90, а MCUCR|=0x90; Это сообщение отредактировал(а) Goodefine - 8.4.2009, 23:56 |
||||||
|
|||||||
| UniBomb |
|
|||
|
Новичок ![]() ![]() ![]() Награды: 1 Профиль Группа: Завсегдатай Сообщений: 1754 Регистрация: 24.10.2006 Где: Санкт-Петербург Репутация: 9 Всего: 97 |
Сократил вот до такого:
Сократилось всё где то на 600 байт (при -Os). непомогает. нет. Пока всё без изменений... |
|||
|
||||
| Goodefine |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 11.2.2009 Где: Приднестровье, Ти располь Репутация: нет Всего: нет |
Посмотрите в асмовском листинге, сохраняется ли регистр SREG в обработчике прерывания ацп.
Если нет, можно попробовать, сразу при входе в обработчик завершения ацп, руками в асмовской вставке сохранить в стеке регистр SREG, а непосредственно при выходе восстановить его... |
|||
|
||||
| UniBomb |
|
|||
|
Новичок ![]() ![]() ![]() Награды: 1 Профиль Группа: Завсегдатай Сообщений: 1754 Регистрация: 24.10.2006 Где: Санкт-Петербург Репутация: 9 Всего: 97 |
Goodefine, нет, не сохраняется. EMPTY_INTERRUPT - это просто reti. А в принципе зацем сохранять этот регистр, если изменяется только флаг I? При переходе по соответсвующему вектору этот флаг сбрасывается, а при reti восстанавливается....
|
|||
|
||||
![]()
|
| Правила форума "Микроконтроллеры (MCU) и микропроцессоры (MPU)" | |
|
|
На данный раздел помимо Правил форума распространяются текже следующие правила:
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, PILOT, ManiaK, UniBomb, Mazzi. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Микроконтроллеры (MCU) и микропроцессоры (MPU) | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |