Netduino中断端口不一致

本文关键字:不一致 中断 Netduino | 更新日期: 2023-09-27 18:26:15

我正在编写一个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时它就会关闭。

Netduino中断端口不一致

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部分),它会向引脚写入一个值,然后反转该值,以便下次将其关闭,然后打开,然后关闭,等等。循环的最后一部分只需等待500毫秒,然后再循环。

注意

根据您正在使用的按钮中联系人的"质量",您可能需要向中断处理程序添加去抖动逻辑。"弹跳"是开关触点(或任何其他机械触点)的一种现象,在改变状态时,这种现象会导致触点快速打开/闭合多次。这是由于电信号桥接了间隙,因为触点彼此非常靠近(想想静电跳过间隙)。很多时候,这是由电容器在硬件端处理的,但我不确定Netduino是如何处理的。