|
atmega88pa, принудительный сборос - програмно |
|
|
|
Oct 8 2012, 12:41
|

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

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

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

|
Цитата(prottoss @ Oct 8 2012, 22:41)  Лучший вариант, ибо это будет как раз в определенный момент времени, а не после того как WDT сработает через определенный момент времени после определенного момента времени. Ну, и здесь этот определенный момент также не очень-то определен, с учетом минимально допустимого времени сброса (2,5 мкс по даташиту), с учетом работы внутреннего счетчика задержки ресета, а также с учетом того, что при срабатывании ресета сигнал порта, вызывающего ресет, тоже сбрасывается.
|
|
|
|
|
Oct 8 2012, 16:47
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(max_mart @ Oct 8 2012, 19:30)  volatile unsigned char example=0x00; Совершенно излишне: Код volatile unsigned char example; тот же результат даст.
|
|
|
|
|
Oct 8 2012, 17:20
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(max_mart @ Oct 8 2012, 19:59)  хотите сказать, что она все время будит инициализироваться нулевой при самом первом запуске(по питанию)? При любом перезапуске так будет (они все через один вектор идут). Цитата(max_mart @ Oct 8 2012, 19:59)  А не может быть такого, что там может быть записан мусор Не может такого быть, если условия эксплуатации не нарушены.
|
|
|
|
|
Oct 8 2012, 17:30
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 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.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Oct 8 2012, 17:50
|

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

|
MCUSR = 0; сделать всегда, так как оставшийся от сброса по WDT бит (1 << WDRF) не даст ни запретить WDT, ни, как выше было сказано, изменить время (а уж оно-то по сбросу будет поставлено на минимальное).
После чего запретить либо сбросить WDT, в зависимости от того, используется ли он по прямому назначению.
Если WDT использовался только для сброса контроллера, то надо его запретить. Он разрешён после своей сработки и через 16 мс сработает опять.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Oct 8 2012, 20:13
|
Гуру
     
Группа: Свой
Сообщений: 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.
|
|
|
|
|
Oct 9 2012, 14:56
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(max_mart @ Oct 9 2012, 07:58)  Как тогда посоветуете правильно его отключить? 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; } Так? Я делал примерно также, просто в однажды ИАР сгенерил код который перестал укладываться в 4 цикла. Переделал так: Код void WDT_Prescaler_Change(unsigned char new_wdt_period); int main() { MCUSR = ~(1<<WDRF); WDT_Prescaler_Change(6|(1<<WDE)); __watchdog_reset(); Код WDT_Prescaler_Change: ; Turn off global interrupt
push r17 mov r17, r16 cli ; Reset Watchdog Timer wdr ; Start timed sequence lds r16, 0x60 ori r16, 0x18 sts 0x60, r16 ; -- Got four cycles to set the new values from here - ; Set new prescaler(time-out) value = 64K cycles (~0.5 s) sts 0x60, r17 ; -- Finished setting new values, used 2 cycles - ; Turn on global interrupt pop r17 ret Цитата(max_mart @ Oct 9 2012, 07:58)  И еще момент: после сброса, я флаги все обнуляю и выключаю вотчдог. Но если мне он опять нужен , то перед включением я должен бит WDRF выставить в 1? Либо он(WDRF) устанавливается автоматически при записи 1 в WDE? Цитата This bit is set if a Watchdog System Reset occurs. Вы не можете установить WDRF - он устанавливается аппаратно. Его нужно просто сбросить на старте записью в него единицы и больше о нём не вспоминать.
|
|
|
|
|
Oct 9 2012, 16:35
|
Местный
  
Группа: Участник
Сообщений: 248
Регистрация: 30-09-11
Пользователь №: 67 474

|
Почему 1??? Когда в описании написано 0! Цитата(max_mart @ Oct 9 2012, 20:30)  Почему 1??? Когда в описании написано 0! "Вы не можете установить WDRF - он устанавливается аппаратно." - т.е. мне достаточно только прописать WDE, если мне необходим ресет и вотчдог включится
|
|
|
|
|
Oct 9 2012, 16:49
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(max_mart @ Oct 9 2012, 19:35)  Почему 1??? Когда в описании написано 0! Я ошибся - писать нужно 0. Цитата(max_mart @ Oct 9 2012, 19:35)  т.е. мне достаточно только прописать WDE, если мне необходим ресет и вотчдог включится да
|
|
|
|
|
Oct 9 2012, 22:08
|
Участник

Группа: Участник
Сообщений: 15
Регистрация: 10-10-05
Из: Казань
Пользователь №: 9 432

|
Вариант без WDT Код __disable_interrupt(); ((void (*)())0x0000)();
|
|
|
|
|
Oct 10 2012, 02:40
|
Участник

Группа: Участник
Сообщений: 15
Регистрация: 10-10-05
Из: Казань
Пользователь №: 9 432

|
Цитата(_Артём_ @ Oct 10 2012, 03:49)  Это не то же самое - процессор сброшен не будет и вся периферия останется в несброшенном состоянии. Согласен, внутреннего системного сброса не произойдет. В зависимости от замысла принудительного программного сброса, системный сброс может и не понадобиться. В любом случае используемая периферия будет проинициализирована программой.
|
|
|
|
|
Oct 10 2012, 18:36
|

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

|
А иногда и озабоченность озабачивание даже если этим озаботиться, то все равно разница с аппаратным сбросом будет, и существенная. Например Цитата(ATmega88PA doc) • Bit 3 – TXENn: Transmitter Enable n Writing this bit to one enables the USART Transmitter. The Transmitter will override normal port operation for the TxDn pin when enabled. The disabling of the Transmitter (writing 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 TxDn port. Т.е. даже если записать «сбросовое» значение 0x00 в UCSR0B, передатчик ещё будет передавать недопереданное. Куда-то в астрал, так как ножка отключится, но кто его знает, как там себя автоматы поведут, если до конца передачи опять проинициализировать USART либо даже не занулять UCSR0B а просто заново записать то, что нужно. Как миниум, аккуратненько взведётся (вполне возможно не ожидаемый ещё программой) флаг TXC.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Oct 11 2012, 16:40
|
Участник

Группа: Участник
Сообщений: 27
Регистрация: 28-05-12
Пользователь №: 72 050

|
А нельзя по флагу сделать переход на самое начало программы /адрес 0000/и не задействовать WDT? Надо сбросить флажки всех прерываний и инициализировать указатель стека. Я похожее сделал, работает.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|