Страница 1 из 1

Перезапуск МК

Добавлено: Чт фев 01, 2007 11:36:55
Tohey
Как можно перезапустить программно МК?

Добавлено: Чт фев 01, 2007 11:51:43
Оne
Чуть чуть в архивах покопаться нужно: WatchDog Timer - что это? и Простой вопрос о полном сбросе ATtiny2313

Re: Перезапуск МК

Добавлено: Чт фев 01, 2007 15:05:39
Abakt
Tohey писал(а):Как можно перезапустить программно МК?
можно подключить ножку мк к ноге ресет и создать в нужный момент на ней "0"

а можно при включеом сторожевом таймере просто сделать паузу в проге.

Добавлено: Сб фев 03, 2007 00:40:04
DimAlt
Вот так. Сам нашел на форуме, теперь пользуюсь.

void (*funcptr)( void ) = 0x0000;



funcptr();// при вызове сброс

Добавлено: Сб фев 03, 2007 02:44:44
Abakt
Спасибо.

В каком компиляторе это работает.

Можно пояснить смысл ?

Добавлено: Сб фев 03, 2007 02:45:40
Abakt
Перезапуск МК и начало проги с начала это ведь разные вещи !

Добавлено: Сб фев 03, 2007 10:27:32
ARV
Наиболее просто - это как было сказано ранее, подавать сигнал с вывода порта на вывод сброса, но этот вариант не так прост: не для всех МК возможен. Как еще состояние вывода порта будет воспринято в сам момнет сброса? Например, в МК семейства MCS-51 сброс дается высоким уровнем, и при сбросе все выводы всех портов тоже устанавливыаются в высокий уровень, т.е. если просто соединить какой-то вывод с RST - процесс сброса никогда не кончится, программа будет стоять и все.
Применение WDT и паузы так же не всегда возможно, т.к. месколько миллисекунд ожидания могут быть критически важны и недопустимы.
Остаются два варианта: либо использовать МК, в которых имеется стандартный способ программного сброса (например С8051F330), или искать иной способ нарушить работу программы. Кажется, в некоторых МК сброс получается, если сделать переход на несуществующий адрес ПЗУ, или обратиться к несуществующему адресу EEPROM...
В общем, задача не так проста и универсального решения не имеет.

Добавлено: Вс фев 04, 2007 00:27:42
DimAlt
Важно!
void (*funcptr)( void ) = 0x0000; - эту строчку указать в начале программы или в заголовочном файле (глобальная переменная).
Здесь обьявляется переменная указатель на функцию,
при вызове вызывается функция с адрессом funcptr=0.

листинг WinAvr
9fc: e0 91 af 00 lds r30, 0x00AF
a00: f0 91 b0 00 lds r31, 0x00B0
a04: 09 95 icall

0x00AF и 0x00B0 содержимое ноль.

если написать asm(rjmp 0) о такая вещь в WinAvr не проходит, программа прыгает на адресс функции main().

Помоему работать должно с любым компилятором.

Добавлено: Вс фев 04, 2007 16:33:36
Мышонок
Кстати, про нулики с единичками, кое-что тут было:
http://www.radiokot.ru/forum/viewtopic.php?t=2527

Добавлено: Пн фев 05, 2007 00:39:26
DimAlt
Прочитал ветку внимательней
был вопрос

Как можно перезапустить программно МК?

потом
Перезапуск МК и начало проги с начала это ведь разные вещи !

Ну дык как еще перезапустить программно мк, как не запустить программу с адресса 0? В любой проге надо обязательно инициализировать переферию, если писать на Си то, если сделать переход на адресс 0 то это равносильно перезапуску. Про ассемблер молчу, там таких вопросов не возникает, если не считать значения в озу и регистрах общего назначения.

Добавлено: Пн фев 05, 2007 14:22:44
Tohey
Нашёл наиболее подходящее мне решение с помощью WDT(для mega8):
reset2:
ldi tmp, (1<<WDCE)|(1<<WDE)
out WDTCR, tmp
off:
rjmp off