dontsovcmc / waterius

Передача показаний воды по Wi-Fi. Watermeter Wi-Fi transmitter.
https://waterius.ru
GNU Lesser General Public License v3.0
564 stars 108 forks source link

Добавить перезагрузку по watchdog #196

Closed dontsovcmc closed 3 years ago

dontsovcmc commented 3 years ago

В ватериусе не работает перезагрузка attiny при наступлении таймаута watchdog. Возможно именно это является причиной редких зависаний. Проверяется добавлением паузы, скажем в функцию counting:

    if (counter1.is_impuls()) {
        info.data.value1++;
        info.states.state1 = counter1.state;
        info.adc.adc1 = counter1.adc;
        storage.add(info.data);

        delayMicroseconds(65000);
        delayMicroseconds(65000);
        delayMicroseconds(65000);
        delayMicroseconds(65000);
        delayMicroseconds(65000);
    }

Конфигурирование 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.

dontsovcmc commented 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();
        ....
}
dontsovcmc commented 3 years ago

Текущая версия прошивки: 22

Если будут вопросы, открою задачу