Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: MSP430F449: сброс при помощи WTD не одно и тоже что сброс при включении питания ?!
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > MSP430
pt200
Пытаюсь сбросить проц кодом ниже( два разных):
Код
  ENTER_CRITICAL_SECTION();
  WDTCTL = 0x5A03; // WDT: FAST RESET
  for(;;){}
//................................................................................
......
  ENTER_CRITICAL_SECTION();
  WDTCTL = 0x1203; // WDT BAD PSW - RESET:
  for(;;){}

Сброс происходит( вкрайнем случае на main() прыгает), регистры периферии не обнуляются( проверил в отладке)

Поведение проги абсолютно разное при POR и PUC!

В чем может быть проблема?
Или как еще программно перезапустить проц "по полной"( вся переферия в нулях должна стать)?
pt200
Проблемка тут возникла. после такого сброса я могу получить прерывание до его включения blink.gif
Может книбудь всетаки такую задачку как то решал?

P.S. Этот форум какойто караул. Не могу отредактировать своеже сообщение( на другом компе, на рабочем еще не пробовал еще) blink.gif
MrYuran
Цитата(pt200 @ Jun 4 2009, 11:17) *
P.S. Этот форум какойто караул. Не могу отредактировать своеже сообщение( на другом компе, на рабочем еще не пробовал еще) blink.gif

Можете, но недолго. Пару часов, по-моему.

Может, у вас вочдог вместо ресета вектор NMI вызывает?
Кстати, интересная тема. У меня однажды тоже возникло ощущение, что внутренний WDT сбрасывает как-то не так, как внешний
pt200
Цитата(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(;;){}

тоже самое( в маин попадаю, а вот регисты у переферии все заполнены уже) help.gif wacko.gif smile3046.gif

P.S. Схему дорабатывать нельзя.
P.S.2 Поковырялся я тут в даташитах( как всегда после долгих мучений smile.gif ) и пришел к выводу что сбросить переферию программно нельзя. Для чего они такой корявый WDT сделали???
Сергей Борщ
Цитата(pt200 @ Jun 4 2009, 12:18) *
тоже самое( в маин попадаю, а вот регисты у переферии все заполнены уже)
А может быть используется какая-то функция инициализации периферии до main(), как __low_level_init() в IAR?
pt200
Цитата(Сергей Борщ @ Jun 4 2009, 13:36) *
А может быть используется какая-то функция инициализации периферии до main(), как __low_level_init() в IAR?

Используется, но переферия там не трогается.
И при первом запуске то все нормально, а вот после чудо ресета, начинается....

P.S. Хотя вот тут пишут что вроде как все чистится при таком ресете Посетить мою домашнюю страницу.
Люди у кого под рукой есть отладка с макеткой и если не тяжело попробуйте.
rezident
Цитата(pt200 @ Jun 4 2009, 15:18) *
и пришел к выводу что сбросить переферию программно нельзя.
Довольно странное заключение после чтения документации-то. В low_level_init инициализируйте все регистры периферии явными значениями и будет вам счастье, невзирая на PUC и POR.
pt200
Цитата(rezident @ Jun 4 2009, 14:55) *
Довольно странное заключение после чтения документации-то. В low_level_init инициализируйте все регистры периферии явными значениями и будет вам счастье, невзирая на PUC и POR.

это называется конфигурирование, а не сброс.
Я о "высоком" говорю smile.gif, а Вы про всякие мелочи( кстати обнулять переферию надо будет до сброса, а не в low_level_init ).

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

Я если честно вообще плохо понимаю тогда алгоритм использования WDT( программа начинает сначала, а периферия долбит по старому пока программа до нее не доберется)??? wacko.gif

P.S. Кстати раз регистры не сбрасываются, возможно ли возникновение прерывания до low_level_init ( тогда вообще караул)?
rezident
Цитата(pt200 @ Jun 4 2009, 17:17) *
Я если честно вообще плохо понимаю тогда алгоритм использования WDT( программа начинает сначала, а периферия долбит по старому пока программа до нее не доберется)??? wacko.gif
Дык а я везде и рекомендую использовать WDT в MSP430 как интервальный таймер smile.gif
Цитата(pt200 @ Jun 4 2009, 17:17) *
P.S. Кстати раз регистры не сбрасываются, возможно ли возникновение прерывания до low_level_init ( тогда вообще караул)?
Прерываний от периферии? Нет, не возможно. PUC вызывает сброс SR, в котором находится бит GIE. Соответственно после PUC (и POR) все маскируемые прерывания запрещены.
MrYuran
Вообще-то, внешний сброс тоже никак на периферии не отражается.
Только что убедился.
rezident
Цитата(MrYuran @ Jun 4 2009, 20:00) *
Вообще-то, внешний сброс тоже никак на периферии не отражается.
Только что убедился.
Вообще-то следует уточнять, про какую именно периферию идет речь? И как именно это проверяется? Могу ошибаться, но по-моему для формирования PUC требуется MCLK.
MrYuran
Цитата(rezident @ Jun 4 2009, 18:18) *
Вообще-то следует уточнять, про какую именно периферию идет речь? И как именно это проверяется?

Записал в P2OUT какое-то значение, потом подал внешний сброс, потом прочитал - а там то, что я записал.
Это всё в процессе исследования форт-ядра.
Подозреваю, что другая периферия тоже ведёт себя подобным образом.
Видимо, решили сэкономить на ресетах
pt200
Как говорится самое время обратиться к документации smile.gif
Открыв описание ужаснулся: часть регистров сбрасывается при POR, часть при PUC, а некоторые вообще не изменяются wacko.gif blink.gif
Короче без книжки и неподходи.
rezident
Цитата(MrYuran @ Jun 5 2009, 10:48) *
Записал в P2OUT какое-то значение, потом подал внешний сброс, потом прочитал - а там то, что я записал.
Вот потому я и просил указать, что именно не сбрасывается? Как и предполагалось причина в невнимательном чтении документации wink.gif Читаем "тщательнЕе" раздел Digital I/O Registers в User's Manual.
MrYuran
Цитата(rezident @ Jun 5 2009, 16:17) *
wink.gif Читаем "тщательнЕе" раздел Digital I/O Registers в User's Manual.

Ну дык, это уж последнее дело.
Когда совсем ничего не получается Ж)
Student Pupkin
Цитата(MrYuran @ Jun 5 2009, 16:33) *
Ну дык, это уж последнее дело.
Когда совсем ничего не получается Ж)

biggrin.gif
Шоже вы так? В книжке "Семейство... тра-та-та... MSP ... тра-та-та... руководство пользователя" на стр.14 в табличке же сказано:
"-0,-1 - состояние после PUC; -(0), -(1) - состояние после POR". Состояние PxOUT после сброса вообще не меняется...
P.S. Зачем вачдог запускать? Достаточно WDTCTL = 0x0000... Нарушение ключа безопасности «сторожевого» таймера - от этого он тоже пукнет. Не в смысле "испортить воздух" smile.gif ...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.