реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> сброс atmega
siworker
сообщение Sep 24 2007, 12:16
Сообщение #1





Группа: Новичок
Сообщений: 14
Регистрация: 24-04-07
Пользователь №: 27 280



а как можно программно сбросить Atmega 128? только без WatchDog т.к. очень медленно. надо быстрее
Go to the top of the page
 
+Quote Post
Wild007
сообщение Sep 24 2007, 12:26
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 226
Регистрация: 25-03-05
Из: Беларусь
Пользователь №: 3 672



Цитата(siworker @ Sep 24 2007, 15:16) *
а как можно программно сбросить Atmega 128? только без WatchDog т.к. очень медленно. надо быстрее


JMP 0


--------------------
Ничто так не ограничивает полет мысли программиста, как компилятор
Go to the top of the page
 
+Quote Post
prottoss
сообщение Sep 24 2007, 12:44
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Код
void (*fn_reset)(void) = NULL;
...
void my_fn(void)
{
...
if(error)
{
fn_reset();
}
...
}


--------------------
Go to the top of the page
 
+Quote Post
firework
сообщение Sep 24 2007, 14:59
Сообщение #4


Участник
*

Группа: Новичок
Сообщений: 16
Регистрация: 2-03-07
Из: Киев
Пользователь №: 25 818



Если при сбросе нужно прыгать в загрузчик, то можно сделать так (для ATmega2561):
EIND = 0x01;
#asm
LDI R30,0xF0;
LDI R31,0x00;
EIJMP
#endasm


--------------------
Go to the top of the page
 
+Quote Post
ReAl
сообщение Sep 24 2007, 22:08
Сообщение #5


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(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 снять, т.е. будет не полный эквивалент аппаратного сброса.
В каждом конкретном случае надо очень аккуратно смотреть.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
blackbit
сообщение Sep 25 2007, 06:02
Сообщение #6


Частый гость
**

Группа: Новичок
Сообщений: 100
Регистрация: 5-03-07
Пользователь №: 25 892



Программно и корректно ее никак не скинешь. Иначе будь готов к сюрпризам.
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Sep 25 2007, 08:57
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(blackbit @ Sep 25 2007, 09:02) *
Программно и корректно ее никак не скинешь. Иначе будь готов к сюрпризам.

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

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

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

Проблемы могут возникать если у вас подключен второй МК или какое то интелектуальное оборудование на выводы. В этом случае необходимо по новый синхронизироваться и сбросить внешние устройства.
Go to the top of the page
 
+Quote Post
prottoss
сообщение Sep 25 2007, 11:06
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(ReAl @ Sep 25 2007, 06:08) *
А вот так:
Согласен, так лучше. А IO можно быстро обнулить в небольшом цикле. И молотить ничего не будет, ибо TXEN = 0, а порт IO настроится на ввод без пуллап-резистора. ТОже с остальными интерфейсами.


--------------------
Go to the top of the page
 
+Quote Post
GDI
сообщение Sep 25 2007, 11:11
Сообщение #9


Профессионал
*****

Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008



А почему ватчдогом медленно? Может просто его настроить на минимальную длительность перед тем когда надо будет сбросить мегу? Можно еще попробовать завести какую то свободную ногу порта на ресет и дергать ногой если надо перезагрузиться, но тут можно не уложиться в минимальное время сигнала "ресет", тогда надо будет городить какой то одновибратор...
В любом случае нужно программно проинициализировать все переменные, потому как при сбросе память не очищается и в переменных могут оказаться не нулевые значения.


--------------------
http://www.embedders.org Блоги разработчиков электроники.
Go to the top of the page
 
+Quote Post
ReAl
сообщение Sep 25 2007, 11:53
Сообщение #10


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(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 таки не всегда эквивалентна аппаратному сбросу.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 03:07
Рейтинг@Mail.ru


Страница сгенерированна за 0.0194 секунд с 7
ELECTRONIX ©2004-2016