На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
    > Arduino Nano. Странное поведение кода при переполнении функции micros().
      Задача: сделать так, чтобы loop отрабатывал 100.000мкс при отработке кода в нем за меньшее время - с максимально возможной точностью. У данного кода теоретическая точность - 4мкс.

      ExpandedWrap disabled
        volatile unsigned long ulMCS_Begin = micros();
         
        //Далее код длительностью 93мс.
         
          volatile unsigned long ulMCS_End = micros();
          volatile unsigned long iSign = 1;
         
          if (ulMCS_Begin > ulMCS_End)
          {
            ulMCS_Begin = 4294967295 - ulMCS_Begin + 1;
            iSign = -1;
          }
            volatile const unsigned long ulMCS_Needed = iSign*ulMCS_Begin + g_fPeriod_Loop_MCS; //g_fPeriod_Loop_MCS = константа 100.000мкс.
            volatile const float fMCS_Delay = g_fPeriod_Loop_MCS - (ulMCS_End - iSign*ulMCS_Begin); //Необходимая задержка в мкс. Теперь ее нужно грамотно реализовать.
         
            if (fMCS_Delay < 0) vError(10, String(g_fPeriod_Loop_MCS - fMCS_Delay, 0));
          if (fMCS_Delay < 1) vError(15, String(g_fPeriod_Loop_MCS - fMCS_Delay, 0));
         
            while (ulMCS_Needed > ulMCS_End) ulMCS_End = micros();
          if (ulMCS_End-iSign*ulMCS_Begin < g_fPeriod_Loop_MCS-108 || ulMCS_End-iSign*ulMCS_Begin > g_fPeriod_Loop_MCS+108) vError(16, String(float(ulMCS_Needed), 0));


      При переполнении micros (переходе 4294967295 в 0) - почему-то данный код не срабатывает, считая, что ulMCS_Needed = 0.

      Не могу найти, в чем логический косяк.
      Сообщение отредактировано: Сергей85 -
      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
      0 пользователей:


      Рейтинг@Mail.ru
      [ Script execution time: 0,0199 ]   [ 15 queries used ]   [ Generated: 3.10.24, 11:23 GMT ]