Работа с портами ввода и вывода Ардуино через регистры.

Создаем свой блок. Вопросы, помощь знатоков.
aidar_i
Полковник
Сообщения: 3120
Зарегистрирован: 24.12.2016{, 16:55}
Репутация: 674
Откуда: Уфа
Имя: Айдар
Контактная информация:

Работа с портами ввода и вывода Ардуино через регистры.

#1

Сообщение aidar_i » 20.10.2021{, 13:17}

Периферия микроконтроллера настроена так, что работает очень медленно.
Пример: digitalWrite() и digitalRead() выполняются около 3.5 мкс, когда прямая работа с портом микроконтроллера занимает 0.5 мкс, что почти на порядок быстрее.
Чтобы общаться с внешним миром у микроконтроллера есть порты ввода-вывода, в каждом из которых есть несколько отдельных битов ( выводов), на которых можно установить ноль (0) или единицу (1).
У ATmega328 таких портов 3 это порты B,C и D. На каждом порту по 8 битов(за исключением порта C он 7 - разрядный) которыми можно (нужно) управлять. Но управлять с некоторыми ограничениями.
Ограничения:
D0 и D1 используются для прошивки микроконтроллерах на плате Arduino через USB;
C6 – используется для перезагрузки (reset);
B6 и B7 - на этих выводах микроконтроллера подключается внешний кварцевый резонатор.
Остальные биты можно использовать если они не задействованы. Можно использовать:
порт B – B0, B1, B2, B3, B4, B5 (соответственно выводы мк с 14 по 19) (выводы Ардуино 8-13);
порт C – С0, С1, С2, С3, С4, С5 (выводы — с 23 по 28) (выводы Ардуино 14-19);
порт D – D0, D1, D2, D3, D4, D5, D6, D7 (выводы — 0, 1, 2, 3, 4, 5, 6, 11, 12, 13) (выводы Ардуино 2-7). Пины D0 и D1 используйте, если не прошиваете Ардуино через UART и не используете Serial.
Это возможность управлять портами из FLProg.
Последняя версия, исправлена ошибка и добавлен новый блок.
Блоки для цифровых входов и выходов (не ШИМ и не аналоговые): Выбранные входы, выходы исключаются программой из списка свободных выводов.
Пример, где контроллер,если не ATmega328, в блоке пропишется рекомендация сменить контроллер на ATmega328. Замеры программы из первого примера показали на штатных входах и выходах при разомкнутой 6,56 мкс и при нажатой кнопке 6,69 мкс(увеличилась) , а на этих блоках соответственно 0,44 мкс и 0,25 мкс (уменьшилась).


____________________________
Обновлен 22.10.2021 10-40.
Последний раз редактировалось aidar_i 25.10.2021{, 22:08}, всего редактировалось 32 раза.

Ingwar
Полковник
Сообщения: 1929
Зарегистрирован: 28.10.2015{, 22:47}
Репутация: 223
Откуда: Ленобласть
Имя: Игорь

Работа с портами ввода и вывода Ардуино.

#2

Сообщение Ingwar » 20.10.2021{, 14:41}

aidar_i писал(а):
20.10.2021{, 13:17}
что почти на порядок быстрее.
Сравнение скорости с этими делалось?
Люди в своем большинстве живо интересуются всем на свете, за исключением того, что действительно стоит знать.

aidar_i
Полковник
Сообщения: 3120
Зарегистрирован: 24.12.2016{, 16:55}
Репутация: 674
Откуда: Уфа
Имя: Айдар
Контактная информация:

Работа с портами ввода и вывода Ардуино.

#3

Сообщение aidar_i » 20.10.2021{, 14:43}

Ingwar писал(а):
20.10.2021{, 14:41}
Сравнение скорости с этими делалось?
Здесь прямое обращение портам!

Ingwar
Полковник
Сообщения: 1929
Зарегистрирован: 28.10.2015{, 22:47}
Репутация: 223
Откуда: Ленобласть
Имя: Игорь

Работа с портами ввода и вывода Ардуино.

#4

Сообщение Ingwar » 20.10.2021{, 14:47}

aidar_i писал(а):
20.10.2021{, 14:43}
Здесь прямое обращение портам!
Да я не спорю, просто из любопытства спросил )
Люди в своем большинстве живо интересуются всем на свете, за исключением того, что действительно стоит знать.

Аватара пользователя
Sancho
Полковник
Сообщения: 4066
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 590
Откуда: Ярославль.
Имя: Александр
Контактная информация:

Работа с портами ввода и вывода Ардуино.

#5

Сообщение Sancho » 20.10.2021{, 15:25}

