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

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


Местный
***

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



Ну я обычно сразу в переменную 0х00 прописываю при ее инициализации.
Например:
volatile unsigned char example=0x00;
Go to the top of the page
 
+Quote Post
prottoss
сообщение Oct 8 2012, 16:34
Сообщение #17


Гуру
******

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



Цитата(max_mart @ Oct 8 2012, 22:30) *
Ну я обычно сразу в переменную 0х00 прописываю при ее инициализации
Вот Вы и ответили на свой вопрос - программа ведь после ресета стартует. Она все сделает, что Вы прописали в тексте программы.


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


Гуру
******

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



Цитата(max_mart @ Oct 8 2012, 19:30) *
volatile unsigned char example=0x00;

Совершенно излишне:
Код
volatile unsigned char example;

тот же результат даст.
Go to the top of the page
 
+Quote Post
max_mart
сообщение Oct 8 2012, 16:59
Сообщение #19


Местный
***

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



Артем
Т.е. вы хотите сказать, что она все время будит инициализироваться нулевой при самом первом запуске(по питанию)? А не может быть такого, что там может быть записан мусор, а у меня по этой переменной важное событие должно пройти, и тогда что? А мне необходимо, чтобы при самом первом запуске она именно нулевая была!
Go to the top of the page
 
+Quote Post
esaulenka
сообщение Oct 8 2012, 17:06
Сообщение #20


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

Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877



Во-первых, обнулять глобальные (не локальные!) переменные компилятор Си должен согласно спецификации.
А во-вторых, если переменная прямо такая важная, её изначально привести в нужное состояние можно и руками.


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Oct 8 2012, 17:20
Сообщение #21


Гуру
******

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



Цитата(max_mart @ Oct 8 2012, 19:59) *
хотите сказать, что она все время будит инициализироваться нулевой при самом первом запуске(по питанию)?

При любом перезапуске так будет (они все через один вектор идут).

Цитата(max_mart @ Oct 8 2012, 19:59) *
А не может быть такого, что там может быть записан мусор

Не может такого быть, если условия эксплуатации не нарушены.
Go to the top of the page
 
+Quote Post
max_mart
сообщение Oct 8 2012, 17:24
Сообщение #22


Местный
***

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



Кстати, а флаг WDRF регистра MCUSR, сохраняет свое значение 1, после сброса, что сброс был? По описанию он вроде только может быть сброшен вручную или по питанию.

В принципе контролировать WDRF будит достаточно)))
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Oct 8 2012, 17:27
Сообщение #23


Гуру
******

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



Цитата(max_mart @ Oct 8 2012, 20:24) *
Кстати, а флаг WDRF регистра MCUSR, сохраняет свое значение 1, после сброса, что сброс был?

Естественно сохраняет.
Причём его надо обязательно сбрасывать, иначе не удасться установиь период WDT, отличный от минимального.
Go to the top of the page
 
+Quote Post
ReAl
сообщение Oct 8 2012, 17:30
Сообщение #24


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

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



Цитата(prottoss @ Oct 8 2012, 18:26) *
Сброс по WDT работает так же как и сброс от внешнего RESET.
За исключением того, что при этом взводится флаг WDRF в MCUSR, который держит в 1-ке бит WDE в WDTCSR (обратите внимание на X вместо 0 в «состоянии после сброса» для WDE).

Т.е. после сброса по WDT этот самый WDT оказывается гарантированно разрешённым, а после сброса по RESET — ну, зависит от фьюза WDTON :-)

Т.е. мало просто использовать вызов вызов рекомендованных Reset()/mcu_reset(), надо добавить при старте очистку источников сброса в MCUSR и запрет WDT.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
max_mart
сообщение Oct 8 2012, 17:43
Сообщение #25


Местный
***

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



ну значит сделаю тогда, так
if (!(MCUSR&0b00001000)) {...}
// проверяю флаг: если сброс вызван вотчдог, то ничего не делать, если питание на МК только поступило и флаг не установлен, то выполнить действие
MCUSR=0x00;

REAL
Т.е. Вы хотите сказать, что надо добавить еще сюда wdt_disable();?

И еще момент. Порты сбрасываются все как выхода в высокоомное состояние(состояние высокого импенданса)?
Go to the top of the page
 
+Quote Post
ReAl
сообщение Oct 8 2012, 17:50
Сообщение #26


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

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



MCUSR = 0; сделать всегда, так как оставшийся от сброса по WDT бит (1 << WDRF) не даст ни запретить WDT, ни, как выше было сказано, изменить время (а уж оно-то по сбросу будет поставлено на минимальное).

После чего запретить либо сбросить WDT, в зависимости от того, используется ли он по прямому назначению.

Если WDT использовался только для сброса контроллера, то надо его запретить. Он разрешён после своей сработки и через 16 мс сработает опять.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
max_mart
сообщение Oct 8 2012, 18:01
Сообщение #27


Местный
***

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



только для сброса контроллера. Сначала инициализирую МК,потом отключаю watchdog и сбрасываю флаг WDRF функцией WDT_Off(функцию взял прямо из даташита)
Go to the top of the page
 
+Quote Post
max_mart
сообщение Oct 8 2012, 19:36
Сообщение #28


Местный
***

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



Да и еще момент: Не может быть такого, что дапустим сразу при первом запуске МК(подачи питания) флаг WDRF установится в 1 или же он строго устанавливается только по срабатыванию ресета от вотчдог?
И порты сбрасываются все в состояние, как выхода в высокоомном состоянии(состояние высокого импенданса)?
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Oct 8 2012, 20:13
Сообщение #29


Гуру
******

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



Цитата(max_mart @ Oct 8 2012, 21:01) *
Сначала инициализирую МК,потом отключаю watchdog и сбрасываю флаг WDRF функцией WDT_Off(функцию взял прямо из даташита)

Тоже как-то взял из даташита - но она в 4 такта не уложилась...

Цитата(max_mart @ Oct 8 2012, 22:36) *
Да и еще момент: Не может быть такого, что дапустим сразу при первом запуске МК(подачи питания) флаг WDRF установится в 1 или же он строго устанавливается только по срабатыванию ресета от вотчдог?


Цитата
This bit is set if a Watchdog System Reset occurs. The bit is reset by a Power-on Reset, or by
writing a logic zero to the flag.

То есть если флаг установился (сбросом по wdt), то вернуть его в 0 может только запись 0 или Power-on Reset (но не BOD или Ext Reset).

Цитата(max_mart @ Oct 8 2012, 22:36) *
И порты сбрасываются все в состояние, как выхода в высокоомном состоянии(состояние высокого импенданса)?

Да все в Z-state. Initial Value для DDRx и PORTx = 0.

Go to the top of the page
 
+Quote Post
max_mart
сообщение Oct 9 2012, 04:58
Сообщение #30


Местный
***

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



Артем,
Как тогда посоветуете правильно его отключить?


static inline void WDT_off(void)
{
wdt_reset();
/* Clear WDRF in MCUSR */
MCUSR &= ~(1<<WDRF);
/* Write logical one to WDCE and WDE */
/* Keep old prescaler setting to prevent unintentional time-out */
WDTCSR = 0b00011000;
/* Turn off WDT */
WDTCSR = 0x00;
}
Так?

И еще момент:
после сброса, я флаги все обнуляю и выключаю вотчдог. Но если мне он опять нужен , то перед включением я должен бит WDRF выставить в 1?

Либо он(WDRF) устанавливается автоматически при записи 1 в WDE?
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 Текстовая версия Сейчас: 18th July 2025 - 23:21
Рейтинг@Mail.ru


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