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

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Аватара пользователя
Tohey
Грызет канифоль
Сообщения: 257
Зарегистрирован: Сб сен 09, 2006 19:00:18
Откуда: СССР

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

Сообщение Tohey »

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

Сообщение Оne »

Чуть чуть в архивах покопаться нужно: WatchDog Timer - что это? и Простой вопрос о полном сбросе ATtiny2313
Реклама
Аватара пользователя
Abakt
Вечно гонимый
Сообщения: 568
Зарегистрирован: Ср янв 10, 2007 19:15:51

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

Сообщение Abakt »

Tohey писал(а):Как можно перезапустить программно МК?
можно подключить ножку мк к ноге ресет и создать в нужный момент на ней "0"

а можно при включеом сторожевом таймере просто сделать паузу в проге.
DimAlt
Вымогатель припоя
Сообщения: 576
Зарегистрирован: Пт май 19, 2006 05:39:11
Контактная информация:

Сообщение DimAlt »

Вот так. Сам нашел на форуме, теперь пользуюсь.

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



funcptr();// при вызове сброс
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Abakt
Вечно гонимый
Сообщения: 568
Зарегистрирован: Ср янв 10, 2007 19:15:51

Сообщение Abakt »

Спасибо.

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

Можно пояснить смысл ?
Реклама
Аватара пользователя
Abakt
Вечно гонимый
Сообщения: 568
Зарегистрирован: Ср янв 10, 2007 19:15:51

Сообщение Abakt »

Перезапуск МК и начало проги с начала это ведь разные вещи !
Реклама
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18675
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

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

Мой уютный бложик... заходите!
DimAlt
Вымогатель припоя
Сообщения: 576
Зарегистрирован: Пт май 19, 2006 05:39:11
Контактная информация:

Сообщение 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().

Помоему работать должно с любым компилятором.
Аватара пользователя
Мышонок
Друг Кота
Сообщения: 3792
Зарегистрирован: Чт сен 14, 2006 11:42:09
Откуда: Обитаю на чердаке
Контактная информация:

Сообщение Мышонок »

Кстати, про нулики с единичками, кое-что тут было:
http://www.radiokot.ru/forum/viewtopic.php?t=2527
Память очень интересная штука: бывает так, что запомнишь одно, а вспомнишь другое...
DimAlt
Вымогатель припоя
Сообщения: 576
Зарегистрирован: Пт май 19, 2006 05:39:11
Контактная информация:

Сообщение DimAlt »

Прочитал ветку внимательней
был вопрос

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

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

Ну дык как еще перезапустить программно мк, как не запустить программу с адресса 0? В любой проге надо обязательно инициализировать переферию, если писать на Си то, если сделать переход на адресс 0 то это равносильно перезапуску. Про ассемблер молчу, там таких вопросов не возникает, если не считать значения в озу и регистрах общего назначения.
Аватара пользователя
Tohey
Грызет канифоль
Сообщения: 257
Зарегистрирован: Сб сен 09, 2006 19:00:18
Откуда: СССР

Сообщение Tohey »

Нашёл наиболее подходящее мне решение с помощью WDT(для mega8):
reset2:
ldi tmp, (1<<WDCE)|(1<<WDE)
out WDTCR, tmp
off:
rjmp off
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»