Closed dontsovcmc closed 3 years ago
В последней экспериментальной версии сейчас это выглядит так:
ISR( WDT_vect ) {
++wdt_count;
}
setup() {
noInterrupts();
info.service = MCUSR; // причина перезагрузки
MCUSR = 0; // без этого не работает после перезагрузки по watchdog
wdt_disable();
interrupts();
set_sleep_mode( SLEEP_MODE_PWR_DOWN );
....
}
void loop() {
power_all_disable(); // Отключаем все лишнее: ADC, Timer 0 and 1, serial interface
wdt_enable(WDTO_250MS);
interrupts();
wdt_count = 0;
while ((wdt_count < wakeup_period) && !button.pressed())
{
counting();
WDTCR |= _BV(WDIE);
sleep_mode();
}
wdt_disable();
interrupts();
power_all_enable();
....
}
Текущая версия прошивки: 22
Если будут вопросы, открою задачу
В ватериусе не работает перезагрузка attiny при наступлении таймаута watchdog. Возможно именно это является причиной редких зависаний. Проверяется добавлением паузы, скажем в функцию counting:
Конфигурирование watchdog для этой цели:
MCUSR = 0; WDTCR = bit( WDCE ) | bit( WDE ); WDTCR = bit( WDIE ) | bit( WDE ) | bit( WDP2 ); //Именно тут нужно взводить бит WDE для перезагрузки
Обязательно очищать MCUSR - без этого МК не перезапуститься после ресета (потребление скачет 240-400мкА)
И добавить WDTCR |= _BV(WDIE); перед sleep_mode();
Теперь при замыкании input1 - будет сброс по watchgod изза паузы в 300мс и мы видим reset++ и service=8.