如何获取精确的毫秒数?
我需要计算从Arduino A向Arduino B发送数据的延迟。我尝试使用DS3231,但无法获得毫秒数。我应该怎么做才能从DS3231获得精确的毫秒?
发布于 2017-06-20 18:36:47
上面的评论是正确的,但是当你有一个专用的实时时钟时,使用millis()是没有意义的。我会为你提供更好的指导。
任何硬件接口项目的第一件事是仔细阅读 . DS3231数据表,该数据表显示有五种可能的亚秒级输出频率(参见第13页):
最后四个选项由RS1和RS2控制位的各种组合实现。
因此,例如,要获得精确的毫秒数,您可以选择选项2,1 1KHz。您可以设置RS1 =0和RS2 =0(请参阅您提供的数据手册的第13页)和INTCN =0(第9页)。然后你需要一个ISR来捕获从设备的!INT/SQW引脚到你的Arduino上的数字输入引脚的中断。
volatile uint16_t milliseconds; // volatile important here since we're changing this variable inside an interrupt service routine:
ISR(INT0_vect) // or whatever pin/interrupt you choose
{
++milliseconds;
if(milliseconds == 999) // roll over to zero
milliseconds = 0;
}或者:
const int RTCpin = 3; // use any digital pin you need.
void setup()
{
pinmode(RTCpin, INPUT);
// Global Enable INT0 interrupt
GICR |= ( 1 < < INT0);
// Signal change triggers interrupt
MCUCR |= ( 1 << ISC00);
MCUCR |= ( 0 << ISC01);
}如果setup()中的这些命令在Arduino上不起作用,google 'Arduino外部中断INT0‘。我已经向您展示了两种方法,一种使用Arduino代码,另一种使用C。
一旦您的ISR和DS3231的pin3连接到您选择的数字输入引脚,该引脚将以1 1KHz或每毫秒激活。太棒了!
// down in main program now you have access to milliseconds, you might want to start off by setting:
// When 1-second RTC changes seconds:
milliseconds = 0; // So you can measure milliseconds since last second.非那样做不行。您现在需要学习的就是如何使用I2C命令设置命令寄存器,您就都设置好了。
发布于 2018-07-23 00:25:34
C代码示例每秒增加1毫秒。应该是:
{
if (milliseconds == 999) // roll over to zero
milliseconds = 0;
else
++milliseconds;
}https://stackoverflow.com/questions/44644383
复制相似问题