MEGA 2560: Простая программа - Один аналог записи выключает другой
Я использую Windows 10, Arduino 1.8.12 (Windows Store 1.8.33.0)
У меня есть Arduino MEGA 2560 и красный светодиод, подключенный к контакту 4.
#define RED 4
#define GREEN 2
void setup() {
analogWrite(GREEN, 0);
analogWrite(RED, 100);
}
void loop() {
}
Этот код включает красный светодиод.
Однако, когда я пишу 1 на ЗЕЛЕНЫЙ контакт analogWrite(GREEN, 1)
, красный светодиод гаснет. Я ожидаю, что красный светодиод останется включенным.
#define КРАСНЫЙ 4 #define ЗЕЛЕНЫЙ 2 недействительная установка () { аналогЗапись (ЗЕЛЕНЫЙ, 1); аналогЗапись(КРАСНЫЙ, 100); } недействительный цикл () { }
Красный светодиод горит, когда оба записанных значения совпадают, например
#define RED 4
#define GREEN 2
void setup() {
analogWrite(GREEN, 1);
analogWrite(RED, 100);
}
void loop() {
}
Я также обнаружил, что добавление некоторого "мусорного" кода в начале решает проблему. Мне не удалось преобразовать мусор в более простую форму без отключения обоих контактов.
#define КРАСНЫЙ 4 #define ЗЕЛЕНЫЙ 2 недействительная установка () { // МУСОР НАЧАЛО === беззнаковый длинный т = millis(); const беззнаковый длинный период = 10; float progress = float(t% период)/период; float г = прогресс * 0; // МУСОР КОНЕЦ === аналогЗапись (ЗЕЛЕНЫЙ, 100 + r); аналогЗапись(КРАСНЫЙ, 50 + r); } недействительный цикл () { }
Обновление: Спасибо всем за ваши комментарии. Установка pinMode для вывода не устранила проблему. Однако изменение объявления функции на __attribute__((optimize("-O0"))) void setup() {
устранило проблему. -O1
также работает, но -O2
не работает.
@Mark, 👍4
Обсуждение1 ответ
Лучший ответ:
Поскольку вы используете ArduinoIDE >=1.8.10, это проблема "оптимизации" компилятором для Mega, попробуйте заменить строку
void setup()
с
void setup() __attribute__((optimize("-O0")));
// также -O1 работает по умолчанию -Os и -O3, -O4 нет
На самом деле проблема не в версии IDE, а в включенной версии пакета плат AVR.
Вы можете установить любой пакет плат AVR в любой среде IDE с помощью диспетчера плат. Последний хороший пакет плат AVR — 1.6.21. Если ваш компилятор (цепочка инструментов) показывает 7.03 в окне вывода, вы затронуты. У меня есть примеры, когда компилятор даже оптимизирует цикл, что заканчивается забавными результатами - я не знаю, влияет ли это на другие платы, но MEGA точно.
Есть ли проблема с отчетом об ошибке, открытая с Arduino для этого? Это обязательно нужно исправить!, @Gabriel Staples
Да, более одного последнего https://github.com/arduino/Arduino/issues/9659, @Codebreaker007
Этот тоже выглядит актуальным https://github.com/arduino/Arduino/issues/9653, @Mark
- Кнопка двойного состояния Nextion
- Arduino Uno: avrdude: stk500_recv(): программатор не отвечает
- Запуск двух шаговых двигателей с двумя поворотными энкодерами
- Мой код Arduino компилируется, когда я не вижу в нем ничего плохого
- Как управлять 6 серводвигателями с помощью платы Arduino Mega?
- Программирование пользовательских Arduino Mega с Arduino Uno
- Перепрограммировать Atmega 16u2 на Arduino Mega с помощью Arduino IDE?
- Arduino 1.6.4 не показывает никаких /tty/ опций в последовательных портах
Оба светодиода имеют подходящие токоограничивающие резисторы?, @Edgar Bonet
На самом деле подключен только один светодиод, и он подключен через резистор на 220 Ом., @Mark
Пожалуйста, покажите вашу принципиальную схему., @Edgar Bonet
Чего ждать? Подключен только один светодиод, но когда вы включаете один из ваших светодиодов, другой выключается? Это бессмысленно., @Duncan C
@DuncanC дело не в том, что я включаю другой светодиод, а в том, что я аналогово записываю на дополнительный контакт, и он выключает контакт светодиода., @Mark
оба контакта показывают одинаковое поведение?, @jsotola
@jstola Да, кажется, что одновременная запись отключит их обоих., @Mark
похоже на ошибку в библиотеке... в arduino IDE выбрана правильная плата? ... остается ли поведение, если вы вставляете командную строку между ними ... что-то такое простое, как
a++;
, @jsotolaПопробуйте перед записью pinMode(GREEN, OUTPUT); pinMode(КРАСНЫЙ, ВЫХОД); и дайте отзыв, если это сработало, @Codebreaker007
@ Codebreaker007 Я начал публиковать сообщения о том, что в OP отсутствуют вызовы, устанавливающие выводы на выходы, но если вы посмотрите документы на
analogWrite()
, в них конкретно говорится, что вам не нужно устанавливать вывод для вывода перед его использованием. , что меня удивило. Хотя попробовать, наверное, все же стоит., @Duncan CВы должны опубликовать ответ на свой вопрос. с решением, которое вы нашли. Я бы предложил попробовать вызовы
pinMode(GREEN, OUTPUT); pinMode(RED, OUTPUT)
, как предлагает Codebreaker, а также добавление небольшой задержки в вашу настройку вместо опубликованного вами «мусорного кода»., @Duncan CЕсли вы используете ArfuinoIDE < 1.6, вы должны определить режим вывода, так как это делается в AnalogWrite.c. Если вы используете IDE >= 1.8.10, это проблема оптимизации компилятором для Mega, попробуйте заменить строку void setup() на void setup() __attribute__((оптимизировать("-O0"))); // также -O1 работает по умолчанию -Os и -O3, -O4 нет, @Codebreaker007
Если вы посмотрите исходный код для AnalogWrite, первое, что он делает, это устанавливает pinMode., @Delta_G
Да, начиная с версии 1.6, как я уже писал, поскольку мы не знаем версию OP, мы должны исключить основные вещи, не все всегда используют последнюю версию., @Codebreaker007
@ Codebreaker007 Установка уровня оптимизации на 0 или 1 устраняет проблему (см. Мое обновление в моем посте). Мне интересно, можете ли вы направить меня к объяснению, почему это происходит., @Mark
Однако, не могли бы вы ответить на свой вопрос и отметить его (позже, если вам придется ждать), пожалуйста? Это поможет другим исследователям той же проблемы, потому что они заранее увидят, что ваша проблема решена., @the busybee