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

Создаем свой блок. Вопросы, помощь знатоков.
aidar_i
Полковник
Сообщения: 3358
Зарегистрирован: 24 дек 2016, 16:55
Откуда: Уфа
Имя: Айдар
Благодарил (а): 13 раз
Поблагодарили: 100 раз
Контактная информация:

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

Сообщение aidar_i »

Периферия микроконтроллера настроена так, что работает очень медленно.
Пример: 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.
Последняя версия, исправлена ошибка и добавлен новый блок.
Блоки для цифровых входов и выходов (не ШИМ и не аналоговые):
Цифровые входы и выходы Ардуино1.flp
Выбранные входы, выходы исключаются программой из списка свободных выводов.
Пример, где контроллер,если не ATmega328, в блоке пропишется рекомендация сменить контроллер на ATmega328.
Цифровые входы и выходы Ардуино2.flp
Замеры программы из первого примера показали на штатных входах и выходах при разомкнутой 6,56 мкс и при нажатой кнопке 6,69 мкс(увеличилась) , а на этих блоках соответственно 0,44 мкс и 0,25 мкс (уменьшилась).


____________________________
Обновлен 22.10.2021 10-40.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Последний раз редактировалось aidar_i 25 окт 2021, 22:08, всего редактировалось 32 раза.
Ingwar
Полковник
Сообщения: 1928
Зарегистрирован: 28 окт 2015, 22:47
Откуда: Ленобласть
Имя: Игорь
Поблагодарили: 2 раза

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

Сообщение Ingwar »

aidar_i писал(а): 20 окт 2021, 13:17 что почти на порядок быстрее.
Сравнение скорости с этими делалось?
Люди в своем большинстве живо интересуются всем на свете, за исключением того, что действительно стоит знать.
aidar_i
Полковник
Сообщения: 3358
Зарегистрирован: 24 дек 2016, 16:55
Откуда: Уфа
Имя: Айдар
Благодарил (а): 13 раз
Поблагодарили: 100 раз
Контактная информация:

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

Сообщение aidar_i »

Ingwar писал(а): 20 окт 2021, 14:41 Сравнение скорости с этими делалось?
Здесь прямое обращение портам!
Ingwar
Полковник
Сообщения: 1928
Зарегистрирован: 28 окт 2015, 22:47
Откуда: Ленобласть
Имя: Игорь
Поблагодарили: 2 раза

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

Сообщение Ingwar »

aidar_i писал(а): 20 окт 2021, 14:43 Здесь прямое обращение портам!
Да я не спорю, просто из любопытства спросил )
Люди в своем большинстве живо интересуются всем на свете, за исключением того, что действительно стоит знать.
Аватара пользователя
Sancho
Полковник
Сообщения: 4066
Зарегистрирован: 25 дек 2015, 17:32
Откуда: Ярославль.
Имя: Александр
Поблагодарили: 5 раз
Контактная информация:

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

Сообщение Sancho »

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

Отправлено спустя 26 минут 6 секунд:
Sancho писал(а): 20 окт 2021, 15:25 Всё равно, при отключении антидребезга, создаётся переменная для него.
И для выхода тоже! Читал в АиФ, что можно обойтись без неё. :)
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.
Аватара пользователя
Dryundel
Полковник
Сообщения: 2430
Зарегистрирован: 22 май 2017, 23:15
Откуда: Ярославль
Имя: Андрей
Благодарил (а): 3 раза
Поблагодарили: 30 раз

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

Сообщение Dryundel »

