Questions tagged «timers»

计时器是处理器中用于对事件进行计数和计时的硬件。使用此标签可查询有关硬件计时器的问题。

3
在中断例程中使用millis()和micros()
文档attachInterrupt()说明: ... millis()依靠中断来计数,因此它在ISR内永远不会增加。由于delay()需要中断才能起作用,因此如果在ISR内部调用,它将不会起作用。micros()最初可以正常工作,但将在1-2 ms之后开始异常运行。... 如何micros()从不同millis()(当然除了他们的精确度)?以上警告是否表示micros()在中断例程中使用始终是个坏主意? 上下文-我想测量低脉冲占用率,因此需要在输入信号发生变化时触发例程并记录当前时间。

2
功能指针分配在Arduino中是原子的吗?
以下代码片段来自TimerOne库源代码: // TimerOne.h: void (*isrCallback)(); // TimerOne.cpp: ISR(TIMER1_OVF_vect) // interrupt service routine that wraps a user defined function supplied by attachInterrupt { Timer1.isrCallback(); } // TimerOne.cpp: void TimerOne::attachInterrupt(void (*isr)(), long microseconds) { if(microseconds > 0) setPeriod(microseconds); isrCallback = isr; // register the user's callback with the real ISR TIMSK1 = …

1
将Timer3设置为CTC模式-与伺服库冲突
我想设置一个计时器,以便每秒调用一个函数800次。我正在使用预分频器为1024的Arduino Mega和Timer3。为选择预分频器,我考虑了以下步骤: CPU频率:16MHz 计时器分辨率:65536(16位) 16x10 ^ 6 /:由所选择的预分频CPU频率1024 = 15625 将其余部分除以所需的频率62500/800 = 19。 将结果+1放入OCR3寄存器。 我已使用下表设置TCCR3B的寄存器: 错误 不可能编译代码。这是编译器返回的错误: Servo \ Servo.cpp.o:在功能'__vector_32'中:C:\ Program Files(x86)\ Arduino \ libraries \ Servo / Servo.cpp:110:'__vector_32'AccelPart1_35.cpp.o:C:\的多个定义程序文件(x86)\ Arduino / AccelPart1_35.ino:457:首先在这里定义c:/程序文件(x86)/ arduino / hardware / tools / avr / bin /../ lib / gcc / avr / 4.3.2 /。 …

3
有人可以解释一下用来设置计时器的奇怪代码吗?
在看别人写的草图时,我偶尔会遇到一些看起来像这样的代码: TCCR1A = 0; TCCR1B = 0; TCNT1 = 34286; TCCR1B |= (1 << CS12); TIMSK1 |= (1 << TOIE1); 我所知道的是与计时/计时器有关(我认为)。我该如何解密和创建这样的代码?什么是TCCR1A,TCCR1B,TCNT1,CS12,TIMSK1,和TOIE1?

4
每24小时使用计时器打开Arduino
我目前正在研究一个Arduino项目,该项目每天通过ESP8266向我发送汽车电池的电量。在冬季,我不开车,我想在电池跌落到临界值以上时得到通知,以便为电池充电并防止损坏。 因此,能源效率对于该项目很重要,因此它不会使电池本身放电。我阅读了很多有关睡眠模式,高效的下拉稳压器等的信息。这些都具有一个共同点,那就是稳压器一直在运行,这不是我想要的。 我正在寻找某种“计时器上的夹心电路”。它应该倒计时24小时,然后打开一个继电器或MOSFET,将稳压器连接到电源,然后打开Arduino和ESP8266。Arduino完成传输后,它将重置计时器,从而将稳压器与电源断开,依此类推。当然,定时器电路仅需消耗很少的功率。 有人知道这样的电路吗?我在搜索速卖通时想到的所有单词变体都没有成功。还是可以轻松使用IC创建这样的电路的IC?
9 power  timers  relay 

6
可能有很长的delay()吗?
我正在尝试打开一个应该每12小时打开或关闭的小门。我想知道我是否可以制作一个带有delay()的小型循环脚本12个小时,delay(43 200 000 000); 我猜?但是,我不知道这是否可能和/或值得推荐。一些反馈/替代品(如果需要)将是不错的:)

1
当从> 1个ISR访问变量但不在ISR外部共享变量时,是否需要volatile?
有明确记录表明,当与ISR和主程序共享全局数据时,需要声明数据volatile以保证内存可见性(并且仅满足1字节数据;任何较大的数据都需要进行特殊安排以保证原子性) 。这里我们有很好的规则: 仅在ISR外部使用的变量不应是volatile。 仅在ISR内部使用的变量不应是可变的。 在ISR内部和外部使用的变量应该是可变的。 但是volatile,当从1个以上的ISR访问变量但不与ISR共享外部变量时是否需要?例如,我有一个使用static变量维护内部状态的函数: void func() { static volatile long counter; // volatile or not? // Do stuff with counter etc. } 可以通过两种方式调用该函数:从引脚中断和从TimerOne库: attachInterrupt(0, func, CHANGE); Timer1.attachInterrupt(func); 没有原子性问题,因为输入ISR时会自动禁用中断,但这volatile更多是编译器的问题:什么是缓存,什么不是。 当然比后悔好...
9 interrupt  timers  isr 


5
Arduino如何输出特定的(即56 kHz)载波频率?
我正在研究一个自由空间光学项目,以在两点之间无线发送数据。为了实现这一点,我使用了连接到Arduino Uno的IR LED,该信号以发射器的56 kHz载波频率脉动,而第二个Arduino以接收器的56 kHz红外探测器模块脉动。 我尝试在引脚高电平和引脚低电平命令之间使用delayMicroseconds()来创建载波频率。这种工作方式有效,但是频率并不总是相同,脉冲信号的任何其他延迟(即调用函数和递减所需的时间)都可以改变它。 阅读ATmega328的数据表,似乎可以使用芯片的定时器来设置更精确的脉冲。这是否可能,如果可以,如何使用计时器创建一个56 kHz的脉冲?

5
我可以使delayMicroseconds更准确吗?
我正在尝试爆炸DMX数据,这需要4us脉冲。我正在检查结果是否运气不佳,以查看Arduino在延迟方面的表现如何……似乎非常糟糕。 我做了一个快速的小测试: unsigned long ptime; void setup() { Serial.begin(9600); } void loop() { ptime = micros(); delayMicroseconds(4); Serial.println(micros() - ptime); delay(1000); //just to keep the serial monitor from going nuts } 结果: 8 4 8 4 4 4 4 4 8 8 8 8 4 8 8 4 4 8 …

2
如何使用计时器更新ISR中的变量
我正在尝试使用计数器检查Timer3的频率。声明为易失性的计数器的值在ISR中递增,并且每秒在主循环中显示总和,并将该值重置为零。 计时器已正确设置。(如果选择3Hz计时器,我会看到LED闪烁) 问题 计数器不增加。这是输出: Setup Completed tick: 1 tick: 0 tick: 0 tick: 0 码 volatile int cont = 0; void setup() { Serial.begin(9600); pinMode(13, OUTPUT); // Initialize Timer cli(); // disable global interrupts TCCR3A = 0; // set entire TCCR3A register to 0 TCCR3B = 0; // same for …
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.