Страница 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.