Может ли зависнуть WD Timer?

Тема в разделе "Arduino & Shields", создана пользователем AlexVS, 18 дек 2016.

  1. AlexVS

    AlexVS Гик

    Есть серверный блок метеостанции, который:
    1. собирает показания с датчиков, используя канал связи на nRF24;
    2. записывает все полученные показания в БД (My SQL), используя Ethernet Shield на W5500;
    3. считывает из интернета прогноз погоды;
    4. всю имеющуюся инфу отправляет на дисплейный модуль.
    Использую прерывания от WD Timer немного через зад, т.е. не по назначению,тем не менее все прекрасно работает уже не один месяц. Вот код для WDT
    Код (C++):
    ISR (WDT_vect)
    {
        if (EthernetErrCount)           //если ошибка работы с сетью - мигаем красным
        {
          PORTD &= ~(1<<6) & ~(1<<5);    //синий и зеленый выключить
          PIND = (1<<4);
        }
        else if (ESP_state)             //если включен модуль ESP8266 - мигаем синим
        {
          PORTD &= ~(1<<5) & ~(1<<4);    //красный и зеленый выключить
          PIND = (1<<6);                //синий включить/выключить
        }
        else
        {
          if ( LED_state )
          {
              switch (ledstat)
              {
                case 0:
                  PORTD &= ~(1<<6) & ~(1<<5) & ~(1<<4);        
                  ledstat++;  
                  break;
                case 1:
                  PORTD |= (1<<4);               //красный
                  PORTD &= ~(1<<6) & ~(1<<5);      
                  ledstat++;  
                  break;
                case 2:
                  PORTD |= (1<<5);               //зеленый
                  PORTD &= ~(1<<6) & ~(1<<4);    
                  ledstat++;
                  break;
                case 3:
                  PORTD |= (1<<6);               //синий
                  PORTD &= ~(1<<5) & ~(1<<4);          
                  ledstat = 0;
                  break;
              }      
          }
        }
      cntWDT++;
      //т.к. WDTimer заняли другой работой, то принудетельно перегрузим систему через wdtCount сек,
      //если основной цикл перестал сбрасывать счетчик
      if (cntWDT > wdtCount)
      {
        if (LOG_MODE) Log.println(F("WDT REBOOT"));
        resetFunc();
      }
    }
    В какой то момент началась проблема с интернетом, скетч считает кол-во не удачных попыток подключиться к инету и после 10 попытки (по времени это длиться на протяжении 2х часов) ресетит Ethernet Shield. В логе работы есть соответствующая запись, которая подтверждает успешную переинициализацию Ethernet Shield_а, после чего есть запись об успешном получении прогноза погоды, т.е. вроде бы все ОК. НО !!! Через 3 минуты контроллер завис, т.е. прекратились даже прерывания WDT, о чем свидетельствовал постоянно горящий красный светодиод.
    Может я чего то упустил? Как мог подвиснуть независимый таймер?
     
  2. ИгорьК

    ИгорьК Гуру

    Таймер вряд ли зависает. Возможно что-то происхдит в коде, что собаку сбрасывает, а остальное движется как-то не так.
     
  3. Unixon

    Unixon Оракул Модератор

    Только если встанет тактовый генератор...
     
  4. AlexVS

    AlexVS Гик

    Хм, однако не понятно, что могло произойти.
    Вроде в обработчике прерывания все достаточно однозначно, каждый раз должно измениться состояние портов к которым подключены светодиоды. Но когда устройство перестало работать - постоянно горел только красный диод :(