реклама на сайте
подробности

 
 
> Програмный сброс, Как это правильно сделать?
maxus
сообщение Nov 10 2005, 14:17
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 113
Регистрация: 5-04-05
Пользователь №: 3 864



Такой вопрос:
Как програмно (т.е. изнутри) сбросить AVR (ATMega128)? Апаратно понятно - по ресету все регистры переводятся в свои исходные состояния. А програмно? Надо их "вручную" переводить?
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 14)
KRS
сообщение Nov 10 2005, 14:21
Сообщение #2


Профессионал
*****

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



Использовать вотчдог

примерно так:

__disable_interrupt();
WDTCR=1<<WDE;
DeathLoop: goto DeathLoop;
Go to the top of the page
 
+Quote Post
bzx
сообщение Nov 10 2005, 14:28
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 482
Регистрация: 5-07-05
Из: Санкт-Петербург
Пользователь №: 6 528



Ресет контролера происходит в случае:
1. Power-on Reset - сброс по включению питания
2. External Reset - внешний сброс
3. Watchdog System Reset - сброс по вочдог таймеру
4. Brown-out Reset - проседание питания

Т.е. включи Watchdog на минимальное время и уйди в бесконечный цикл. Собственно maxus это уже предложил


--------------------
Для связи email: info собака qbit.su
Go to the top of the page
 
+Quote Post
G}{OST
сообщение Nov 10 2005, 14:35
Сообщение #4


Участник
*

Группа: Новичок
Сообщений: 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


--------------------
cul8r!
* #ru_embedded - эмбеддерский чат
Go to the top of the page
 
+Quote Post
maxus
сообщение Nov 10 2005, 15:06
Сообщение #5


Частый гость
**

Группа: Свой
Сообщений: 113
Регистрация: 5-04-05
Пользователь №: 3 864



Все понятно. Большее спасибо!!!
Go to the top of the page
 
+Quote Post
starter48
сообщение Nov 10 2005, 16:17
Сообщение #6


Частый гость
**

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



Цитата(maxus @ Nov 10 2005, 21:17) *
Такой вопрос:
Как програмно (т.е. изнутри) сбросить AVR (ATMega128)? Апаратно понятно - по ресету все регистры переводятся в свои исходные состояния. А програмно? Надо их "вручную" переводить?

Ещё такой вариант (переход по адр. 0, при таком сбросе не происходит инициализации регистров, что иногда очень желательно):
Код
void (*resetptr)(void) = 0x0000;

__disable_interrupt();
resetptr();
Go to the top of the page
 
+Quote Post
maxus
сообщение Nov 11 2005, 07:11
Сообщение #7


Частый гость
**

Группа: Свой
Сообщений: 113
Регистрация: 5-04-05
Пользователь №: 3 864



Этот вариант я вначале и пробовал. В некоторых ситуациях глючит (возможно как раз и из-за непереинициализации регистров) - разбираться не стал. smile.gif Вачдог, думаю - железно правильно все сбросит.
Go to the top of the page
 
+Quote Post
BVU
сообщение Nov 11 2005, 07:19
Сообщение #8


Профессионал
*****

Группа: Свой
Сообщений: 1 301
Регистрация: 30-11-04
Из: Россия, Н.Новгород
Пользователь №: 1 264



jmp START


--------------------
Не корысти ради, не в целях наживы, а во исполнение велений души!
Go to the top of the page
 
+Quote Post
KRS
сообщение Nov 11 2005, 07:30
Сообщение #9


Профессионал
*****

Группа: Модераторы
Сообщений: 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) ;

тогда сброс произойдет намного быстрее
Go to the top of the page
 
+Quote Post
G}{OST
сообщение Nov 11 2005, 08:01
Сообщение #10


Участник
*

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



Цитата(KRS @ Nov 11 2005, 11:30) *
Только лучше изменить строчку

WDTCR = (1<<WDE) | (1<<WDP0) |(1<<WDP1);

на
WDTCR = (1<<WDE) ;

тогда сброс произойдет намного быстрее

А если точно - сброс произойдёт в 8 раз быстрее. wink.gif


--------------------
cul8r!
* #ru_embedded - эмбеддерский чат
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Nov 15 2005, 10:51
Сообщение #11


Шаман
******

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



А если уж очень быстро надо и есть свободный вывод, то подключить его к выводу RESET и в нужный момент запрограммировать на выход.
Go to the top of the page
 
+Quote Post
Igor26
сообщение Nov 15 2005, 17:19
Сообщение #12


Знающий
****

Группа: Свой
Сообщений: 521
Регистрация: 10-02-05
Пользователь №: 2 544



Цитата(IgorKossak @ Nov 15 2005, 14:51) *
А если уж очень быстро надо и есть свободный вывод, то подключить его к выводу RESET и в нужный момент запрограммировать на выход.

Проверенно. Классно!!!
Еще на х51 таким образом переключались в внутреннего ROM на внешний. Правда, это немного другая история...
Go to the top of the page
 
+Quote Post
starter48
сообщение Nov 16 2005, 06:06
Сообщение #13


Частый гость
**

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



Цитата(maxus @ Nov 11 2005, 14:11) *
Этот вариант я вначале и пробовал. В некоторых ситуациях глючит (возможно как раз и из-за непереинициализации регистров) - разбираться не стал. smile.gif Вачдог, думаю - железно правильно все сбросит.

Дело в том, что иногда нужно производить сброс чисто программно, как я показал в примере с переходом на адр. 0
Например, при запуске основной программы из бут-блока. Здесь тебе ни WDT, ни дёрганье RESET отдельной ногой не помогут.
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Nov 16 2005, 07:23
Сообщение #14


Шаман
******

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



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

Такой сброс, а это и не сброс вообще, а переход по заданному в явном виде адресу, выходит за рамки поднятой темы.
Go to the top of the page
 
+Quote Post
maxus
сообщение Nov 16 2005, 08:35
Сообщение #15


Частый гость
**

Группа: Свой
Сообщений: 113
Регистрация: 5-04-05
Пользователь №: 3 864



При сбросе все выводы ориентируются на ввод. Не получится ситуация, что вывод уже перевелся на ввод, а необходимое время для сброса еще не выдержано?
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 17:33
Рейтинг@Mail.ru


Страница сгенерированна за 0.01476 секунд с 7
ELECTRONIX ©2004-2016