Д_М 0 10 февраля, 2020 Опубликовано 10 февраля, 2020 · Жалоба Приветствую! Код, который давно использую на 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. Где искать различия? Если вдруг есть отработанный код, заранее благодарен! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 131 10 февраля, 2020 Опубликовано 10 февраля, 2020 · Жалоба Открыл даташит на AT90CAN128, вижу Открыл на ATMega128, вижу Хоть это и странно, что на, как заявляется, генераторе в 1МГц, при одинаковых предделителях в одном контроллере получается одно время, а в другом другое... А как Вы умудрились на 2.5с настроить? Что-то нет такого в табличке... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Д_М 0 10 февраля, 2020 Опубликовано 10 февраля, 2020 · Жалоба Ошибочно указал 2,5 секунды. WDP0..2 = 1 то есть 2048K. На Меге примерно 2 секунды и получается. На AT90CAN128 сразу же перегружается, без видимой задержки. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 131 10 февраля, 2020 Опубликовано 10 февраля, 2020 · Жалоба Только что, Д_М сказал: сразу же перегружается, без видимой задержки. Может, WDT в ней аппаратно включен фьюз-битами, а ПО у Вас стартует довольно медленно, приводя МК к сбросу? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Д_М 0 10 февраля, 2020 Опубликовано 10 февраля, 2020 · Жалоба Пробовал, успокоения совести ради, включить фуз бит WDTON. Не получается даже залить программу через загрузчик. Когда вернул обратно, загрузка работает, программа работает. WDT завязан на UART. Сброс WDT производится после получение ответа по UART. Пока не подключено устройство по UART, программа работает. После первого ответа UART производится инициализация и сброс WDT. Таймаут 2 секунды для UART более, чем достаточно. Проверено многократно на Меге. Здесь же перегружается без видимой задержки. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 131 10 февраля, 2020 Опубликовано 10 февраля, 2020 · Жалоба 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мс... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Д_М 0 11 февраля, 2020 Опубликовано 11 февраля, 2020 · Жалоба Просто фантастика! Получилось! Кто бы мог подумать, что из-за бессмысленной команды так всё может измениться. А ведь на Меге работало именно так. Спасибо Вам большое! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maxim77 0 15 апреля, 2021 Опубликовано 15 апреля, 2021 (изменено) · Жалоба Привет. Помогите начинающему. Мне надо сделать функцию сна по таймеру. Контроллер должен спать например 500мс, пробуждаться, проверять CAN, при отсутствии некоторого пакета снова засыпать на следующие 500мс... все это для ожидания включения зажигания, чтобы минимизировать разряд аккумулятора, пока машина выключена. раньше пользовал ATMega328, для которой есть отличная либа LowPower. там это выглядело предельно просто LowPower.powerDown(SLEEP_500MS, ADC_OFF, BOD_OFF); но она не поддерживает AT90CAN. Отдельно сделать Power_Down контроллеру я смог. отдельно настроить WDT на 500мс тоже смог.. но только на ресет контроллера. но вот чтобы регулярно пробуждать его без ресета - никак. знаний не хватает. помогите понять, что, где и как надо сделать, чтобы работало... Изменено 15 апреля, 2021 пользователем Maxim77 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maxim77 0 15 апреля, 2021 Опубликовано 15 апреля, 2021 · Жалоба в общем, если кому надо, то вот я сделал таки легкую библиотеку для Power_Save для AT90CAN опубликовал как часть форка MegaCore у себя. https://github.com/EarlVadim/MegaCore/tree/master/avr/libraries/LowPower-AT90CAN Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться