Я пытаюсь прочитать ввод с 5-го пина ПОРТА B?
В двух словах я хочу прочитать 5-й контакт PORTB без использования digitalRead API (я пытаюсь изучить baremetal с помощью arduino-uno-r3)
Просто чтобы узнать, как работает внутренний регистр, я не использовал API digitalRead, вместо этого я использовал регистр DDRB, чтобы установить 5-битный DDRB как низкий, указывающий, что 5-й контакт PORTB находится в режиме ввода, тогда я использую оператор if, чтобы проверить, если 5-й бит PINB высокий или низкий, я ожидал, что когда я подключу arduino pin 13 к 5v, если статус станет TRUE.
void setup() {
// поместите сюда код установки для однократного запуска:
DDRB = DDRB & ~(1<<5);
Serial.begin(9600);
}
void loop() {
// поместите сюда ваш основной код для многократного запуска:
if(PINB & (1<<5)){
Serial.println("Got data");
}
}
Когда я выполняю приведенный выше код, я постоянно получаю, если это TRUE
@user143252, 👍2
Обсуждение1 ответ
Лучший ответ:
Кажется, в вашем вопросе несколько отдельных вопросов.
Одним из них является простой вопрос языка. В английском языке «1st» — это аббревиатура. для «первого», которое является порядковым прилагательным, применяемым к элементу в списке это означает, что перед ним в этом списке нет другого элемента. В то же самое вене, «5th» означает «пятый», что относится к пункту, который имеет точно четыре пункта перед ним. Например, список выводов порта B: {PB0, ПБ1, ПБ2, ПБ3, ПБ4, ПБ5}. PB0 — первый в списке, а PB4 — первый. пятый. Тот факт, что первый элемент имеет номер 0, сбивает с толку. Таким образом, я рекомендую вообще избегать порядковых прилагательных и вместо этого называя контакты их именами, например «цифровые 13» (именование Arduino) или «PB5» (название AVR).
Второй вопрос, и, возможно, вас больше всего беспокоит плавающий
входной пин. Вы не можете ожидать надежных показаний от плавающего входа. я
не буду пытаться объяснить почему, так как вопрос обсуждался до отвращения
здесь и в других местах. Просто выполните поиск в Интернете. Самое простое решение -
используйте встроенный подтягивающий резистор и внешнее подключение кнопки
между штифтом и землей. Вы будете читать LOW
всякий раз, когда кнопка
нажал:
void setup() {
pinMode(13, INPUT_PULLUP);
Serial.begin(9600);
}
void loop() {
if (digitalRead(13) == HIGH)
Serial.println("HIGH");
else
Serial.println("LOW");
}
Последний пункт касается перехода к «голому железу» и изучения способов использования ввода-вывода. регистрируется напрямую. Сначала небольшое предупреждение: вы должны иметь в виду, что это зависит от платы. Вы отметили свой вопрос обоими словами «arduino-uno». и «ардуино-мега», но у этих плат разные распиновки (цифровой 13 - это PB7 на Mega). Общий способ использования DDRx, Регистры PORTx и PINx одинаковы для всех микросхем AVR, но не переносим на Arduino на основе другой архитектуры.
Давайте предположим, что это предназначено для работы только с Uno, Nano или другая плата на базе ATmega328P. Судя по приведенному вами примеру кода, вы, кажется, уже довольно хорошо понимают, как работают эти регистры. Здесь нет проблема в вашем коде, помимо того, что он требует внешнего остановить. Если вы хотите включить внутреннюю подтяжку, вы должны установить соответствующий бит в PORTB. Это может показаться запутанным, так как один и тот же регистр используется для управления подтягиванием (когда вывод находится в режиме ввода) и для управление выходом (когда контакт является выходом). По сути, каждый контакт GPIO имеет четыре различных электрических состояния, которые контролируются битами ввода/вывода:
│ DDRxn │ PORTxn │ state │
├───────┼────────┼──────────────┤
│ 0 │ 0 │ INPUT │
│ 0 │ 1 │ INPUT_PULLUP │
│ 1 │ 0 │ OUTPUT LOW │
│ 1 │ 1 │ OUTPUT HIGH │
└───────┴────────┴──────────────┘
Приведенный выше пример программы можно перевести в низкоуровневый стиль AVR следующим образом: следует:
void setup() {
DDRB &= ~_BV(PB5); // режим ввода
PORTB |= _BV(PB5); // включить подтягивание
Serial.begin(9600);
}
void loop() {
if (PINB & _BV(PB5))
Serial.println("HIGH");
else
Serial.println("LOW");
}
Красиво сказано @edgar. Я мог бы добавить комментарий (поскольку ОП сказал, что он / она хочет программировать на «голом железе»), что разные платы Arduino могут содержать разные процессоры. И то, что здесь работает в этом ответе, предназначено для конкретного процессора. И что другие процессоры могут и чаще всего работают совсем по-другому., @st2000
@st2000: Хороший вопрос. Отредактировал ответ., @Edgar Bonet
- avrdude ser_open() can't set com-state
- Float печатается только 2 десятичных знака после запятой
- ошибка: espcomm_upload_mem failed при загрузке скетча
- Печать массива байтов на экране последовательного монитора Arduino IDE
- Разные и самые быстрые способы вычисления синусов и косинусов в Arduino
- Arduino IDE Отказано В Разрешении На Загрузку, Ubuntu
- Нет заголовочных файлов (.h) в Documents\Arduino\libraries\arduino_144469 с демонстрационным кодом
- Связь Arduino master/slave с использованием RS485
Вы используете внешний подтягивающий или подтягивающий резистор?, @chrisl
ваш код работает с 6-м битом... биты пронумерованы от 0 до 7, поэтому 5-й бит - это бит 4, @jsotola
Я не использовал подтягивающий резистор, и я уверен, что 5-й бит PINB - это 13-й контакт aurdino., @user143252
Нет, цифра 13 — это PB5, т.е. 6-й бит. 1-й бит — PB0, 2-й бит — PB1 и т. д., @Edgar Bonet
Если к контакту ничего не подключено, то он может считывать либо высокий, либо низкий уровень. Google «плавающий контакт». Если вы ожидаете, что он будет низким, когда он ни к чему не подключен, то вы ошибаетесь., @Delta_G
@EdgarBonet, так что же мне изменить в коде?, @user143252
@Delta_G, тогда в чем смысл низкого и высокого уровня, если контакт всегда (плавающий) высокий, @user143252
http://www.electronoobs.com/images/Arduino/tut_31/arduino_uno_scheamtic.png PB5 ЯВЛЯЕТСЯ 13-М КОНТАКТОМ НА ARDUINO, я думаю, что я прав, @user143252
Это не 13-й пин, это пин «цифровой 13». Не то же самое., @Edgar Bonet
Дело в том, что если контакт привязан к напряжению, он будет считывать это напряжение. Если он не подключен, то какое напряжение на контакте? Если вы ответите ноль, вам нужно пойти и изучить основы электроники еще немного. На контакте должен быть НИЗКИЙ уровень, когда он подключен к земле, и ВЫСОКИЙ уровень, когда он подключен к 5 В. Если он не подключен, вы не знаете, каков уровень напряжения на контакте. Он может уловить любой посторонний шум и прочитать что угодно., @Delta_G
Суть в том, что «не пытайтесь прочитать пин, который ни к чему не подключен»., @Delta_G