aidar_i, Всегда с уважением отношусь к Вашим работам,но в данном случае вопросы.
Новый редактор не пробовал, не знаю.
Какого бы размера не был проект, сколько плат, с данной конфигурацией при отключении антидребезга входы всё-равно читаются только в начале цикла, т.е. в плату с выходом по условию входа не вставишь.
Всё равно, при отключении антидребезга, создаётся переменная для него.
Надеюсь, что Вы поняли ход моих мыслей.

Отправлено спустя 26 минут 6 секунд:
Sancho писал(а):
20.10.2021{, 15:25}
Всё равно, при отключении антидребезга, создаётся переменная для него.
И для выхода тоже! Читал в АиФ, что можно обойтись без неё. :)
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.

Аватара пользователя
Dryundel
Полковник
Сообщения: 2401
Зарегистрирован: 22.05.2017{, 23:15}
Репутация: 783
Откуда: Ярославль
Имя: Андрей
Контактная информация:

Работа с портами ввода и вывода Ардуино.

#6

Сообщение Dryundel » 20.10.2021{, 16:50}

Sancho писал(а):
20.10.2021{, 15:51}
Какого бы размера не был проект, сколько плат, с данной конфигурацией при отключении антидребезга входы всё-равно читаются только в начале цикла, т.е. в плату с выходом по условию входа не вставишь.
Всё равно, при отключении антидребезга, создаётся переменная для него.
Sancho, вот правда, не фига не понял. Можно пояснения? И при чем здесь антидребезг? :smile37:
По моему для кнопки (для которой нужен дебонс), данная тема вообще не актуальна. 3,5мкс по сравнению с 30мс дебонса вообще ни о чем.
Или ты не про то?

aidar_i
Полковник
Сообщения: 3120
Зарегистрирован: 24.12.2016{, 16:55}
Репутация: 674
Откуда: Уфа
Имя: Айдар
Контактная информация:

Работа с портами ввода и вывода Ардуино.

#7

Сообщение aidar_i » 20.10.2021{, 18:18}

Уберу я эту переменную, уберу. Просто там много работы, поэтому пока так.
Антидребезг я поставил просто, чтобы было.
Переменную выхода тоже можно убрать.

Отправлено спустя 8 минут 24 секунды:
Уже прикинул, вот код полученный, работает.

Код: Выделить всё

void setup()
{
    DDRC &= ~(1<<PC1);
    PORTC |=(1<<PC1) ;
    pinMode(13, OUTPUT);
    digitalWrite(13, 0);
}
void loop()
{
   
    //Плата:1
    digitalWrite(13, !((PINC & 1<<PC1)));
}
Спасибо за наставления :)
Блок буду править!
Антидребезг выкину, зачем засунул?

AndrejK
Сержант
Сообщения: 119
Зарегистрирован: 20.02.2020{, 13:16}
Репутация: 14
Откуда: Вильнюс
Имя: Андрей

Работа с портами ввода и вывода Ардуино.

#8

Сообщение AndrejK » 20.10.2021{, 19:41}

aidar_i писал(а):
20.10.2021{, 13:17}
Пример: digitalWrite() и digitalRead() выполняются около 3.5 мкс, когда прямая работа с портом микроконтроллера занимает 0.5 мкс, что почти на порядок быстрее.
Вроде не 3.5 мкс, а 3.5 мс.

ecoins
Полковник
Сообщения: 2920
Зарегистрирован: 12.02.2016{, 11:40}
Репутация: 452
Откуда: Шатура
Имя: Энвер

Работа с портами ввода и вывода Ардуино.

#9

Сообщение ecoins » 20.10.2021{, 19:46}

aidar_i писал(а):
20.10.2021{, 13:17}
Периферия микроконтроллера настроена так, что работает очень медленно.
Пример: digitalWrite() и digitalRead() выполняются около 3.5 мкс, когда прямая работа с портом микроконтроллера занимает 0.5 мкс, что почти на порядок быстрее.
Чтобы общаться с внешним миром у микроконтроллера есть порты ввода-вывода, в каждом из которых есть несколько отдельных битов ( выводов), на которых можно установить ноль (0) или единицу (1).
У ATmega328 таких портов 3 это порты B,C и D. На каждом порту по 8 битов(за исключением порта C он 7 - разрядный) которыми можно (нужно) управлять. Но управлять с некоторыми ограничениями.
Проблема ускорения работы с портами актуальна.
Чаще это проблема актуальнее с дискретным выводом и настройка порта -так если для AVR328, то в реализациях с интерфейсом 1-Wire (например ds1820) возникают проблемы с реализациями.
Варианты решения этой проблемы неплохо реализованы как раз в библиотекe OneWire.h (поддиректория util), которая используется в FLProg - там реализация для многих и многих контроллеров.
ecoins потратил много усилий, для того чтобы исследовать эту проблему, были проведены много измерений и тестовых испытаний.
В действительности это актуально для 8-разрядных контроллерах, немного для ESP8266, для ESP32 и STM32 прямое обращение к регистрам почти не дает выигрыша быстройдействия.
Тем не менее мы дискретный вывод "правильно" реализовали для всех типов контроллеров, которые поддерживают библиотеки ecoins.
Это привело к существенному ускорению, в т.ч. и для аппаратного SPI !!! Или при применения интерфейса LCD через 6 пинов, и просто дискретный вывод.
Есть еще нюансы при реализации комплексного решения - в блоках ecoins это реализовано.
Так же реализован быстрый дискретный ввод в т.ч. и с защитой от дребезга (работает без "тормозов").
Все блоки реализованы с определением номера пина на входе блока - это позволяет реализовать простой переход от между контроллерами разных типов без переделки проекта.
AndrejK писал(а):
20.10.2021{, 19:41}
Вроде не 3.5 мкс, а 3.5 мс.
Конечно микросекунды....

