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

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> atmega88pa, принудительный сборос - програмно
max_mart
сообщение Oct 8 2012, 09:06
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 248
Регистрация: 30-09-11
Пользователь №: 67 474



всем привет,

Необходимо ресетить мегу. Как это можно реализовать через проограмму, принудительно по необходимости, например, при проверке одного флага, в определенный момент времени?
Go to the top of the page
 
+Quote Post
RabidRabbit
сообщение Oct 8 2012, 09:40
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 397
Регистрация: 3-12-09
Из: Россия, Москва
Пользователь №: 54 040



Соеденить какую-нибудь ногу GPIO с RESET, не?
Go to the top of the page
 
+Quote Post
kovigor
сообщение Oct 8 2012, 10:07
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295



Цитата(max_mart @ Oct 8 2012, 12:06) *
Необходимо ресетить мегу. Как это можно реализовать через проограмму, принудительно по необходимости, например, при проверке одного флага, в определенный момент времени?

Посредством WatchDog ...
Go to the top of the page
 
+Quote Post
DmitryM
сообщение Oct 8 2012, 10:12
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 583
Регистрация: 7-06-06
Из: Таганрог
Пользователь №: 17 840



Цитата(max_mart @ Oct 8 2012, 13:06) *
Необходимо ресетить мегу. Как это можно реализовать через проограмму, принудительно по необходимости, например, при проверке одного флага, в определенный момент времени?

Завести Watchdog, и по необходимости "например, при проверке одного флага" уйти в бесконечный цикл.
Go to the top of the page
 
+Quote Post
Xenia
сообщение Oct 8 2012, 10:48
Сообщение #5


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Ззапретить прерывания, завести Watchdog на самую короткую продолжительность, и только после этого уйти в бесконечный цикл.
Например так:
Код
void Reset()
{
  __disable_interrupt();
  WDTCSR |= (1<<WDCE) | (1<<WDE);
  WDTCSR = (1<<WDE);  // 16 ms
  for(;;);
}

(только это не для ATmega88pa писано).
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Oct 8 2012, 11:44
Сообщение #6


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Под avr-gcc для любых AVR.
Код
static inline void NORETURN mcu_reset(void)  {wdt_enable(WDTO_15MS); cli(); for(;;);}

Пора бы уже эту фишку в avr-libc реализовать...


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
max_mart
сообщение Oct 8 2012, 11:50
Сообщение #7


Местный
***

Группа: Участник
Сообщений: 248
Регистрация: 30-09-11
Пользователь №: 67 474



спасибо огромное
Go to the top of the page
 
+Quote Post
prottoss
сообщение Oct 8 2012, 12:41
Сообщение #8


Гуру
******

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



Цитата(max_mart @ Oct 8 2012, 15:06) *
...принудительно по необходимости, например, при проверке одного флага, в определенный момент времени?

Цитата(RabidRabbit @ Oct 8 2012, 15:40) *
Соеденить какую-нибудь ногу GPIO с RESET, не?
Лучший вариант, ибо это будет как раз в определенный момент времени, а не после того как WDT сработает через определенный момент времени после определенного момента времени.


--------------------
Go to the top of the page
 
+Quote Post
V_G
сообщение Oct 8 2012, 13:28
Сообщение #9


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

Группа: Свой
Сообщений: 1 818
Регистрация: 15-10-09
Из: Владивосток
Пользователь №: 52 955



Цитата(prottoss @ Oct 8 2012, 22:41) *
Лучший вариант, ибо это будет как раз в определенный момент времени, а не после того как WDT сработает через определенный момент времени после определенного момента времени.

Ну, и здесь этот определенный момент также не очень-то определен, с учетом минимально допустимого времени сброса (2,5 мкс по даташиту), с учетом работы внутреннего счетчика задержки ресета, а также с учетом того, что при срабатывании ресета сигнал порта, вызывающего ресет, тоже сбрасывается.
Go to the top of the page
 
+Quote Post
prottoss
сообщение Oct 8 2012, 14:07
Сообщение #10


Гуру
******

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



Цитата(V_G @ Oct 8 2012, 19:28) *
Ну, и здесь...
Согласен, все в мире относительно sm.gif Просто в случае с WDT ко всем выше перечисленным задержкам прибавляется минимальное время реакции WDT.


--------------------
Go to the top of the page
 
+Quote Post
max_mart
сообщение Oct 8 2012, 15:15
Сообщение #11


Местный
***

Группа: Участник
Сообщений: 248
Регистрация: 30-09-11
Пользователь №: 67 474



Ram и все регитсры сбрасываются или сохраняются значения, при сбросе от WDT?
Go to the top of the page
 
+Quote Post
prottoss
сообщение Oct 8 2012, 15:26
Сообщение #12


Гуру
******

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



Цитата(max_mart @ Oct 8 2012, 21:15) *
Ram и все регитсры сбрасываются или сохраняются значения, при сбросе от WDT?
Сброс по WDT работает так же как и сброс от внешнего RESET. Все регистры и порты ВВ принимают начальное значение описаное в даташите на МК. SRAM не изменится.


--------------------
Go to the top of the page
 
+Quote Post
max_mart
сообщение Oct 8 2012, 15:57
Сообщение #13


Местный
***

Группа: Участник
Сообщений: 248
Регистрация: 30-09-11
Пользователь №: 67 474



т.е. значит флаги и некоторые переменные придется обнулять самому, поскольку я их в SRAM разместил

правильно я говорю?
И переменная сохранит свое значение до ресета?
Go to the top of the page
 
+Quote Post
prottoss
сообщение Oct 8 2012, 16:00
Сообщение #14


Гуру
******

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



Цитата(max_mart @ Oct 8 2012, 21:57) *
т.е. значит флаги и некоторые переменные придется обнулять самому, поскольку я их в SRAM разместил

правильно я говорю?
И переменная сохранит свое значение до ресета?
Ну да. А разве при инициализации программы у Вас флаги не устанавливаются в какое то дефолтное значение? Типа:
Код
unsigned int g_Flag_1 = 0x0000;
unsigned int g_Flag_2 = DEF_FLAG_A | DEF_FLAG_B;


void main(void)
{
...
}


--------------------
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Oct 8 2012, 16:02
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(max_mart @ Oct 8 2012, 18:57) *
т.е. значит флаги и некоторые переменные придется обнулять самому, поскольку я их в SRAM разместил
правильно я говорю?

А обычно вы их сами обнуляете? Или в стартапе они обнуляются?
Сброс по WDT аналогичен обычному, то есть всё пойдёт по тому же сценарию.
Go to the top of the page
 
+Quote Post

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

 


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


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