Миллисекунды с использованием прямоугольной волны 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;
}
@Amr Ahmed, 👍0
Обсуждение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
- Часовой механизм на основе шагового двигателя с DS3231
- Как справиться с rollover millis()?
- Преобразование в Unix Timestamp и обратно
- Использование millis() и micros() внутри процедуры прерывания
- Разница между «time_t» и «DateTime»
- Создание таймера с использованием часов реального времени с указанием времени начала и остановки
- DS1307RTC Выводит загадочную дату 165/165/2165. Какие возможны исправления?
- ардуино - миллисекунды ()
что не является точным +/-2 миллисекунды? ... для выполнения команды
выводит время чч: мм: сс: мс
требуется время, @jsotolaитак, если я сделаю это с помощью внешних часов, будет ли это иметь значение?, @Amr Ahmed
Вы не можете получить лучше, чем ± 2 мс с помощью
millis ()
. Если вам нужна большая точность, используйтеmicros ()
., @Edgar Bonetтот же код или что вы предлагаете?, @Amr Ahmed