Как настроить ADC7 на Arduino Pro Mini в качестве цифрового выхода?

Я пытаюсь использовать контакт с надписью «ADC7» из пакета Atmega328p TQFP. Документация Atmega предполагает, что ее можно использовать как аналоговую или цифровую точку ввода/вывода. Я пытаюсь настроить его как цифровой выход.

Ссылаясь на документацию (и, в частности, на arduino_pins.h), я определил, что связанный номер контакта равен 21. Поэтому я вызвал pinMode(21, OUTPUT). Однако этот контакт, похоже, не работает с моим устройством SPI. Ранее я проверял, работает ли устройство, но в последнюю секунду изменил выход и теперь использую ADC7.

Итак, мой вопрос: требуется ли дополнительный шаг для настройки этого контакта в качестве цифрового выхода? Я заметил, что этого вывода нет на DIP Atmega328p (используется на Arduino Uno), поэтому я не уверен, нужно ли мне где-то добавлять еще одну строку кода.

Есть идеи?

С уважением,

, 👍1

Обсуждение

@EdgarBonet PORTC7 не существует в таблице данных. PORTC6 работает, но он подключен к контакту сброса, а не к ADC6., @Gerben

@Gerben: К сожалению, вы правы, я неправильно экстраполировал. Я удалю свой вводящий в заблуждение комментарий., @Edgar Bonet


5 ответов


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

2

Это только аналоговые контакты. Их нельзя использовать в качестве выходов или цифровых входов.

,

Я тогда несколько запутался. Значит, в даташите ошибка? В нем говорится, что его можно использовать как аналоговую или цифровую точку ввода-вывода в выводе. http://www.atmel.com/Images/Atmel-42735-8-bit-AVR-Microcontroller-ATmega328-328P_Summary.pdf, @Izzo

Любой аналоговый вывод на Arduino можно использовать как цифровой, и я делал это много раз. И техническое описание AVR также прямо говорит об этом. Единственная проблема с библиотеками/подходом Ardunino заключается в том, что они не объявляют константы, называемые цифровыми выводами для выводов, которые также могут быть аналоговыми (вероятно, чтобы «не путать пользователей с выбором»). for (int i=0;i<20;i++){pinMode(i, OUTPUT);digitalWrite(i,HIGH);delay(30);digitalWrite(i,LOW);}; работает просто отлично, как и ожидалось (если вы добавите светодиоды + резисторы ко всем «цифровым» и «аналоговым» контактам на Arduino). 1-13 "цифровые", 14-19 "аналоговые"., @gilhad

@gilhad, вы специально тестировали A6 и A7, о которых идет речь? Обратите внимание, что Arduino №19 — это A5, а не A6 или A7. Не понижайте ответ Гербена по неосновательным причинам., @James Waldby - jwpat7

