Такой вопрос: Как програмно (т.е. изнутри) сбросить AVR (ATMega128)? Апаратно понятно - по ресету все регистры переводятся в свои исходные состояния. А програмно? Надо их "вручную" переводить?
Ресет контролера происходит в случае: 1. Power-on Reset - сброс по включению питания 2. External Reset - внешний сброс 3. Watchdog System Reset - сброс по вочдог таймеру 4. Brown-out Reset - проседание питания
Т.е. включи Watchdog на минимальное время и уйди в бесконечный цикл. Собственно maxus это уже предложил
Такой вопрос: Как програмно (т.е. изнутри) сбросить AVR (ATMega128)? Апаратно понятно - по ресету все регистры переводятся в свои исходные состояния. А програмно? Надо их "вручную" переводить?
Ещё такой вариант (переход по адр. 0, при таком сбросе не происходит инициализации регистров, что иногда очень желательно):
Код
void (*resetptr)(void) = 0x0000;
__disable_interrupt(); resetptr();
maxus
Nov 11 2005, 07:11
Этот вариант я вначале и пробовал. В некоторых ситуациях глючит (возможно как раз и из-за непереинициализации регистров) - разбираться не стал. Вачдог, думаю - железно правильно все сбросит.
А если уж очень быстро надо и есть свободный вывод, то подключить его к выводу RESET и в нужный момент запрограммировать на выход.
Igor26
Nov 15 2005, 17:19
Цитата(IgorKossak @ Nov 15 2005, 14:51)
А если уж очень быстро надо и есть свободный вывод, то подключить его к выводу RESET и в нужный момент запрограммировать на выход.
Проверенно. Классно!!! Еще на х51 таким образом переключались в внутреннего ROM на внешний. Правда, это немного другая история...
starter48
Nov 16 2005, 06:06
Цитата(maxus @ Nov 11 2005, 14:11)
Этот вариант я вначале и пробовал. В некоторых ситуациях глючит (возможно как раз и из-за непереинициализации регистров) - разбираться не стал. Вачдог, думаю - железно правильно все сбросит.
Дело в том, что иногда нужно производить сброс чисто программно, как я показал в примере с переходом на адр. 0 Например, при запуске основной программы из бут-блока. Здесь тебе ни WDT, ни дёрганье RESET отдельной ногой не помогут.
IgorKossak
Nov 16 2005, 07:23
Цитата(starter48 @ Nov 16 2005, 08:06)
Дело в том, что иногда нужно производить сброс чисто программно, как я показал в примере с переходом на адр. 0 Например, при запуске основной программы из бут-блока. Здесь тебе ни WDT, ни дёрганье RESET отдельной ногой не помогут.
Такой сброс, а это и не сброс вообще, а переход по заданному в явном виде адресу, выходит за рамки поднятой темы.
maxus
Nov 16 2005, 08:35
При сбросе все выводы ориентируются на ввод. Не получится ситуация, что вывод уже перевелся на ввод, а необходимое время для сброса еще не выдержано?
one_man_show
Nov 16 2005, 08:41
В таком случае сигнал растягивают ёмкостью
BVU
Nov 16 2005, 09:05
Цитата(one_man_show @ Nov 16 2005, 11:41)
В таком случае сигнал растягивают ёмкостью
Немного подкорректирую - сигнал растягивают схемой 'формирователем', а емкость конденсатора играет роль фазосдвигающего элемента.
one_man_show
Nov 16 2005, 10:14
Корреция несомненно верная, но в большинстве случаев достаточно одного конденсатора
Igor26
Nov 16 2005, 13:07
Цитата(maxus @ Nov 16 2005, 12:35)
При сбросе все выводы ориентируются на ввод. Не получится ситуация, что вывод уже перевелся на ввод, а необходимое время для сброса еще не выдержано?
Чтоб этого избежать, мы применяли MAX691. На один из ее входов нужно подавать импульсную последовательность от процессора. Как только импульсы пропадали более чем, помоему, на пол секунды, происходило формирование достаточно длительного импульса сброса.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.