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

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. Где искать различия? Если вдруг есть отработанный код, заранее благодарен!

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


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

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

image.png.05c4ca98214cd16321b00b7a2e15e78c.png

 

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

image.thumb.png.32426e84a17d1147138be988622ddc8b.png

 

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

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

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


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

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

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


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

Только что, Д_М сказал:

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

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

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


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

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

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


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

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мс...

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


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

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

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


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

Привет. 

Помогите начинающему.

Мне надо сделать функцию сна по таймеру.

Контроллер должен спать например 500мс, пробуждаться, проверять CAN, при отсутствии некоторого пакета снова засыпать на следующие 500мс...
все это для ожидания включения зажигания, чтобы минимизировать разряд аккумулятора, пока машина выключена.

раньше пользовал ATMega328, для которой есть отличная либа LowPower. там это выглядело предельно просто 

LowPower.powerDown(SLEEP_500MS, ADC_OFF, BOD_OFF); 

но она не поддерживает AT90CAN.

Отдельно сделать Power_Down контроллеру я смог. отдельно настроить WDT на 500мс тоже смог.. но только на ресет контроллера.

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

помогите понять, что, где и как надо сделать, чтобы работало...

Изменено пользователем Maxim77

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


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

в общем, если кому надо, то вот я сделал таки легкую библиотеку для Power_Save для AT90CAN

опубликовал как часть форка MegaCore у себя.

https://github.com/EarlVadim/MegaCore/tree/master/avr/libraries/LowPower-AT90CAN

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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