Questions tagged «isr»

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
功能指针分配在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
当从> 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 …

2
Arduino中断(引脚更改)
我使用中断函数将接收自的值填充到数组中digitalRead()。 void setup() { Serial.begin(115200); attachInterrupt(0, test_func, CHANGE); } void test_func(){ if(digitalRead(pin)==HIGH){ test_array[x]=1; } else if(digitalRead(pin)==LOW){ test_array[x]=0; } x=x+1; } 问题是当我打印时,test_array会有诸如:111或的值000。 据我了解,如果我CHANGE在attachInterrupt()函数中使用该选项,则数据序列应始终0101010101不重复。 由于数据来自无线电模块,因此数据变化非常快。
8 arduino-uno  c  isr 
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.