Страница 1 из 3

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

Добавлено: 20 окт 2021, 13:17
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.

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

Добавлено: 20 окт 2021, 14:41
Ingwar
aidar_i писал(а): 20 окт 2021, 13:17 что почти на порядок быстрее.
Сравнение скорости с этими делалось?

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

Добавлено: 20 окт 2021, 14:43
aidar_i
Ingwar писал(а): 20 окт 2021, 14:41 Сравнение скорости с этими делалось?
Здесь прямое обращение портам!

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

Добавлено: 20 окт 2021, 14:47
Ingwar
aidar_i писал(а): 20 окт 2021, 14:43 Здесь прямое обращение портам!
Да я не спорю, просто из любопытства спросил )

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

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

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

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

Добавлено: 20 окт 2021, 16:50
Dryundel
Sancho писал(а): 20 окт 2021, 15:51 Какого бы размера не был проект, сколько плат, с данной конфигурацией при отключении антидребезга входы всё-равно читаются только в начале цикла, т.е. в плату с выходом по условию входа не вставишь.
Всё равно, при отключении антидребезга, создаётся переменная для него.
[ref=#ff8000]Sancho[/ref], вот правда, не фига не понял. Можно пояснения? И при чем здесь антидребезг? :smile37:
По моему для кнопки (для которой нужен дебонс), данная тема вообще не актуальна. 3,5мкс по сравнению с 30мс дебонса вообще ни о чем.
Или ты не про то?

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

Добавлено: 20 окт 2021, 18:45
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)));
}
Спасибо за наставления :)
Блок буду править!
Антидребезг выкину, зачем засунул?

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

Добавлено: 20 окт 2021, 19:41
AndrejK
aidar_i писал(а): 20 окт 2021, 13:17 Пример: digitalWrite() и digitalRead() выполняются около 3.5 мкс, когда прямая работа с портом микроконтроллера занимает 0.5 мкс, что почти на порядок быстрее.
Вроде не 3.5 мкс, а 3.5 мс.

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

Добавлено: 20 окт 2021, 19:46
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 мс.
Конечно микросекунды....

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

Добавлено: 20 окт 2021, 19:51
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]

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

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

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

Добавлено: 20 окт 2021, 21:02
Dryundel
[ref=#000080]aidar_i[/ref], а что значит "Подтяжка к GND"? Разве в ATmega328 есть PULLDOWN-резисторы? Или я что то пропустил?

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

Добавлено: 20 окт 2021, 21:22
aidar_i
Dryundel писал(а): 20 окт 2021, 21:02 [ref=#000080]aidar_i[/ref], а что значит "Подтяжка к GND"? Разве в ATmega328 есть PULLDOWN-резисторы? Или я что то пропустил?
Это я разогнался :) Конечно к VCC. Если выбрать к GND, эта команда отключает подтяжки к +, это равносильно , тому что Нет.
Удалю.
Вообще внутренние подтяжки тоже не нужны, лучше внешние.

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

Добавлено: 21 окт 2021, 07:41
aidar_i
Окончательный вариант, убрал лишнее, добавил, чтобы, для удобства, номер пина отражался на на блоке. Пины 0 и 1 вернул, используйте, если не прошиваете Ардуино через UART и не используете Serial.
Так же добавлена проверка выбранного контроллера и предупреждение о смене контроллера.

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

Добавлено: 21 окт 2021, 09:18
Sancho
aidar_i писал(а): 21 окт 2021, 07:41 Окончательный вариант, убрал лишнее, добавил, чтобы, для удобства, номер пина отражался на на блоке.
Отлично!
Ждём выходы.

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

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

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

Добавлено: 23 окт 2021, 00:17
aidar_i
Добавил в первое сообщение блок для выходов.

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

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

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

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

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

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

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