我正在写一个Netduino 3程序,它将控制转向灯和其他干草驾驶继电器。我的程序是在我得到设备之前写的,所以我不确定它会工作得多好,但我已经有一个按钮(hazardButton)的问题了。当应用3.3v时,它不会导致中断触发。应用5v做同样的事情,但是当应用GND时,它会触发中断,但当重新应用GND时,它不会关闭中断。
下面是我的代码:
using System;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using Microsoft.SPOT;
using Microsoft.SPOT.Hardware;
using SecretLabs.NETMF.Hardware;
using SecretLabs.NETMF.Hardware.Netduino;
namespace Tractor_Mate
{
public class Program
{
static InterruptPort hazardButton = new InterruptPort(Pins.GPIO_PIN_D0, false, Port.ResistorMode.Disabled, Port.InterruptMode.InterruptEdgeBoth);
static OutputPort hazardLights = new OutputPort(Pins.ONBOARD_LED, false);
static bool hazardsActive = false;
public static void Main()
{
Debug.Print("Initializing Inputs... ");
hazardButton.OnInterrupt += new NativeEventHandler(hazardButton_OnInterrupt);
Thread.Sleep(Timeout.Infinite);
}
static void hazardButton_OnInterrupt(uint data1, uint data2, DateTime time)
{
while (data2 == 0)
{
hazardLights.Write(true);
Thread.Sleep(500);
hazardLights.Write(false);
Thread.Sleep(500);
hazardsActive = true;
}
hazardsActive = false;
}
}
}我遇到了Hazard Lights的问题,而且还没有尝试过其他任何方法。我正在布线按钮,以便当引脚HIGH它将触发,然后当LOW它关闭它。
发布于 2015-12-10 05:33:56
public class Program
{
static InterruptPort hazardButton = new InterruptPort(Pins.GPIO_PIN_D0, false, Port.ResistorMode.Disabled, Port.InterruptMode.InterruptEdgeBoth);
static OutputPort hazardLights = new OutputPort(Pins.ONBOARD_LED, false);
static volatile bool hazardsActive = false;
public static void Main()
{
Debug.Print("Initializing Inputs... ");
hazardButton.OnInterrupt += new NativeEventHandler(hazardButton_OnInterrupt);
bool lightOn = true;
while (true)
{
if (!hazardsActive)
{
hazardLights.Write(false);
}
else
{
hazardLights.Write(lightOn);
lightOn = !lightOn;
}
Thread.Sleep(500);
}
}
static void hazardButton_OnInterrupt(uint data1, uint data2, DateTime time)
{
hazardsActive = !hazardsActive;
}
}我无法测试它,因为我没有安装Netduino SDK (我有一个NetDuino,但我已经有一段时间没有玩过它了)。原理很简单:
中断仅切换危险的开启或关闭。该变量被标记为volatile,因为它可以从多个线程中设置,并且需要从寄存器而不是线程缓存中读取,因此volatile告诉编译器不要优化它。
main方法有一个无限循环,用于检查危险是打开还是关闭。当危险信号关闭时(if的第一部分),它会向输出引脚写入false (可能是关灯,除非引脚颠倒)。
当危险被打开(else部分)时,它将一个值写入引脚,然后反转该值,以便下一次关闭它,然后打开,然后关闭,等等。循环的最后一部分只等待500ms,然后再次循环。
便笺
根据您正在使用的按钮中触点的“质量”,您可能需要向中断处理程序添加去抖动逻辑。“弹跳”是开关触点(或任何其他机械触点)的一种现象,当状态改变时,它会导致触点快速地多次打开/闭合。这是由于电信号弥合了缝隙,因为触点彼此非常接近(想想静电跳跃的缝隙)。很多时候,这是由一个电容器在硬件方面处理的,但我不确定Netduino是如何处理它的。
https://stackoverflow.com/questions/34188264
复制相似问题