@gilhad ADC6 и ADC7 - это только аналоговые контакты. Другие аналоговые выводы также имеют общие с цифровыми функциями — ADC6 и ADC7 **не**. Вы можете видеть это в таблице 6-1 [таблицы данных] (http://www.atmel.com/Images/Atmel-42735-8-bit-AVR-Microcontroller-ATmega328-328P_Datasheet.pdf) - они также доступно только на TQFP-32, который использует Pro Mini., @Majenko

@jwpat7: Плохо, я ошибался. Я перепутал их с A4+A5 (как показывает мой пример) и быстро сверил с таблицей рис. 5-3, на рис. 5-4 они показаны как цифровые/аналоговые (также имеется 28.9.8 Регистр отключения цифровых входов, который позволяет отключить на них буфер цифровых входов для экономии энергии и Таблица 32-2 Характеристика постоянного тока, которая добавляет их для подсчета максимальных сумм источника/приемника). Но я тестировал на MiniPro, и они НЕ являются выходами. Также Arduinos digitalRead() не работает с ними, независимо от того, выбран там режим INPUT или INPUT_PULLUP., @gilhad


2

Ответ Гербена, вероятно, правильный, но в таблицах данных Atmel для различных моделей ATmega168 и ATmega328 есть некоторые интересные несоответствия, как показано ниже.

В некоторых спецификациях Atmel ADC6 и ADC7 упоминаются как PE2 и PE3, в то время как в других они упоминаются просто как ADC6 и ADC7.

Относительно порта E в спецификациях ATmega168PA и ATmega168 2014 года и 2015 года ничего не сказано, ничего не указано от PE0 до PE3 и не указано принадлежность порта для ADC6 и ADC7. Они показывают контакты 3 и 6 на LQFP как Gnd и Vcc, а PE0 и PE1, как на листе ATmega168PB.

Что касается порта E, в техническом описании ATmega168PB 2015 г. говорится:

Table 15-12.  Port E Pins Alternate Functions
     Port Pin       Alternate Function
       PE3          ADC7 (ADC Input Channel 7)
       PE2          ADC6 (ADC Input Channel 6)
       PE1          NONE
       PE0          ACO (AC Output Channel 0)

Что касается порта E, в техническом описании ATmega168PB за 2016 г., Atmel-42176G-ATmega48PB/88PB/168PB_Datasheet_Complete-03/2016, говорится следующее. а также перечисляет несколько альтернативных функций, ссылаясь на Таймер/Счетчики 3 и 4 (хотя в сводка регистров, относящаяся к такому таймеру/счетчику):

"Порт E — это 4-битный двунаправленный порт ввода-вывода с внутренней резисторы (подбираются для каждого разряда). Выходные буферы порта E имеют симметричные характеристики привода с высоким уровнем стока и истока способность. В качестве входов контакты порта E, на которые подается низкий уровень извне, будут ток источника, если включены подтягивающие резисторы. Контакты порта E переходят в три состояния, когда условие сброса становится активным, даже если часы не идут."

Table 19-12.  Port E Pins Alternate Functions
 Port Pin            Alternate Function
 PE3                 ADC7 (ADC Input Channel 7)
                     T3 (Timer/Counter 3 External Counter Input) & PCINT27
 PE2                 ADC6 (ADC Input Channel 6)
                     ICP3 (Timer/Counter3 Input Capture Input)
                     SS1 (SPI1 Bus Master Slave select) & PCINT26
 PE1                 T4 (Timer/Counter 4 External Counter Input)
                     SCL1 (2-wire Serial1 Bus Clock Line) & PCINT25
 PE0                 ACO (AC Output Channel 0)
                     ICP4 (Timer/Counter4 Input Capture Input)
                     SDA1 (2-wire Serial1 Bus Data Input/Output Line) & PCINT24
,

Интересно. Возможно, преемник, а именно ATMega328PB, может пролить больше света., @Gerben

Это интересно, но следует отметить, что у ATmega328PB значительно больше периферии, чем у 328P. Теперь @Teague может попробовать что-то вроде *(volatile uint8_t *)0x2d = 0x0c; с внешними подтягиваниями на ADC6 и ADC7. Если эти контакты станут низкими, это обнаружит недокументированный порт E. Но имейте в виду, что Atmel советует не совать неназначенные адреса ввода-вывода., @Edgar Bonet


2

Согласно всему, что можно найти в техническом описании что касается ADC6 и ADC7, это только аналоговые выводы.

Распиновка TQFP-32, используемая в Pro Mini, показывает, что эти два контакта имеют только аналоговые функции:

Я подозреваю, что цветовая кодировка контактов может быть неправильной — они должны быть сплошного зеленого цвета. У них нет названий портов на выводах, только обозначение ADCx.

На блок-схеме микросхемы показано, что контакты ADC6/7 отделены от порта:

Как видите, остальные 6 контактов обозначаются общим цифровым портом, но ADC6 и 7 известны просто как ADC6 и ADC7.

В таблице функций выводов 6-1 показаны ADC6 и ADC7 как единственные функции этих выводов. Никаких имен цифровых портов, ничего — только аналоговый ввод.

Итак, для микросхемы ATMega328P, используемой в Arduino Pro Mini, вы вообще не можете использовать эти два контакта для цифрового ввода, только для аналогового ввода.

,

Ффффффф. Хорошо, лучше напечатайте новые платы. Спасибо за ответ., @Izzo


3

Возможно, это небольшое поле, но я использую входы ADC6 и ADC7 для обнаружения переключателей. Я просто не использую функцию digitalRead(), а вместо этого использую функцию AnalogRead(). Используя сеть резисторов и переключатели, а также некоторый программный код декодера в нашем скетче, мы можем использовать один входной контакт для взаимодействия со многими другими переключателями. Переключатели могут быть включены только по одному, но во многих случаях это нормально.

,

2

Я понимаю, что это старый вопрос, но эти контакты немного отличаются на ATMEGA328PB по сравнению с ATMEGA328P, который я обнаружил недавно. См. примечание к приложению Microchip AT15007, стр. 3.

Примечание к приложению Microchip AT15007< /p>

,