Sancho писал(а): 20 окт 2021, 15:51 Какого бы размера не был проект, сколько плат, с данной конфигурацией при отключении антидребезга входы всё-равно читаются только в начале цикла, т.е. в плату с выходом по условию входа не вставишь.
Всё равно, при отключении антидребезга, создаётся переменная для него.
[ref=#ff8000]Sancho[/ref], вот правда, не фига не понял. Можно пояснения? И при чем здесь антидребезг? :smile37:
По моему для кнопки (для которой нужен дебонс), данная тема вообще не актуальна. 3,5мкс по сравнению с 30мс дебонса вообще ни о чем.
Или ты не про то?
aidar_i
Полковник
Сообщения: 3358
Зарегистрирован: 24 дек 2016, 16:55
Откуда: Уфа
Имя: Айдар
Благодарил (а): 13 раз
Поблагодарили: 100 раз
Контактная информация:

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

Сообщение aidar_i »

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

Отправлено спустя 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
Сержант
Сообщения: 120
Зарегистрирован: 20 фев 2020, 13:16
Откуда: Вильнюс
Имя: Андрей

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

Сообщение AndrejK »

aidar_i писал(а): 20 окт 2021, 13:17 Пример: digitalWrite() и digitalRead() выполняются около 3.5 мкс, когда прямая работа с портом микроконтроллера занимает 0.5 мкс, что почти на порядок быстрее.
Вроде не 3.5 мкс, а 3.5 мс.
ecoins
Полковник
Сообщения: 4006
Зарегистрирован: 12 фев 2016, 11:40
Откуда: Шатура
Имя: Энвер
Благодарил (а): 137 раз
Поблагодарили: 153 раза

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

Сообщение ecoins »

aidar_i писал(а): 20 окт 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 окт 2021, 19:41 Вроде не 3.5 мкс, а 3.5 мс.
Конечно микросекунды....
aidar_i
Полковник
Сообщения: 3358
Зарегистрирован: 24 дек 2016, 16:55
Откуда: Уфа
Имя: Айдар
Благодарил (а): 13 раз
Поблагодарили: 100 раз
Контактная информация:

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

Сообщение aidar_i »

Sancho писал(а): 20 окт 2021, 15:51 [ref=#000080]aidar_i[/ref], Всегда с уважением отношусь к Вашим работам,но в данном случае вопросы.
Новый редактор не пробовал, не знаю.
Какого бы размера не был проект, сколько плат, с данной конфигурацией при отключении антидребезга входы всё-равно читаются только в начале цикла, т.е. в плату с выходом по условию входа не вставишь.
Всё равно, при отключении антидребезга, создаётся переменная для него.
Надеюсь, что Вы поняли ход моих мыслей.

Отправлено спустя 26 минут 6 секунд:
Sancho писал(а): 20 окт 2021, 15:25 Всё равно, при отключении антидребезга, создаётся переменная для него.
И для выхода тоже! Читал в АиФ, что можно обойтись без неё. :)
Обновил блок: удалил антидребезг, переменные все.
Антидребезг лучше аппаратными способами
[spoiler]https://arduinomaster.ru/datchiki-ardui ... nopki/#i-2 [/spoiler]
Последний раз редактировалось aidar_i 20 окт 2021, 20:40, всего редактировалось 2 раза.
AndrejK
Сержант
Сообщения: 120
Зарегистрирован: 20 фев 2020, 13:16
Откуда: Вильнюс
Имя: Андрей

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

Сообщение AndrejK »

ecoins писал(а): 20 окт 2021, 19:46 Конечно микросекунды....
Точно! Почему в голову запало "мс". Так и жил эти годы с ненавистью к digitalWrite() и digitalRead(), потому давно уже перешел на управление напрямую.
Аватара пользователя
Dryundel
Полковник
Сообщения: 2430
Зарегистрирован: 22 май 2017, 23:15
Откуда: Ярославль
Имя: Андрей
Благодарил (а): 3 раза
Поблагодарили: 30 раз

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

Сообщение Dryundel »

[ref=#000080]aidar_i[/ref], а что значит "Подтяжка к GND"? Разве в ATmega328 есть PULLDOWN-резисторы? Или я что то пропустил?
aidar_i
Полковник
Сообщения: 3358
Зарегистрирован: 24 дек 2016, 16:55
Откуда: Уфа
Имя: Айдар
Благодарил (а): 13 раз
Поблагодарили: 100 раз
Контактная информация:

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

Сообщение aidar_i »

Dryundel писал(а): 20 окт 2021, 21:02 [ref=#000080]aidar_i[/ref], а что значит "Подтяжка к GND"? Разве в ATmega328 есть PULLDOWN-резисторы? Или я что то пропустил?
Это я разогнался :) Конечно к VCC. Если выбрать к GND, эта команда отключает подтяжки к +, это равносильно , тому что Нет.
Удалю.
Вообще внутренние подтяжки тоже не нужны, лучше внешние.
aidar_i
Полковник
Сообщения: 3358
Зарегистрирован: 24 дек 2016, 16:55
Откуда: Уфа
Имя: Айдар
Благодарил (а): 13 раз
Поблагодарили: 100 раз
Контактная информация:

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

Сообщение aidar_i »

Окончательный вариант, убрал лишнее, добавил, чтобы, для удобства, номер пина отражался на на блоке. Пины 0 и 1 вернул, используйте, если не прошиваете Ардуино через UART и не используете Serial.
Так же добавлена проверка выбранного контроллера и предупреждение о смене контроллера.
Последний раз редактировалось aidar_i 22 окт 2021, 08:42, всего редактировалось 1 раз.
Аватара пользователя
Sancho
Полковник
Сообщения: 4066
Зарегистрирован: 25 дек 2015, 17:32
Откуда: Ярославль.
Имя: Александр
Поблагодарили: 5 раз
Контактная информация:

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

Сообщение Sancho »

aidar_i писал(а): 21 окт 2021, 07:41 Окончательный вариант, убрал лишнее, добавил, чтобы, для удобства, номер пина отражался на на блоке.
Отлично!
Ждём выходы.
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.
aidar_i
Полковник
Сообщения: 3358
Зарегистрирован: 24 дек 2016, 16:55
Откуда: Уфа
Имя: Айдар
Благодарил (а): 13 раз
Поблагодарили: 100 раз
Контактная информация:

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

Сообщение aidar_i »

Обновил блок, по рекомендации Naladchik добавил проверку правильного типа выбранного контроллера (ATmega328) и вывод надписи об этом в блоке.
Работа по созданию выходов тоже продвигается.
aidar_i
Полковник
Сообщения: 3358
Зарегистрирован: 24 дек 2016, 16:55
Откуда: Уфа
Имя: Айдар
Благодарил (а): 13 раз
Поблагодарили: 100 раз
Контактная информация:

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

Сообщение aidar_i »

Добавил в первое сообщение блок для выходов.
ecoins
Полковник
Сообщения: 4006
Зарегистрирован: 12 фев 2016, 11:40
Откуда: Шатура
Имя: Энвер
Благодарил (а): 137 раз
Поблагодарили: 153 раза

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

Сообщение ecoins »

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

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

Сообщение Ingwar »

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

Здесь прямое обращение портам!
Скачал, проверил, сравнил. Скорость одинаковая. Но у Айдара чуть экономнее в используемой памяти. Молодец!
Люди в своем большинстве живо интересуются всем на свете, за исключением того, что действительно стоит знать.
Аватара пользователя
Dryundel
Полковник
Сообщения: 2430
Зарегистрирован: 22 май 2017, 23:15
Откуда: Ярославль
Имя: Андрей
Благодарил (а): 3 раза
Поблагодарили: 30 раз

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

Сообщение Dryundel »

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

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

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 7 гостей