Миллисекунды с использованием прямоугольной волны RTC

я пытаюсь создать код, который печатает время hh: mm: ss: ms, используя RTC, я сделал это с помощью millis(), но это не точно + /-2 миллисекунды

но могу ли я сделать это, используя sq wave и intterupt

вот код, который я использовал

#include <Wire.h>
#include "RTClib.h"

RTC_DS1307 RTC;      // Это аппаратный RTC
RTC_Millis SoftRTC;   // Это программное обеспечение RTC
long startMS;  // Это время запуска в миллисекундах

void setup ()
{
    Wire.begin();
    RTC.begin();                       // Подключение к DS1307
    SoftRTC.begin(RTC.now());  // Инициализировать SoftRTC текущим временем
    startMS = millis();  // получить текущее количество миллисекунд
}

void loop()
{
    DateTime now = SoftRTC.now();
    long nowMS = millis();
   
    Serial.print(now.year(), DEC);
    Serial.print('/');
    Serial.print(now.month(), DEC);
    Serial.print('/');
    Serial.print(now.day(), DEC);
    Serial.print(' ');
    Serial.print(now.hour(), DEC);
    Serial.print(':');
    Serial.print(now.minute(), DEC);
    Serial.print(':');
    Serial.print(now.second(), DEC);
    Serial.print(':');
    Serial.print((nowMS - startMS)%1000, DEC);  // печать миллисекунд
    Serial.println();

я попытался поместить этот код, основанный на ISR, но безуспешно

volatile time_t isrUTC;         // Копия ISR текущего времени в UTC
volatile time_t millisecondsFromISR;         // Копия ISR текущего времени со смещением в миллисекунду

void incrementTime()
{
    millisecondsFromISR = millis();  //сделайте сначала, чтобы получить максимальную точность
    ++isrUTC;
}

int getMilliseconds() {
    // нужно сделать атомарную копию:
    nointerrupts();
    unsigned long t = millisecondsFromISR;
    interrupts();

    return millis() - t;
}

, 👍0

Обсуждение

что не является точным +/-2 миллисекунды? ... для выполнения команды выводит время чч: мм: сс: мс требуется время, @jsotola

итак, если я сделаю это с помощью внешних часов, будет ли это иметь значение?, @Amr Ahmed

Вы не можете получить лучше, чем ± 2 мс с помощью millis (). Если вам нужна большая точность, используйте micros ()., @Edgar Bonet

тот же код или что вы предлагаете?, @Amr Ahmed


1 ответ


1

Все, что вам нужно сделать, это записать количество миллисекунд в момент переключения прямоугольной волны на 1-секундный цикл. Тогда ваши миллисекунды - это разница между этим и текущим.

Короче говоря: обновляйте startMS при запуске на выходе RTC.

,

есть ли у вас вспомогательный код?, @Amr Ahmed

@AmrAhmed нет, но у вас уже есть код для установки startms в вашей программе, и в Интернете есть множество примеров прерываний., @Majenko

да, я проверил эти коды на наличие прерываний, но не смог создать работающий код, @Amr Ahmed

@AmrAhmed Тогда, может быть, вам стоит попробовать еще раз, а затем показать нам, что вы пробовали, и мы, возможно, сможем вам в этом помочь., @Majenko

volatile time_t isrUTC; // Копия ISR текущего времени в UTC volatile time_t millisecondsFromISR; // Копия ISR текущего времени со смещением в миллисекунду ... время приращения пустоты() { millisecondsFromISR = millis(); //сделайте сначала, чтобы получить максимальную точность ++isrUTC; } ... int getMilliseconds() { // нужно сделать атомарную копию: никаких вмешательств(); беззнаковый long t = миллисекунды от Misr; прерывания(); возвратный миллис() - t; } это один из кодов, над которым я безуспешно пытался работать, @Amr Ahmed

Комментарии @AmrAhmed предназначены не для кода., @Majenko

я добавил код в свой вопрос, @Amr Ahmed

И что с этим не сработало? Как этот фрагмент кода интегрируется с остальной частью вашего кода?, @Majenko

я не мог заставить его работать, @Amr Ahmed

Не видя, как этот фрагмент интегрирован с остальной частью вашего кода или как подключен модуль RTC, мы не сможем помочь /., @Majenko

к сожалению, это то, что я получил, когда попытался интегрировать оба, @Amr Ahmed