|
Програмный сброс, Как это правильно сделать? |
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 14)
|
Nov 10 2005, 14:35
|

Участник

Группа: Новичок
Сообщений: 48
Регистрация: 6-05-05
Пользователь №: 4 784

|
Цитата(KRS @ Nov 10 2005, 18:21)  Использовать вотчдог
примерно так:
__disable_interrupt(); WDTCR=1<<WDE; DeathLoop: goto DeathLoop; а точно - вот так (IAR 4.11): Код __disable_interrupt();
// Write logical one to WDCE and WDE WDTCR = (1<<WDCE) |(1<<WDE); // Turn on WDT WDTCR = (1<<WDE) | (1<<WDP0) |(1<<WDP1);
#pragma diag_suppress=Pe236 while(1); #pragma diag_default=Pe236
--------------------
|
|
|
|
|
Nov 10 2005, 16:17
|

Частый гость
 
Группа: Свой
Сообщений: 112
Регистрация: 15-10-05
Из: Томск
Пользователь №: 9 680

|
Цитата(maxus @ Nov 10 2005, 21:17)  Такой вопрос: Как програмно (т.е. изнутри) сбросить AVR (ATMega128)? Апаратно понятно - по ресету все регистры переводятся в свои исходные состояния. А програмно? Надо их "вручную" переводить? Ещё такой вариант (переход по адр. 0, при таком сбросе не происходит инициализации регистров, что иногда очень желательно): Код void (*resetptr)(void) = 0x0000;
__disable_interrupt(); resetptr();
|
|
|
|
|
Nov 11 2005, 07:30
|

Профессионал
    
Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555

|
Цитата(G}{OST @ Nov 10 2005, 17:35)  Цитата(KRS @ Nov 10 2005, 18:21)  Использовать вотчдог
примерно так:
__disable_interrupt(); WDTCR=1<<WDE; DeathLoop: goto DeathLoop;
а точно - вот так (IAR 4.11): Код __disable_interrupt();
// Write logical one to WDCE and WDE WDTCR = (1<<WDCE) |(1<<WDE); // Turn on WDT WDTCR = (1<<WDE) | (1<<WDP0) |(1<<WDP1);
#pragma diag_suppress=Pe236 while(1); #pragma diag_default=Pe236 Только лучше изменить строчку WDTCR = (1<<WDE) | (1<<WDP0) |(1<<WDP1); на WDTCR = (1<<WDE) ; тогда сброс произойдет намного быстрее
|
|
|
|
|
Nov 11 2005, 08:01
|

Участник

Группа: Новичок
Сообщений: 48
Регистрация: 6-05-05
Пользователь №: 4 784

|
Цитата(KRS @ Nov 11 2005, 11:30)  Только лучше изменить строчку
WDTCR = (1<<WDE) | (1<<WDP0) |(1<<WDP1);
на WDTCR = (1<<WDE) ;
тогда сброс произойдет намного быстрее А если точно - сброс произойдёт в 8 раз быстрее.
--------------------
|
|
|
|
|
Nov 16 2005, 06:06
|

Частый гость
 
Группа: Свой
Сообщений: 112
Регистрация: 15-10-05
Из: Томск
Пользователь №: 9 680

|
Цитата(maxus @ Nov 11 2005, 14:11)  Этот вариант я вначале и пробовал. В некоторых ситуациях глючит (возможно как раз и из-за непереинициализации регистров) - разбираться не стал.  Вачдог, думаю - железно правильно все сбросит. Дело в том, что иногда нужно производить сброс чисто программно, как я показал в примере с переходом на адр. 0 Например, при запуске основной программы из бут-блока. Здесь тебе ни WDT, ни дёрганье RESET отдельной ногой не помогут.
|
|
|
|
|
Nov 16 2005, 07:23
|

Шаман
     
Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221

|
Цитата(starter48 @ Nov 16 2005, 08:06)  Дело в том, что иногда нужно производить сброс чисто программно, как я показал в примере с переходом на адр. 0 Например, при запуске основной программы из бут-блока. Здесь тебе ни WDT, ни дёрганье RESET отдельной ногой не помогут. Такой сброс, а это и не сброс вообще, а переход по заданному в явном виде адресу, выходит за рамки поднятой темы.
|
|
|
|
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|