Страница 1 из 1
ATmega32:программный RESET
Добавлено: Вт окт 21, 2008 20:09:10
MegaRazoR
Как правильно сделать программный ресет т.е. полностью перезапустить контроллер сбросив всю SRAM, программный счетчик и все регистры да и све остальное ?
Добавлено: Вт окт 21, 2008 20:24:54
tych
Если есть свободная нога то ею дернуть РЕСЕТ, наверно конденсатор нужен там.
А програмно наверно АСМ вставкой перейти в начало проги и там вставить очистку СРАМ и всех регистров - наверно в виде циклов.
Re: ATmega32:программный RESET
Добавлено: Вт окт 21, 2008 21:16:16
Yellow Tiger
MegaRazoR писал(а):... программный ресет т.е. ... сбросив всю SRAM
А разве Атмел обещает сброс содержимого памяти после ресета? Ей-богу, не помню такого...

Re: ATmega32:программный RESET
Добавлено: Вт окт 21, 2008 21:56:16
smac
MegaRazoR писал(а):Как правильно сделать программный ресет т.е. полностью перезапустить контроллер сбросив всю SRAM, программный счетчик и все регистры да и све остальное ?
Есть еще один способ: включить и настроить WDT и зациклиться, в результате по прошествию периода WDT получим честный сброс, однако как уже было отмечено, атмел не обещает очистки памяти по сбросу.
Re: ATmega32:программный RESET
Добавлено: Вт окт 21, 2008 21:59:04
tych
Yellow Tiger писал(а):MegaRazoR писал(а):... программный ресет т.е. ... сбросив всю SRAM
А разве Атмел обещает сброс содержимого памяти после ресета? Ей-богу, не помню такого...
Потому и надо програмно стереть. Компиляторы такое стирание ставят в прогу по-умолчанию обычно.
Добавлено: Вт окт 21, 2008 22:50:06
Yellow Tiger
Компиляторы "C" - ставят (их стандарт обязывает), а Паскаля - нет.

Добавлено: Ср окт 22, 2008 07:22:35
MOHOXPOM
Есть прерывание по 0 адресу – то бишь ресет
void (*funcptr)( void ) = 0x0000;//Программный RESET
Обращаешься как funcptr();
Добавлено: Ср окт 22, 2008 08:47:38
ARV
имхо, tych предложил самый верный "полуаппаратный" вариант, а из чисто програмных - вариант с WDT самый правильный. не забывайте, что сброс выполняет ряд операций над регистрами управления периферией, поэтому просто переход на нулевой адрес не равносилен сбросу!
Добавлено: Ср окт 22, 2008 10:33:56
MOHOXPOM
В принципе - верно. Но переход на адрес 0х0000 дает перезапуск программы начиная с функции main(), что позволяет переопределить переменные и стеки «по новому». Обычно, в связке с обработками неизвестных прерываний и контрольными значениями все работает. Но для верности действительно лучше использовать WDT.