是什么导致我的微控制器 LED 程序停止工作?

电器工程 引领 核子
2022-01-05 17:45:11

所以,我是一个完整的编程新手。我在 Arduinos 上做了一些基本的事情(字面意思是切换 LED 并在 LCD 上显示一些东西),我正在尝试自学如何用 C 编程。我是一名硬件工程师,但我不能做任何固件/软件方面的工作,没有晚上的课程可以教它,我想进一步选择我的职业。我正在努力理解其中一些命令是如何组合在一起的,并且遇到了一个我无法理解为什么它不起作用的问题。

所以,我有一个输入和一个输出。我的输出是切换打开 LED 的 FET 的栅极。输入来自与门。所以,我的 LED 一直亮着,当我从 AND 门(满足 2 个条件)获得输入信号时,我希望输出(LED 切换)变为低电平(关闭 LED。因为输出也连接到AND 输入之一,这也会将输入信号变为低电平。

我想要做什么:我只想将输入读取为“满足条件”并关闭 LED。然后它应该关闭 1 秒钟,然后重新打开。如果输入再次变为高电平,则重复该过程。我正在使用一个简单的按钮将开关作为另一个与门输入,并测量到按下按钮时输出(MCU 输入)变为高电平,但 LED 切换(输出)不会关闭。我的代码(我认为)非常简单,但显然我无法正确理解某些内容,因为它无法正常工作。

所以这是我正在使用的代码:

#include "mbed.h"

DigitalIn ip(D7);
DigitalOut op(D8);

int main() {
    if (ip == 1){
        op = 0;
        wait (1.0);
        op = 1;
    }else{
        op = 1;
    }
}

对我来说,这似乎是合乎逻辑的。在通常状态下,输出为 HIGH。如果输入从与门得到信号,LED 将关闭 1 秒钟,然后再次打开。

我做错了什么,因为这看起来是合乎逻辑的做法,我只是不明白为什么这不起作用?

如果有帮助,我正在使用 Nucleo F103RB。当我使用“闪烁”代码并像这样打开和关闭 LED 时,它工作正常,只是当我添加“if”语句时它出错了。

这是简化的电路:

示意图

模拟此电路- 使用CircuitLab创建的原理图

PS 我知道我没有在原理图中添加它们,但是与门在输入和输出上确实有下拉电阻。

3个回答

我原以为您需要围绕代码进行循环-

while(1)
{

    if (ip == 1){
       op = 0;
       wait (1.0);
       op = 1;}
    else {
       op = 1;}
}

在您有机会按下按钮之前,您的代码将完成并退出。您需要一段时间来保持 if 语句重复运行。

#include "mbed.h"

DigitalIn ip(D7);
DigitalOut op(D8);

int main() {
    if (ip == 1){
        op = 0;
        wait (1.0);
        op = 1;
    }else{
        op = 1;
    }
    // and now the program ends? What to do?
}

处理器按顺序执行指令main()它以从 和 的 mbed 库初始化代码中DigitalIn跳转 开始DigitalOut
然后执行比较ip == 0,在 中运行指令{}然后main()结束......没有更多指令......它有什么作用?

由于在空的闪存中发现非法操作数,它可能会重置。或者它可能会挂在故障处理程序中并像 mbeds 那样闪烁 SOS。这取决于它是如何实现的,并且现在可能会超出您的范围。
但如果您好奇,您可以研究 ARM 故障处理,或找出main()实际调用的位置。

现在,如何解决这个问题?

int main() {
    // Add a while(1) infinite loop
    while(1){
        if (ip == 1){
            op = 0;
            wait (1.0);
            op = 1;
        }else{
            op = 1;
        }
    }
    // Program never gets here
}

正如其他人正确提到的那样,循环将允许您的代码重复运行。但是,有一种内置方法可以为 Arduino 执行此操作,而无需while循环。这是由loop函数完成的 - 它对您的问题的适用性取决于您是否使用 Arduino IDE。

它应该看起来像这样:

#include "mbed.h"

DigitalIn ip(D7);
DigitalOut op(D8);

void setup() {
    // any code before loop is run
}

void loop() {
    if (ip == 1){
        op = 0;
        wait (1.0);
        op = 1;
    }else{
        op = 1;
    }
}

您的主要功能现在已隐藏,仅在编译时添加到您的程序中。这是一个很好的讨论:http: //forum.arduino.cc/index.php?topic=379368.0