Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: сброс atmega
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
siworker
а как можно программно сбросить Atmega 128? только без WatchDog т.к. очень медленно. надо быстрее
Wild007
Цитата(siworker @ Sep 24 2007, 15:16) *
а как можно программно сбросить Atmega 128? только без WatchDog т.к. очень медленно. надо быстрее


JMP 0
prottoss
Код
void (*fn_reset)(void) = NULL;
...
void my_fn(void)
{
...
if(error)
{
fn_reset();
}
...
}
firework
Если при сбросе нужно прыгать в загрузчик, то можно сделать так (для ATmega2561):
EIND = 0x01;
#asm
LDI R30,0xF0;
LDI R31,0x00;
EIJMP
#endasm
ReAl
Цитата(prottoss @ Sep 24 2007, 14:44) *
Код
void (*fn_reset)(void) = NULL;
...
if(error)
{
    fn_reset();
}
...

А вот так:
Код
#define FN_RESET ((void (*)()) 0)
...
  if(error) {
     FN_RESET();
  }
...

не сожрёт лишнего ОЗУ на переменную fn_reset
Только этого мало - сначала надо прерывания запретить и привести вручную все регистры устройств в исходное состояние. И того может не хватить - например, если не ошибаюсь, в USART незавершённая передача будет продолжать молотить даже если TXEN снять, т.е. будет не полный эквивалент аппаратного сброса.
В каждом конкретном случае надо очень аккуратно смотреть.
blackbit
Программно и корректно ее никак не скинешь. Иначе будь готов к сюрпризам.
SasaVitebsk
Цитата(blackbit @ Sep 25 2007, 09:02) *
Программно и корректно ее никак не скинешь. Иначе будь готов к сюрпризам.

Ну не пугайте вы так. smile.gif

Прога изначально должна быть написана так, чтобы вначале инициализировались все важные для вас вещи. В том числе запрещались прерывания (несмотря что они запрещены по аппаратному сбросу). В этом случае никаких страшных вещей не произойдёт.

Ну допустим выдаст Tx UARTa ещё один байт. И что с этого? Если сброс произошёл после того как этот байт уже был записан. Он бы был выдан в любом случае. Короче не вижу никаких проблем.

Проблемы могут возникать если у вас подключен второй МК или какое то интелектуальное оборудование на выводы. В этом случае необходимо по новый синхронизироваться и сбросить внешние устройства.
prottoss
Цитата(ReAl @ Sep 25 2007, 06:08) *
А вот так:
Согласен, так лучше. А IO можно быстро обнулить в небольшом цикле. И молотить ничего не будет, ибо TXEN = 0, а порт IO настроится на ввод без пуллап-резистора. ТОже с остальными интерфейсами.
GDI
А почему ватчдогом медленно? Может просто его настроить на минимальную длительность перед тем когда надо будет сбросить мегу? Можно еще попробовать завести какую то свободную ногу порта на ресет и дергать ногой если надо перезагрузиться, но тут можно не уложиться в минимальное время сигнала "ресет", тогда надо будет городить какой то одновибратор...
В любом случае нужно программно проинициализировать все переменные, потому как при сбросе память не очищается и в переменных могут оказаться не нулевые значения.
ReAl
Цитата(prottoss @ Sep 25 2007, 13:06) *
И молотить ничего не будет, ибо TXEN = 0, а порт IO настроится на ввод без пуллап-резистора.

Наружу не будет, так как передатчик отключится от вывода, а вот что будет происходить внутри - ещё вопрос. Дока на всякие мега64-мега2560 гласит:
Цитата
Disabling the Transmitter The disabling of the Transmitter (setting the TXENn to zero) will not become effective until ongoing and pending transmissions are completed, i.e., when the Transmit Shift Register and Transmit Buffer Register do not contain data to be transmitted. When disabled, the transmitter will no longer override the TxD pin.
Я не занимался выяснением - что они имеют ввиду и как себя будет вести передатчик после того, как посреди передачи записать 0 в TXEN, потом через какое-то время заново записать UBRR и режимы и опять поднять TXEN, но... похоже, что запись 0 в TXEN таки не всегда эквивалентна аппаратному сбросу.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.