Jump to content

    

AT90CAN128 Watch Dog

Приветствую!

Код, который давно использую на ATmega128 некорректно работает на AT90CAN128. Расчётный таймаут 2,5 сек, фактически многократно меньше. Измерить нет возможности.

void WDT_res(void)
{
GI_disable;
WDTCR |= (1<<WDCE) | (1<<WDE);
WDTCR = 0x00;

WDTCR |= (1<<WDCE) | (1<<WDE);
WDTCR |= (1<<WDE) | (1<<WDP0) | (1<<WDP1)| (1<<WDP2);
GI_enable;
}

Как ни вчитывался в мануалы, но не нашёл отличия между микроконтроллерами в механизме WatchDog. Где искать различия? Если вдруг есть отработанный код, заранее благодарен!

Share this post


Link to post
Share on other sites

Открыл даташит на AT90CAN128, вижу

image.png.05c4ca98214cd16321b00b7a2e15e78c.png

 

Открыл на ATMega128, вижу

image.thumb.png.32426e84a17d1147138be988622ddc8b.png

 

Хоть это и странно, что на, как заявляется, генераторе в 1МГц, при одинаковых предделителях в одном контроллере получается одно время, а в другом другое...

А как Вы умудрились на 2.5с настроить? Что-то нет такого в табличке...

Share this post


Link to post
Share on other sites

Ошибочно указал 2,5 секунды. WDP0..2 = 1 то есть 2048K. На Меге примерно 2 секунды и получается. На AT90CAN128 сразу же перегружается, без видимой задержки.

Share this post


Link to post
Share on other sites
Только что, Д_М сказал:

сразу же перегружается, без видимой задержки.

Может, WDT в ней аппаратно включен фьюз-битами, а ПО у Вас стартует довольно медленно, приводя МК к сбросу?

Share this post


Link to post
Share on other sites

Пробовал, успокоения совести ради, включить фуз бит WDTON. Не получается даже залить программу через загрузчик. Когда вернул обратно, загрузка работает, программа работает. WDT завязан на UART. Сброс WDT производится после получение ответа по UART. Пока не подключено устройство по UART, программа работает. После первого ответа UART производится инициализация и сброс WDT. Таймаут 2 секунды для UART более, чем достаточно. Проверено многократно на Меге. Здесь же перегружается без видимой задержки.

Share this post


Link to post
Share on other sites
1 час назад, Д_М сказал:

Пробовал, успокоения совести ради, включить фуз бит WDTON...

Попробуйте копирнуть проект и выкинуть из него все, кроме работы с WDT (таким образом, сделав этот проект тестовым).

Запустите программно (как у Вас сейчас) собаку и посмотрите, через сколько контроллер сбросится (любым способом: GPIO + осцилл и т.д.).

Так отлаживать надежнее и результат получится годным для дальнейших поисков проблемы.

 

Вот так попробуйте

void WDT_res(void)
{
  GI_disable;
  WDTCR |= (1<<WDCE) | (1<<WDE);
  WDTCR = 0x00;
  WDTCR = (1<<WDCE) | (1<<WDE);
  WDTCR = (1<<WDE) | (1<<WDP0) | (1<<WDP1)| (1<<WDP2);
  GI_enable;
}

потому как мануал пишет

Цитата

Safety Level 1

In this mode, the Watchdog Timer is initially disabled, but can be enabled by writing the WDE bit to 1 without any restriction. A timed sequence is needed when changing the Watchdog Time-out period or disabling an enabled Watchdog Timer. To disable an enabled Watchdog Timer, and/or changing the Watchdog Time-out, the following procedure must be followed:

1. In the same operation, write a logic one to WDCE and WDE. A logic one must be written to WDE regardless of the previous value of the WDE bit.

2. Within the next four clock cycles, in the same operation, write the WDE and WDP bits as desired, but with the WDCE bit cleared.

 

Возможно, из-за последнего "но" WDT включается, но настройки периода не защелкиваются и он срабатывает "по дефолту" на 17мс...

Share this post


Link to post
Share on other sites

Просто фантастика! Получилось! Кто бы мог подумать, что из-за бессмысленной команды так всё может измениться. А ведь на Меге работало именно так. Спасибо Вам большое!

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this