|
MSP430F449: сброс при помощи WTD не одно и тоже что сброс при включении питания ?! |
|
|
|
Jun 3 2009, 12:26
|
Участник

Группа: Участник
Сообщений: 53
Регистрация: 19-05-09
Пользователь №: 49 263

|
Пытаюсь сбросить проц кодом ниже( два разных): Код ENTER_CRITICAL_SECTION(); WDTCTL = 0x5A03; // WDT: FAST RESET for(;;){} //................................................................................ ...... ENTER_CRITICAL_SECTION(); WDTCTL = 0x1203; // WDT BAD PSW - RESET: for(;;){} Сброс происходит( вкрайнем случае на main() прыгает), регистры периферии не обнуляются( проверил в отладке) Поведение проги абсолютно разное при POR и PUC! В чем может быть проблема? Или как еще программно перезапустить проц "по полной"( вся переферия в нулях должна стать)?
Сообщение отредактировал pt200 - Jun 3 2009, 12:49
|
|
|
|
|
Jun 4 2009, 07:17
|
Участник

Группа: Участник
Сообщений: 53
Регистрация: 19-05-09
Пользователь №: 49 263

|
Проблемка тут возникла. после такого сброса я могу получить прерывание до его включения  Может книбудь всетаки такую задачку как то решал? P.S. Этот форум какойто караул. Не могу отредактировать своеже сообщение( на другом компе, на рабочем еще не пробовал еще)
|
|
|
|
|
Jun 4 2009, 09:18
|
Участник

Группа: Участник
Сообщений: 53
Регистрация: 19-05-09
Пользователь №: 49 263

|
Цитата(MrYuran @ Jun 4 2009, 11:24)  Можете, но недолго. Пару часов, по-моему.
Может, у вас вочдог вместо ресета вектор NMI вызывает? Кстати, интересная тема. У меня однажды тоже возникло ощущение, что внутренний WDT сбрасывает как-то не так, как внешний Насчет таймаута не знал Попробовал по даташиту запрограммироввать WTD: Код ENTER_CRITICAL_SECTION(); WDTCTL = WDTPW | WDTHOLD; WDTCTL = 0x1234; //WDT BAD PSW -> RESET for(;;){} //............................................................................ ENTER_CRITICAL_SECTION(); WDTCTL = WDTPW | WDTHOLD; WDTCTL = WDTPW | WDTIS1 | WDTIS0; //WDT MAX FAST RESET for(;;){} тоже самое( в маин попадаю, а вот регисты у переферии все заполнены уже)  P.S. Схему дорабатывать нельзя. P.S.2 Поковырялся я тут в даташитах( как всегда после долгих мучений  ) и пришел к выводу что сбросить переферию программно нельзя. Для чего они такой корявый WDT сделали???
Сообщение отредактировал pt200 - Jun 4 2009, 09:39
|
|
|
|
|
Jun 4 2009, 09:56
|
Участник

Группа: Участник
Сообщений: 53
Регистрация: 19-05-09
Пользователь №: 49 263

|
Цитата(Сергей Борщ @ Jun 4 2009, 13:36)  А может быть используется какая-то функция инициализации периферии до main(), как __low_level_init() в IAR? Используется, но переферия там не трогается. И при первом запуске то все нормально, а вот после чудо ресета, начинается.... P.S. Хотя вот тут пишут что вроде как все чистится при таком ресете Посетить мою домашнюю страницу. Люди у кого под рукой есть отладка с макеткой и если не тяжело попробуйте.
|
|
|
|
|
Jun 4 2009, 11:17
|
Участник

Группа: Участник
Сообщений: 53
Регистрация: 19-05-09
Пользователь №: 49 263

|
Цитата(rezident @ Jun 4 2009, 14:55)  Довольно странное заключение после чтения документации-то. В low_level_init инициализируйте все регистры периферии явными значениями и будет вам счастье, невзирая на PUC и POR. это называется конфигурирование, а не сброс.Я о "высоком" говорю  , а Вы про всякие мелочи( кстати обнулять переферию надо будет до сброса, а не в low_level_init ). Вроде как я и хотел нормальный сброс чтобы за переферией не следить, кого иницализировал, кого нет, а тут такое. Я если честно вообще плохо понимаю тогда алгоритм использования WDT( программа начинает сначала, а периферия долбит по старому пока программа до нее не доберется)??? P.S. Кстати раз регистры не сбрасываются, возможно ли возникновение прерывания до low_level_init ( тогда вообще караул)?
Сообщение отредактировал pt200 - Jun 4 2009, 11:19
|
|
|
|
|
Jun 5 2009, 04:48
|

Беспросветный оптимист
     
Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646

|
Цитата(rezident @ Jun 4 2009, 18:18)  Вообще-то следует уточнять, про какую именно периферию идет речь? И как именно это проверяется? Записал в P2OUT какое-то значение, потом подал внешний сброс, потом прочитал - а там то, что я записал. Это всё в процессе исследования форт-ядра. Подозреваю, что другая периферия тоже ведёт себя подобным образом. Видимо, решили сэкономить на ресетах
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
Jun 5 2009, 06:49
|
Участник

Группа: Участник
Сообщений: 53
Регистрация: 19-05-09
Пользователь №: 49 263

|
Как говорится самое время обратиться к документации  Открыв описание ужаснулся: часть регистров сбрасывается при POR, часть при PUC, а некоторые вообще не изменяются Короче без книжки и неподходи.
Сообщение отредактировал pt200 - Jun 5 2009, 06:49
|
|
|
|
|
Jun 5 2009, 12:17
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(MrYuran @ Jun 5 2009, 10:48)  Записал в P2OUT какое-то значение, потом подал внешний сброс, потом прочитал - а там то, что я записал. Вот потому я и просил указать, что именно не сбрасывается? Как и предполагалось причина в невнимательном чтении документации  Читаем "тщательнЕе" раздел Digital I/O Registers в User's Manual.
Эскизы прикрепленных изображений
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|