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

 
 
3 страниц V  < 1 2 3  
Reply to this topicStart new topic
> atmega88pa, принудительный сборос - програмно
_Артём_
сообщение Oct 9 2012, 14:56
Сообщение #31


Гуру
******

Группа: Свой
Сообщений: 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 - он устанавливается аппаратно. Его нужно просто сбросить на старте записью в него единицы и больше о нём не вспоминать.
Go to the top of the page
 
+Quote Post
max_mart
сообщение Oct 9 2012, 16:35
Сообщение #32


Местный
***

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



Почему 1??? Когда в описании написано 0!

Цитата(max_mart @ Oct 9 2012, 20:30) *
Почему 1??? Когда в описании написано 0!

"Вы не можете установить WDRF - он устанавливается аппаратно." - т.е. мне достаточно только прописать WDE, если мне необходим ресет и вотчдог включится
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Oct 9 2012, 16:49
Сообщение #33


Гуру
******

Группа: Свой
Сообщений: 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, если мне необходим ресет и вотчдог включится

да
Go to the top of the page
 
+Quote Post
abi
сообщение Oct 9 2012, 22:08
Сообщение #34


Участник
*

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



Вариант без WDT
Код
__disable_interrupt();
((void (*)())0x0000)();
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Oct 9 2012, 23:49
Сообщение #35


Гуру
******

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



Цитата(abi @ Oct 10 2012, 01:08) *
Вариант без WDT
Код
__disable_interrupt();
((void (*)())0x0000)();

Это не то же самое - процессор сброшен не будет и вся периферия останется в несброшенном состоянии.
Go to the top of the page
 
+Quote Post
abi
сообщение Oct 10 2012, 02:40
Сообщение #36


Участник
*

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



Цитата(_Артём_ @ Oct 10 2012, 03:49) *
Это не то же самое - процессор сброшен не будет и вся периферия останется в несброшенном состоянии.

Согласен, внутреннего системного сброса не произойдет. В зависимости от замысла принудительного программного сброса, системный сброс может и не понадобиться. В любом случае используемая периферия будет проинициализирована программой.
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Oct 10 2012, 11:44
Сообщение #37


Гуру
******

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



Цитата(abi @ Oct 10 2012, 05:40) *
В любом случае используемая периферия будет проинициализирована программой.

Не в любом случае, а только есть этим озаботиться.
Go to the top of the page
 
+Quote Post
ReAl
сообщение Oct 10 2012, 18:36
Сообщение #38


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

Группа: Свой
Сообщений: 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.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
vgo1
сообщение Oct 11 2012, 16:40
Сообщение #39


Участник
*

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



А нельзя по флагу сделать переход на самое начало программы /адрес 0000/и не задействовать WDT? Надо сбросить флажки всех прерываний и инициализировать указатель стека. Я похожее сделал, работает.
Go to the top of the page
 
+Quote Post
prottoss
сообщение Oct 11 2012, 16:55
Сообщение #40


Гуру
******

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



Цитата(vgo1 @ Oct 11 2012, 22:40) *
А нельзя по флагу сделать переход на самое начало программы /адрес 0000/и не задействовать 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 - 21:17
Рейтинг@Mail.ru


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