aidar_i
Полковник
Сообщения: 3120
Зарегистрирован: 24.12.2016{, 16:55}
Репутация: 674
Откуда: Уфа
Имя: Айдар
Контактная информация:

Работа с портами ввода и вывода Ардуино.

#10

Сообщение aidar_i » 20.10.2021{, 19:51}

Sancho писал(а):
20.10.2021{, 15:51}
aidar_i, Всегда с уважением отношусь к Вашим работам,но в данном случае вопросы.
Новый редактор не пробовал, не знаю.
Какого бы размера не был проект, сколько плат, с данной конфигурацией при отключении антидребезга входы всё-равно читаются только в начале цикла, т.е. в плату с выходом по условию входа не вставишь.
Всё равно, при отключении антидребезга, создаётся переменная для него.
Надеюсь, что Вы поняли ход моих мыслей.

Отправлено спустя 26 минут 6 секунд:
Sancho писал(а):
20.10.2021{, 15:25}
Всё равно, при отключении антидребезга, создаётся переменная для него.
И для выхода тоже! Читал в АиФ, что можно обойтись без неё. :)
Обновил блок: удалил антидребезг, переменные все.
Антидребезг лучше аппаратными способами
Последний раз редактировалось aidar_i 20.10.2021{, 20:40}, всего редактировалось 2 раза.

AndrejK
Сержант
Сообщения: 119
Зарегистрирован: 20.02.2020{, 13:16}
Репутация: 14
Откуда: Вильнюс
Имя: Андрей

Работа с портами ввода и вывода Ардуино.

#11

Сообщение AndrejK » 20.10.2021{, 20:16}

ecoins писал(а):
20.10.2021{, 19:46}
Конечно микросекунды....
Точно! Почему в голову запало "мс". Так и жил эти годы с ненавистью к digitalWrite() и digitalRead(), потому давно уже перешел на управление напрямую.

Аватара пользователя
Dryundel
Полковник
Сообщения: 2401
Зарегистрирован: 22.05.2017{, 23:15}
Репутация: 783
Откуда: Ярославль
Имя: Андрей
Контактная информация:

Работа с портами ввода и вывода Ардуино.

#12

Сообщение Dryundel » 20.10.2021{, 21:02}

aidar_i, а что значит "Подтяжка к GND"? Разве в ATmega328 есть PULLDOWN-резисторы? Или я что то пропустил?

aidar_i
Полковник
Сообщения: 3120
Зарегистрирован: 24.12.2016{, 16:55}
Репутация: 674
Откуда: Уфа
Имя: Айдар
Контактная информация:

Работа с портами ввода и вывода Ардуино.

#13

Сообщение aidar_i » 20.10.2021{, 21:22}

Dryundel писал(а):
20.10.2021{, 21:02}
aidar_i, а что значит "Подтяжка к GND"? Разве в ATmega328 есть PULLDOWN-резисторы? Или я что то пропустил?
Это я разогнался :) Конечно к VCC. Если выбрать к GND, эта команда отключает подтяжки к +, это равносильно , тому что Нет.
Удалю.
Вообще внутренние подтяжки тоже не нужны, лучше внешние.

aidar_i
Полковник
Сообщения: 3120
Зарегистрирован: 24.12.2016{, 16:55}
Репутация: 674
Откуда: Уфа
Имя: Айдар
Контактная информация:

Работа с портами ввода и вывода Ардуино.

#14

Сообщение aidar_i » 21.10.2021{, 07:41}

Окончательный вариант, убрал лишнее, добавил, чтобы, для удобства, номер пина отражался на на блоке. Пины 0 и 1 вернул, используйте, если не прошиваете Ардуино через UART и не используете Serial.
Так же добавлена проверка выбранного контроллера и предупреждение о смене контроллера.
Последний раз редактировалось aidar_i 22.10.2021{, 08:42}, всего редактировалось 1 раз.

