Port mapping
Библиотеки Arduino упрощают доступ к оборудованию процессора, предоставляя высокоуровневые функции, такие как pinMode
, digitalRead
и digitalWrite
(среди прочих) .
Несмотря на то, что они просты в использовании, простота обычно приводит к потере скорости. Программисты, которые хотят получить быстрый доступ к оборудованию, будут использовать «прямой доступ к порту». Например (для Atmega328P, такой как используется на Arduino Uno):
Режим закрепления
Вместо:
pinMode (3, OUTPUT);
Выполнить:
DDRD |= bit (3); // Порт D, бит 3 в режим вывода
Вместо:
pinMode (13, INPUT);
Выполнить:
DDRB &= ~bit (5); // Порт B, бит 5 в режим ввода
Вместо:
pinMode (8, INPUT_PULLUP);
Выполнить:
DDRB &= ~bit (0); // Порт B, бит 0 для режима ввода
PORTB |= bit (0); // Сделать порт B, бит 0 ВЫСОКИМ, чтобы включить подтягивающий резистор
цифровая запись
Вместо:
digitalWrite (7, HIGH);
Выполнить:
PORTD |= bit (7); // Делаем порт D, бит 7, ВЫСОКИМ
Вместо:
digitalWrite (6, LOW);
Выполнить:
PORTD &= ~bit (6); // Делаем порт D, бит 6, НИЗКИМ
цифровое чтение
Вместо:
byte foo = digitalRead (5);
Выполнить:
byte foo = (PIND & bit (5)) ? HIGH : LOW;
Предупреждение
Буквы портов (например, PINB, PINC, PIND) и номера битов (например, бит (1), бит (2) и т. д.) зависят от каждого процессора.
Для простоты использования библиотечные функции позволяют точно определить, какие именно порты и номера битов использовать.
Время
pinMode (2, OUTPUT);
: 4,5625 мкс (73 такта)DDRD |= бит (3);
: 250 нс (4 такта)
pinMode (13, INPUT);
: 4,9375 мкс (79 тактов)DDRD &= ~bit (5);
: 250 нс (4 такта)
pinMode (8, INPUT_PULLUP);
: 5 мкс (80 тактов)DDRB &= ~bit (0); PORTB |= бит (0);
: 375 нс (6 тактов)
digitalWrite (7, HIGH);
: 3,9375 мкс (63 такта)PINB |= бит (4);
: 250 нс (4 такта)
digitalWrite (6, LOW);
: 4,875 мкс (78 тактов)PINB &= ~bit (6);
: 250 нс (4 такта)
digitalRead (5);
: 4,625 мкс (74 такта)(PIND и бит (5)) ? ВЫСОКИЙ : НИЗКИЙ;
: 125 нс (2 тактовых цикла)
библиотека digitalWriteFast
Вы можете получить удобство простых в использовании вызовов функций и скорость сопоставления портов с помощью библиотеки digitalWriteFast. При условии, что ваши номера выводов являются константами (то есть не переменными, которые могут изменяться во время выполнения), digitalWriteFast автоматически заменит соответствующий ввод-вывод с сопоставлением портов, где это необходимо. Например:
#include <digitalWriteFast.h>
void foo ()
{
digitalWriteFast (7, HIGH);
byte bar = digitalReadFast (3);
}
В этом примере digitalWriteFast
и digitalReadFast
работают так же быстро, как и доступ с сопоставлением портов.
- digitalWriteFast на GitHub
- digitalWriteFast в Google Code
Вопросы, связанные с [port mapping]:
- Arduino IDE говорит, что не подключен, даже после того, как я его подключил Когда я использовал экран двигателя L293D на своем UNO, отрицательный провод моего общего напряжения 7,4 В был подключен к экрану двигателя. Но по ошибке в UNO подключился плюсовой провод и…
- Миграция проекта Arduino Uno R3 в Wemos D1 R2 — проблемы с распиновкой Поэтому я решил приобрести плату Wemos D1 R2, чтобы мои старые проекты Arduino Uno R3 могли получить некоторые новые функции IoT. Однако, даже если мой код отлично работает в Uno, я хочу…
- Таблица подключения контактов между моими ESP32 и ILI9586 Я хотел бы узнать, где я могу узнать больше (и подробно) о подключении для конкретных плат. У меня есть этот ESP32-S3 , и я хочу подключить его к < a href="https://www.reichelt…
- Как настроить контакт как двунаправленный и с открытым коллектором? Я хочу обмениваться данными с клавиатурой асинхронно через один открытый коллектор, двунаправленный вывод данных. Как часть протокола, на контакте данных активен низкий уровень, и он…
- Регистры ввода-вывода SAM3X8E (Arduino Due) Как работают регистры ввода-вывода Arduino Due? На Arduino Uno просто установите DDRx , затем PINx для чтения, PORTx для записи, я хотел бы сделать то же самое с Arduino Due, но у него есть еще…
- Связь USB-C к USB-C Arduino не отвечает, даже если он не подключен к этому кабелю Привет, я хочу подключить arduino NANO к своему ноутбуку с помощью портов Type-C (USB-C) (на левой стороне изображения ниже [4] и другой стороне 3 ). Теперь я купил кабель USB-C к USB-C, потому что…
- Одновременное переключение двух и более цифровых выходов ESP8266 Я бы хотел управлять некоторыми цифровыми микросхемами с помощью ESP8266-12. Как я могу переключить 2 контакта на ВЫСОКИЙ в один и тот же момент? Как я могу переключить один из них на НИЗКИЙ,…
- Есть ли окончательное руководство по Arduino DUE? Я ищу справочный документ или систему документации, которая конкретно относится как минимум: Трафаретная печать PIN имя/номер SAM3X8E PIN Регистрационный номер Номер канала Название…
- SparkFun RedBoard PTH Kit неправильно настроенное оборудование У меня есть комплект SparkFun RedBoard PTH . Он сделан не SparkFun, а https://inmotion.pt (этого больше не существует). Я припаял его и купил адаптер FTDI, но когда я пытаюсь загрузить пример…
- Atmega2560 PWM на PH4 Я пытаюсь преобразовать следующий код для вывода на вывод 7 (PH4, OC4B) на Arduino Mega. Код выводится на вывод 6. Этот код взят из GitHub для GRBL на Mega "https://github.com/fra589/grbl-Mega-5X"…
- Не использовать прерывание восходящего края для внешних часов Arduino 2650 Я возюсь с Arduino Mega2560r3 и не могу запустить таймер 4 на восходящем фронте внешних часов. Он срабатывает только на краю падения. Я пытался TCCR4B = (1 << CS42) | (1 <<…
- Настройка ввода pullup через регистры Я могу установить pin-режим для ввода или вывода через регистры DDRx. Как я могу включить внутренний pullup resister через регистр?
- While условие с побитовым значением и PINx считывание Я просматривал данные ATmega32U4 для настройки SPI , и там есть фрагмент инициализации для передачи данных. void SPI_MasterTransmit(char cData) { /* Начать передачу */ SPDR = cData; …
- Почему моя плата arduino не мигает должным образом? У меня есть два файла blink1.cpp typedef unsigned char int8_t; typedef volatile int8_t * volatile port_type; port_type portB = (port_type) 0x25; port_type ddrB = (port_type) 0x24; void…
- Допустимые параметры выходного порта на Mega 2560 Я хотел бы использовать эту библиотеку на Arduino Mega2560: https://github.com/gueei/DShot-Arduino Однако макрос DSHOT_PORT должен быть определен для Mega2560 здесь: https://github…
- Не удается загрузить код на плату Arduino на Mac Я использую MacBook Pro с 10.13.6, официальную плату Arduino Uno и Arduino 1.8.13 IDE. У меня возникли проблемы с загрузкой кода на плату Arduino. У меня есть 5 доступных портов: дев/кр…
- Манипулирование портами У моего UNO возникли некоторые проблемы со стабильностью из-за интенсивного использования памяти, поэтому сейчас я оптимизирую код , стремясь уменьшить использование памяти для цифрового чтения с…
- Почему мы используем побитовые операторы для назначения PORTx, DDRx и Pinx? Я наткнулся на множество примеров использования способов, подобных показанным ниже, для присвоения значений контактам. PORTB |= (1<<PORTB2); //установить бит 2 PORTB &=…
- ATMega328 работает, но не выводит ни на какие контакты Проблема: ATMega328 отказывается выполнять digitalWrite() на любых контактах, я могу загружать и запускать скетчи с помощью платы UNO из ide на 328 и могу подтвердить, что она работает с помощью…
- Проблемы с Blue Pill (stm32f103c8t6) прямое манипулирование регистрами Я пытаюсь получить доступ к регистрам, но постоянно получаю сообщение "не было объявлено в этой области" сообщение об ошибке. В настоящее время я использую платы STM32F1xx из http://dan.drown…
- как преобразовать следующий код в один, используя прямую манипуляцию с портом Ниже представлена программа для сканирования клавиатуры для передачи MIDI. В настоящее время код работает нормально, но он мог бы быть быстрее. Мне нужно знать, как использовать прямое управление…
- Можно ли определить аналоговые контакты как их аналоговое имя (A0) или их цифровой номер контакта? Могут ли аналоговые выводы определяться их цифровым номером и использоваться для аналоговых целей? Например, вместо определения A0 для распиновки Uno можно использовать 14 ? Где это…
- Какой аналог PORTx для Teensy (4.0)? Я видел людей, использующих такой код, как PORTB |= 0x1 << 6 , чтобы установить шестой бит PORTB в Arduino. Я понимаю, что это значительно быстрее, чем использование digitalWrite . Как это…
- Данные в двух 8-битных сдвиговых регистрах не изменятся Я пытаюсь вывести 16 бит данных в два 8-битных регистра сдвига (74HC595), которые управляют светодиодной матрицей 8x8. Есть проблема с тем, как код выводит данные в регистры, как будто данные в них…
- Arduino Nano (клон) не распознается Спрашиваю здесь, потому что у меня закончились варианты поиска. Мой клон Arduino Nano больше не распознается моим компьютером. Так было до тех пор, пока я не подключился к машине с Windows, которая…
- Эквивалент PORTB в Arduino Mega 2560 Как я уже говорил в теме, хотелось бы узнать аналог инструкции: PORTB |= 0x01; PORTB &= ~0x01; Точнее, я использовал его для запуска быстрого преобразования импульсов на моем шилд-АЦП…
- Почему при подключении ЖК-дисплея Nokia 5110 мой в остальном исправный MKR1000 отключает USB через 15 секунд? Эта проблема началась только через 3 дня работы над проектом. Я использую Arduino IDE в Windows 10. Когда я загружаю "Blink", все работает нормально. Подключаю USB (иногда приходится менять…
- Arduino Nano/Uno USB не распознается У меня есть несколько устройств Unos и Nano, и в последнее время из-за неправильной конфигурации USB-устройства не распознаются на моем ноутбуке Mac Air. Это были рабочие модели почти 1-2 года. Я…
- Чтение регистра портов и печать Я играю с регистрами портов напрямую, чтобы повысить скорость на микроконтроллере Arduino. У меня нет проблем с написанием их, например PORTF &= B11101111 Однако, когда я пытаюсь …
- Не удается получить OC1B (контакт 10) для вывода Я пытаюсь заставить эту программу использовать канал B для формы выходного сигнала, используя фазово-правильный режим PWM и используя OCR1A в качестве верхнего. С коэффициентом заполнения 50% я…
- Сопоставление выводов платы Arduino Metro M4 Express с платой SAMD51 Порыскав в Интернете, я не смог найти ни одного документа (ни в техпаспорте, ни в графическом поиске в Google), в котором бы показывалось соответствие между коммутационной платой Arduino и SAMD51.…
- Почему некоторые контакты Arduino Nano (D3, D4, A3, A4, A6, A7) не могут быть установлены на высокий уровень? Я сделал набросок для включения всех цифровых и аналоговых контактов и обнаружил, что некоторые контакты не работают должным образом. Примечание. Я вручную устанавливал перемычки с каждого цифрового…
- Могу ли я отключить контакт TX, установив для него режим INPUT, при этом получая данные на контакт RX UART? Я использую ATmega328PB в личном проекте с MiniCore. Моя плата передает данные на контакт RX от другого микроконтроллера, но на моей плате также есть DIP-переключатель, подключенный к контакту TX,…
- Чтение поворотного энкодера с использованием цифровых контактов Mega 2560 напрямую с помощью регистров порта? Я пытаюсь написать процедуру обслуживания прерываний для Arduino Mega 2560 для декодирования квадратурного поворотного энкодера. У меня есть ISR (процедура обслуживания прерываний), которая…
- Совместное использование последовательного вывода с одного на несколько Arduino (плюс компьютер) через USB-концентратор Я пытаюсь отправить выходной сигнал поворотного энкодера с UNO на семь Trinket M0 и компьютер через USB-концентратор (с питанием). В настоящее время бит UNO → Laptop отлично работает,…
- Отправить SMS Arduino Uno + плата SIM900A Я работаю над модулем для отправки сообщений. Я пишу сообщение на последовательный монитор + номер телефона, и я должен отправить сообщение на линию. Вопрос: Как отправлять сообщения через…
- Выводы прерываний Arduino Mega 2560 и отображение портов с помощью поворотного энкодера Я пытаюсь использовать манипуляции с портами в прерываниях для чтения поворотного энкодера. Я нашел код для Uno, поэтому вызов порта для контактов 2 и 3 различен. Я думаю, что на Меге это PORTH3 и…
- Преобразование кода ATTINY85 в ATMEGA2560. Прерывания смены контактов У меня есть код, который правильно компилируется для платы ATTINY85 с использованием ARDUINO IDE, но у меня нет платы ATTINY85. У меня есть Arduino Mega ATMEGA2560, и когда я выбираю эту плату в…
- Проблемы с подключением I2C на ESP8266 — 12F, какие контакты использовать? Раньше я подключил датчик температуры/гула HDC1080 к Arduino, используя этот скетч, и все работало нормально. Теперь я хочу запустить его через ESP-12F, я загрузил его, но во время установления…
- Два порта на Uno с Ethernet-экраном Я создаю устройство с мод-шиной Arduino, а также хочу создать веб-страницу, которая позволит мне удаленно сбросить настройки устройства в случае возникновения каких-либо проблем. Для этого мне…
- Насколько быстро я могу считывать данные с порта D Arduino? Я пытаюсь узнать, насколько быстро я могу считать порт ввода-вывода Arduino. Он переключается случайной скоростью/белым прямоугольным сигналом, и я хочу узнать, что быстрее, Arduino или сигнал.…
- 1