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

 
 
> Watchdog Timer, Работает не так как хочется
Pavel V.
сообщение Jun 3 2008, 07:26
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 211
Регистрация: 3-06-06
Пользователь №: 17 742



Пытаюсь использовать сторожевой таймер в своем устройстве по прямому назначению (т.е. в режиме сторожевого таймера), но получаю не совсем понятную реакцию.

Приведу свой код:

Код
#pragma vector=NMI_VECTOR
#pragma type_attribute=__interrupt
void osc_fault(void)
{  
      BCSCTL2 = SELM_0 + DIVM_0 + DIVS_0;                       // DCO
      BCSCTL1 = DIVA_0 + RSEL2 + RSEL1 + RSEL0;               //ACLK=XT1/1=32768
      DCOCTL = DCO0 + DCO1 + DCO2;                                 //DCO 6 MHz
      while ((IFG1&OFIFG) != 0) IFG1 &= ~OFIFG;  

      BCSCTL2 = SELM_2 + DIVM_0 + SELS + DIVS_0;              //MCLK=XT2/1=8000
                                                                                             //SMCLK=XT2/1=
      IE1 |= OFIE;
}

int main( void )
{
    WDTCTL = WDTPW + WDTHOLD;         // Stop watchdog timer to prevent time out reset
    IFG1 |= OFIFG;                    // Set flag OFIFG
    IE1 = OFIE;                       // Enable IRQ from OSC fault
          
    adc_init();
    initTimerA();
    I2CInit();
    LCDInit();
    
    WDTCTL = WDT_ARST_1000;  // WDTPW+WDTCNTCL+WDTSSEL

    while(1)
    {


               [здесь выполняется некая процедура длительностью много меньше 1 с]


          WDTCTL = WDTPW + WDTCNTCL; // Clear watchdog cnt
    }
}



В результате с периодом 1 с я попадаю в прерывание NMI_VECTOR.

Что я делаю неправильно? Как вообще необходимо работать со сторожевым таймером? Я использую его первый раз.

Спасибо!


--------------------
Good News Everyone!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
bloodden
сообщение Jun 3 2008, 08:38
Сообщение #2


Бывалый
***

Группа: Validating
Сообщений: 375
Регистрация: 19-10-05
Из: Kiev, UA
Пользователь №: 9 853



Я вчера тоже попался на этот прикол. Ноги растут из каких-то сэмплов.
WDTCTL = WDTPW + WDTHOLD; - там в комментариях к этой строчке написано что сбрасываем собаку smile.gif
Вот народ и попадается периодически.


--------------------
Заходите кому надо на мой сайт
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Oct 8 2008, 10:20
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(bloodden @ Jun 3 2008, 11:38) *
Я вчера тоже попался на этот прикол. Ноги растут из каких-то сэмплов.
WDTCTL = WDTPW + WDTHOLD; - там в комментариях к этой строчке написано что сбрасываем собаку smile.gif
Вот народ и попадается периодически.
Я написал им запрос по этому поводу и получил вот такой ответ, который больше тянет на отмазку:
Цитата
Цитата
Question #2.
In the same slau144e (but in the UG for other families as well) part Watchdog timer, note 10.2.7. Software examples there is a following example:
; Periodically clear an active watchdog
MOV #WDTPW+WDTCNTCL,&WDTCTL
;
; Change watchdog timer+ interval
MOV #WDTPW+WDTCNTL+WDTSSEL,&WDTCTL

But there is no mentioning that except reset watchdog first command also switch clocking watchdog for SMCLK/32768 and switch pin RST/NMI into Reset mode.
I think this example should be changed and it should be clearly shown that in Reset command you should set the same bits which were used with watchdog start. Something like:
; Start watchdog in watchdog mode with ACLK/8192 period:
MOV #WDTPW+WDTCNTCL+WDTSSEL+WDTIS0,&WDTCTL
; Periodically clear an active watchdog
MOV #WDTPW+WDTCNTCL+WDTSSEL+WDTIS0,&WDTCTL

Or you should mention in the comments that this is repeating watchdog reset, set for SMCLK/32768 with RST/NMI in Reset mode.
Search in several forums shows that I am not the only one who met this problem.
Please be aware that the User’s Manual includes only a very small number of examples. There are some more watchdog examples included into TI code examples - which of course also not showing all possible settings. The User’s Manual is showing all available register/settings and also the standard register setting after a reset. Customer need to check/select the optimal settings fitting best to his application.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post



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

 


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


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