Questions tagged «interrupt»

中断允许处理器暂时挂起正常操作,以便可以代替处理高优先级的软件或硬件事件。

3
输入更改时可以自动调用功能吗?
目前,我的草图是每次绕主循环检查一次输入引脚。如果检测到更改,它将调用自定义函数以对此做出响应。这是代码(精简了要点): int pinValue = LOW; void pinChanged() { //... } void setup() { pinMode(2, INPUT); } void loop() { // Read current input int newValue = digitalRead(2); // Has the input changed? if (newValue != pinValue) { pinValue = newValue; pinChanged(); } } 不幸的是,对于输入的非常短的更改(例如短暂的脉冲),这并不总是能正常工作,尤其loop()是在运行缓慢的情况下。 有没有办法让Arduino检测到输入变化并自动调用我的函数?
21 pins  interrupt  isr 

2
Uno可以处理多少个中断引脚?
我正在与Arduino Uno R3一起使用7通道RC接收器。在文档中,提到了最多2个中断引脚,而在某些其他博客上,我提到使用PinChangeInt库使用多达20个引脚作为中断。那么,Arduino可以原生处理多少个中断?并且这与PinChangeInt等软件支持可以处理多少个不同?

2
使用旋转编码器可以获得Arduino的精度如何?
对于大型电动机,步进电动机通常很昂贵。但是,借助功能强大的标准直流电动机和旋转编码器,您可以“模拟”步进电动机。仅使用基本循环而没有太多其他代码的Arduino旋转编码器的精度如何?是否会“错过一个脉冲”而不会经常记录足够的旋转?如何使用更多代码处理此问题?有一个更好的方法吗?中断会有所帮助吗?是否有某种电路可以解决此问题? 注意:每秒可能不会超过4圈... (这可能很多,但是如果您正在做导螺杆式机械装置,则每英寸直线运动10圈时,每分钟只有24英寸。 )

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
中断计数脉冲
我一直在尝试计算来自12,500 Hz方波的脉冲以触发输出。这是我到目前为止的代码。重置Arduino后,它将在25毫秒的样本中将315打印至串行。315 x 40 =12600。在我看来,它运行良好。 我唯一的问题是,仅在板复位后才返回此数字。现在,如果我将相同的代码向下移动到void loop,它会连续计数,从而给我带来不固定的回报。 我不明白我需要在循环部分中输入什么内容,因此我可以重复而准确地计算一段时间内输入引脚的切换次数,因此我可以根据存在的12,500个对输出做些什么Hz信号与否。 volatile int IRQcount; int pin = 2; int pin_irq = 0; //IRQ that matches to pin 2 void setup() { // Put your setup code here, to run once: Serial.begin (9600); attachInterrupt(pin_irq, IRQcounter, RISING); delay(25); detachInterrupt(pin); Serial.print(F("Counted = ")); Serial.println(IRQcount); } void …
10 interrupt 

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 

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 …

3
多个独立的LED模式
我有一个问题,乍一想(是Arduino的新手),我虽然是Arduino的完美应用程序。但是,在尝试并未能实施之后,我怀疑自己! 简而言之-我需要独立控制许多LED,其中许多LED都有自己的样式-例如“ 5秒钟打开-5秒钟关闭”。“连续闪烁”-或诸如“ 2次闪烁,暂停,1次闪烁”之类的序列。显然,如果没有线程的奢侈,我会变得有些困惑。非常高兴听到a)Arduino是最佳选择,b)如果是-我该怎么做! 提前致谢 :)
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.