Перейти к содержанию
    

Ну я обычно сразу в переменную 0х00 прописываю при ее инициализации.

Например:

volatile unsigned char example=0x00;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну я обычно сразу в переменную 0х00 прописываю при ее инициализации
Вот Вы и ответили на свой вопрос - программа ведь после ресета стартует. Она все сделает, что Вы прописали в тексте программы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

volatile unsigned char example=0x00;

Совершенно излишне:

volatile unsigned char example;

тот же результат даст.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Артем

Т.е. вы хотите сказать, что она все время будит инициализироваться нулевой при самом первом запуске(по питанию)? А не может быть такого, что там может быть записан мусор, а у меня по этой переменной важное событие должно пройти, и тогда что? А мне необходимо, чтобы при самом первом запуске она именно нулевая была!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

А во-вторых, если переменная прямо такая важная, её изначально привести в нужное состояние можно и руками.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

хотите сказать, что она все время будит инициализироваться нулевой при самом первом запуске(по питанию)?

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

 

А не может быть такого, что там может быть записан мусор

Не может такого быть, если условия эксплуатации не нарушены.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

В принципе контролировать WDRF будит достаточно)))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Кстати, а флаг WDRF регистра MCUSR, сохраняет свое значение 1, после сброса, что сброс был?

Естественно сохраняет.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ну значит сделаю тогда, так

if (!(MCUSR&0b00001000)) {...}

// проверяю флаг: если сброс вызван вотчдог, то ничего не делать, если питание на МК только поступило и флаг не установлен, то выполнить действие

MCUSR=0x00;

 

REAL

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

 

И еще момент. Порты сбрасываются все как выхода в высокоомное состояние(состояние высокого импенданса)?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

только для сброса контроллера. Сначала инициализирую МК,потом отключаю watchdog и сбрасываю флаг WDRF функцией WDT_Off(функцию взял прямо из даташита)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

И порты сбрасываются все в состояние, как выхода в высокоомном состоянии(состояние высокого импенданса)?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сначала инициализирую МК,потом отключаю watchdog и сбрасываю флаг WDRF функцией WDT_Off(функцию взял прямо из даташита)

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

 

Да и еще момент: Не может быть такого, что дапустим сразу при первом запуске МК(подачи питания) флаг 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).

 

И порты сбрасываются все в состояние, как выхода в высокоомном состоянии(состояние высокого импенданса)?

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

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Артем,

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

 

 

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?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...