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);
}

недействительный цикл () {

}

LED выключен

Красный светодиод горит, когда оба записанных значения совпадают, например


#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 не работает.

, 👍4

Обсуждение

Оба светодиода имеют подходящие токоограничивающие резисторы?, @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


1 ответ


Лучший ответ:

5

Поскольку вы используете 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