Скрыть объявление
На нашем форуме недоступен просмотр изображений для неавторизованных пользователей. Если Вы уже зарегистрированы на нашем форуме, то можете войти. Если у Вас еще нет аккаунта, мы будем рады, если Вы к нам присоединитесь. Зарегистрироваться Вы можете здесь.

Вопрос Счетчик микросекунд

Тема в разделе "SDK и создание собственных прошивок", создана пользователем Br.Misha, 1 мар 2016.

  1. Br.Misha

    Br.Misha Новичок

    Сообщения:
    50
    Симпатии:
    3
    Здравствуйте!
    Нужно нужно зафиксировать время от начала некоторого события до появления положительного сигнала на ножке (10-100 микросекунд).
    Скажите, пожалуйста, есть ли у ESP какие-то счетчики для таких целей? Таймеры ОС здесь явно не помогут))).

    Спасибо!
     
  2. pvvx

    pvvx Активный участник сообщества

    Сообщения:
    9.301
    Симпатии:
    1.319
    uint32 phy_get_mactime(void); // в us (читает младшие 32 бита 64-х битного аппаратного счетчика)
    Запоминаете и делаете разницу с новым значением.
    Если надо больший период, например в сутках с дискретом в us, то:
    Код (C):
    1.  
    2. #define MAC_TIMER64BIT_COUNT_ADDR 0x3ff21048
    3. uint64 ICACHE_FLASH_ATTR get_mac_time(void)
    4. {
    5.     union {
    6.         volatile uint32 dw[2];
    7.         uint64 dd;
    8.     }ux;
    9.     volatile uint32 * ptr = (volatile uint32 *)MAC_TIMER64BIT_COUNT_ADDR;
    10.     ux.dw[0] = ptr[0];
    11.     ux.dw[1] = ptr[1];
    12.     if(ux.dw[1] != ptr[1]) {
    13.         ux.dw[0] = ptr[0];
    14.         ux.dw[1] = ptr[1];
    15.     }
    16.     return ux.dd;
    17. }
    18.  
    get_mac_time() - показывает время со старта модуля в us - читает полный аппаратный счетчик с учетом перехода старшего слова во время считывания...
    uint32 system_get_time(); - аналог phy_get_mactime(), но прибавляет значение uint32 WdevTimOffSet.
     
    Последнее редактирование: 1 мар 2016
    gerkimuyda нравится это.
  3. Br.Misha

    Br.Misha Новичок

    Сообщения:
    50
    Симпатии:
    3
    Спасибо, дружище)))
     
  4. vad7

    vad7 Авторитетный участник сообщества

    Сообщения:
    398
    Симпатии:
    48
    у меня mac_time не работал на время запрещенных прерываний, разбираться особо не стал, использую system_get_time.
     
  5. pvvx

    pvvx Активный участник сообщества

    Сообщения:
    9.301
    Симпатии:
    1.319
    Чудеса в решете:
    Код (Text):
    1.  
    2. system_get_time:
    3.     l32r            a3, a_WdevTimOffSet
    4.     l32r            a2, dw0x3FF20A00
    5.     l32i.n          a3, a3, 0
    6.     memw
    7.     l32i            a2, a2, 0x200    ; 0x3FF20C00
    8.     add.n           a2, a2, a3
    9.     ret.n
    10.  
    11. phy_get_mactime:
    12.     l32r            a2, dw0x3FF20A00
    13.     memw
    14.     l32i            a2, a2, 0x200    ; 0x3FF20C00
    15.     ret.n
    Найдите различие. :) Оно в описанном ранее - system_get_time длиннее и прибавляет китайскую константу WdevTimOffSet...
    А вот get_mac_time() и ets_intr_lock() :
    Код (C):
    1.  
    2.            union {
    3.                     uint32 dw[2];
    4.                     uint64 dd;
    5.                 }ux;
    6.              ets_intr_lock();
    7.              ux.dd = get_mac_time();
    8.              volatile uint32 x = 1024;
    9.              while(x--);
    10.              ux.dd = get_mac_time() - ux.dd;
    11.              ets_intr_unlock();
    12.              tcp_puts("0x%08x%08x", ux.dw[1], ux.dw[0]);
    CONNECT: ws://192.168.4.1/web.cgi
    CONNECTED
    SEND TEXT: sys_test
    RECEIVED TEXT: 0x000000000000002d
    CLOSED: (1000)
     
    Последнее редактирование: 3 мар 2016
  6. gerkimuyda

    gerkimuyda Авторитетный участник сообщества

    Сообщения:
    309
    Симпатии:
    62
    О, как раз собирался писать свою функцию, чтобы решить ограничения с переполнением uint32 system_get_time()
    ( system_get_time() и micros() переполняются каждые 72 минуты, а millies() - 49 дней)
    Так что - апну тему ;), пригодилась.
     

Поделиться этой страницей