Итак, я ПОЛНЫЙ и полный новичок в программировании. Я сделал некоторые базовые вещи для Arduinos (буквально переключая светодиоды и отображая что-то на LCD), и я пытаюсь самостоятельно научиться программировать на C. Я по профессии аппаратный инженер, но меня беспокоит, что я не могу Если у вас есть какие-либо вопросы в отношении прошивки / программного обеспечения, то вечерних курсов для этого нет, и я бы хотел расширить свои карьерные возможности. Я изо всех сил пытаюсь понять, как некоторые из этих команд идут вместе и столкнулись с проблемой, которую я просто не могу понять, почему она не работает.
Итак, у меня есть вход и выход. Мой вывод переключает ворота FET, который включает светодиод. Вход поступает из логического элемента И Итак, мой светодиод всегда включен, и когда я получаю входной сигнал от логического элемента И (2 условия были выполнены), я хочу, чтобы выход (переключение светодиода) стал НИЗКИМ (выключить светодиод. Поскольку выход также подключен к один из входов AND, это также повернет входной сигнал НИЗКИМ.
Что я хочу сделать: я просто хочу прочитать входные данные как «условия выполнены» и выключить светодиод. Затем он должен быть выключен на 1 секунду и снова включен. Если вход снова становится ВЫСОКИМ, процесс повторяется. Я использую простое нажатие для переключения в качестве другого входа логического элемента И и измерил, что выход (вход MCU) становится высоким при нажатии кнопки, но переключение (выход) светодиода не выключается. Мой код (я думаю) чертовски прост, но, очевидно, я что-то не правильно понимаю, потому что он просто не работает.
Вот код, который я использую:
#include "mbed.h"
DigitalIn ip(D7);
DigitalOut op(D8);
int main() {
if (ip == 1){
op = 0;
wait (1.0);
op = 1;
}else{
op = 1;
}
}
И мне это кажется логичным. В обычном состоянии выход ВЫСОКИЙ. Если на вход поступает сигнал от логического элемента И, светодиод выключится на 1 секунду, а затем снова включится.
Что я сделал не так, потому что это выглядит логичным способом сделать это, и я просто не могу понять, почему это не работает?
Если это поможет, я использую Nucleo F103RB. Когда я использую «мигающий» код и просто так включаю и выключаю светодиод, он работает нормально, только когда я добавляю «если», он идет не так.
Это упрощенная схема:
смоделировать эту схему - схема, созданная с использованием CircuitLab
PS Я знаю, что я не добавил их в схему, но у вентилей AND есть резисторы понижающего напряжения на входах и выходах.
DigitalIn
уже включаетvolatile
.Ответы:
Я бы подумал, что вам понадобится цикл вокруг вашего кода -
Прежде чем вы сможете нажать кнопку, ваш код будет завершен и завершен. Вам нужно время, чтобы оператор if работал повторно.
источник
loop()
, но среда Arduino добавляет код, который примерно ведет себя какint main() { setup(); while(1) { loop(); } }
.Процессор выполняет инструкции последовательно . Он начинается с перехода
main()
изнутри кода инициализации библиотеки mbedDigitalIn
иDigitalOut
.Затем выполняет сравнение
ip == 0
, запускает инструкцию внутри{}
и затемmain()
завершает ... больше никаких инструкций ... Что это делает?Он может быть сброшен из-за обнаружения недопустимых операндов в пустой флэш-памяти. Или он может зависнуть в обработчике ошибок и мигать SOS, как это делает mbeds. Это зависит от того, как это реализовано, и, вероятно, выйдет за вас прямо сейчас.
Но если вам интересно, вы можете изучить ARM Fault Handling или узнать, откуда
main()
на самом деле вызывается.Теперь, как это исправить?
источник
while(1 == 1)
этого, а не простоwhile(1)
. Последнее является идиоматическим C, но первое более очевидно для человека, поскольку «всегда будет оценивать как истинное». Любой достойный компилятор должен создавать одинаковый двоичный код для обоих вариантов.Как правильно упоминали другие, цикл позволит вашему коду запускаться повторно. Тем не менее, есть встроенный способ сделать это для Arduino без необходимости
while
цикла. Это делаетсяloop
функцией - ее применимость к вашей проблеме зависит от того, используете ли вы Arduino IDE.Это должно выглядеть примерно так:
Ваша основная функция теперь скрыта и добавляется в вашу программу только после компиляции. Вот хорошее обсуждение этого: http://forum.arduino.cc/index.php?topic=379368.0
источник
loop()
аsetup()
функции и от Arduino не используются в большинстве систем. Для справки, Ардуино просто определяет что-main()
то вроде этого:void setup(); void loop(); int main() { setup(); while (true) loop(); }
Если вы знакомы со сборкой, это может быть немного больше и в вашей зоне комфорта:
int main () {
}
источник
goto
** настоятельно ** предполагает "магию, происходящую здесь", возможно, за исключениемgoto cleanup;
. В приведенном здесь примере читателю останется загадочный вопрос «что такого особенного, что выwhile(1) { }
здесь не использовали ???».