Не работает аналоговый опорный контакт (AREF) на Arduino MKR1000?

analogreference

Кто-нибудь успешно использовал вывод AREF на MKR1000?

Я пытаюсь использовать ВНЕШНИЙ источник опорного напряжения (мне нужно 1,5 В вместо 5 В по умолчанию) с помощью:

analogReference(EXTERNAL)

Но при компиляции я получаю следующее сообщение об ошибке:

MKR_001:161: ошибка: неверное преобразование из «int» в «eAnalogReference {aka _eAnalogReference}» [-fpermissive]

В документации (для analogReference) я нашел следующее:

DEFAULT: аналоговое опорное напряжение по умолчанию 5 вольт (на 5-вольтовых платах Arduino) или 3,3 вольта (на 3,3-вольтовых платах Arduino)
ВНУТРЕННИЙ: встроенный опорный источник, равный 1,1 вольта на ATmega168 или ATmega328 и 2,56 вольта на ATmega8 (недоступно на Arduino Mega)
INTERNAL1V1: встроенный источник опорного напряжения 1,1 В (только Arduino Mega)
INTERNAL2V56: встроенный источник опорного напряжения 2,56 В (только Arduino Mega)
ВНЕШНЕЕ: напряжение, подаваемое на вывод AREF (только от 0 до 5 В), используется в качестве опорного.

Спасибо, Коррадо

, 👍-1

Обсуждение

Что не работает? Что вы пробовали и в чём заключалась неудача?, @sa_leinad

Пожалуйста, отредактируйте свой вопрос, используя эту информацию и любую другую, которая у вас есть. Также постарайтесь сформулировать свой вопрос более конкретно., @sa_leinad

Проголосовал за повторное открытие, вы отредактировали вопрос, и я думаю, что теперь это очень хороший вопрос., @Paul


2 ответа


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

1

Ошибка компилятора

MKR_001:161: error: invalid conversion from 'int' to 'eAnalogReference {aka _eAnalogReference}' [-fpermissive] 

На самом деле все очень просто, как только вы поймете, что это значит.

analogReference(EXTERNAL);

Функция analogReference принимает целое число в качестве параметра, но вы передаете ему EXTERNAL, что является перечислением. Вероятно, это перечисление, которое использует целые числа для своих значений, но для компилятора есть разница.

Если вы хотите отключить предупреждение, то можете использовать флаг -fpermissive в командной строке компиляции, это не очень хорошая идея, поскольку это делает недействительной "типобезопасность" языка для всей программы. Вместо этого лучше решать их в каждом конкретном случае и просто приводить EXTERNAL к int.

analogReference((int)EXTERNAL);
,

Интересно, это своего рода ошибка функции 'analogReference()', ожидающей int (может быть гораздо больше, чем просто одно из значений перечисления)?, @Paul

Это не баг, это фича :) Думаю, это связано с ужесточением неявного преобразования типов в компиляторе gcc. Я сразу это понял, потому что часто вижу, как это работает, перетаскивая устаревший код в новое столетие. Кто-то мог бы списать это на ошибку и исправить, но это не будет приоритетом., @Code Gorilla

Ну да, если вы будете держать ссылку слишком долго, люди начнут использовать целые числа для выбора ссылки. И тогда исправление может снова сломать код этих людей. Но ваш ответ очень хороший., @Paul


1

На самом деле, документация предполагает, что для плат SAMD (MKR1000 основан на Zero) следует использовать другое перечисление, где каждое значение имеет префикс AR_, например, следует использовать analogReference(AR_EXTERNAL);.

,