Аватара пользователя
Sancho
Полковник
Сообщения: 4066
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 590
Откуда: Ярославль.
Имя: Александр
Контактная информация:

Работа с портами ввода и вывода Ардуино.

#15

Сообщение Sancho » 21.10.2021{, 09:18}

aidar_i писал(а):
21.10.2021{, 07:41}
Окончательный вариант, убрал лишнее, добавил, чтобы, для удобства, номер пина отражался на на блоке.
Отлично!
Ждём выходы.
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.

aidar_i
Полковник
Сообщения: 3120
Зарегистрирован: 24.12.2016{, 16:55}
Репутация: 674
Откуда: Уфа
Имя: Айдар
Контактная информация:

Работа с портами ввода и вывода Ардуино.

#16

Сообщение aidar_i » 22.10.2021{, 08:45}

Обновил блок, по рекомендации Naladchik добавил проверку правильного типа выбранного контроллера (ATmega328) и вывод надписи об этом в блоке.
Работа по созданию выходов тоже продвигается.

aidar_i
Полковник
Сообщения: 3120
Зарегистрирован: 24.12.2016{, 16:55}
Репутация: 674
Откуда: Уфа
Имя: Айдар
Контактная информация:

Работа с портами ввода и вывода Ардуино.

#17

Сообщение aidar_i » 23.10.2021{, 00:17}

Добавил в первое сообщение блок для выходов.

ecoins
Полковник
Сообщения: 2920
Зарегистрирован: 12.02.2016{, 11:40}
Репутация: 452
Откуда: Шатура
Имя: Энвер

Работа с портами ввода и вывода Ардуино.

#18

Сообщение ecoins » 23.10.2021{, 12:23}

Выскажу некоторые критические соображения по оптимизации кода для Arduino Nano:
1.Прекрасный контроллер по конструктиву и функционалу, но в нем встроены ключевые ограничения по доступной памяти -30к ROM и 3к RAM.
2.Когда появляются новые решения, блоки - например продвинутые блоки LCD, или использование TFT дисплеев и пр., очень быстро проекты разрастаются и приходиться переходить на другой контроллер.
3.К слову оптимизация быстродействия ввода-вывода через прямой доступ к регистрам дело хорошее, но оно также приводит к увеличению размера кода.
-----------
Может быть не стоит растрачивать усилия для совершенствования кода для Arduino Nano, а сосредоточить объединенные усилия на более важные задачи?
Например, считаю важной задачей совершенствования кода для реализации ModBus, чтобы одновременно могли работать несколько мастеров и слэйвов (актуально для MEGA2560,STM32).
------------
По конструктиву Arduino Nano.
Если бы кто-то взялся за разработку в этом же конструктиве плату на каком-нибудь кристалле ATmega и корпусе, чтобы чип встал на плату, с добавлением на плату 4-х пиновых разъемов под три UART - получилась бы интересная плата, которую можно было бы продвигать например под маркой FLProg.
ecoins в подобном проекте готов выступить технически, организационно, материально и пр.

Ingwar
Полковник
Сообщения: 1929
Зарегистрирован: 28.10.2015{, 22:47}
Репутация: 223
Откуда: Ленобласть
Имя: Игорь

Работа с портами ввода и вывода Ардуино.

#19

Сообщение Ingwar » 23.10.2021{, 13:10}

aidar_i писал(а):
20.10.2021{, 14:43}
Сравнение скорости с этими делалось?

Здесь прямое обращение портам!
Скачал, проверил, сравнил. Скорость одинаковая. Но у Айдара чуть экономнее в используемой памяти. Молодец!
Люди в своем большинстве живо интересуются всем на свете, за исключением того, что действительно стоит знать.

Аватара пользователя
Dryundel
Полковник
Сообщения: 2401
Зарегистрирован: 22.05.2017{, 23:15}
Репутация: 783
Откуда: Ярославль
Имя: Андрей
Контактная информация:

Работа с портами ввода и вывода Ардуино.

#20

Сообщение Dryundel » 23.10.2021{, 14:41}

ecoins писал(а):
23.10.2021{, 12:23}
Может быть не стоит растрачивать усилия для совершенствования кода для Arduino Nano, а сосредоточить объединенные усилия на более важные задачи?
Однозначно стоит!!!
Разработки ecoins не единственно верное направление приложения усилий!
ecoins писал(а):
23.10.2021{, 12:23}
Например, считаю важной задачей совершенствования кода для реализации ModBus, чтобы одновременно могли работать несколько мастеров и слэйвов (актуально для MEGA2560,STM32).
Замечательно! Вот только зачем все это в данной теме?!

Ответить

Вернуться в «Разработка пользовательских блоков»