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

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

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


____________________________
Обновлен 22.10.2021 10-40.

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

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

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

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

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

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

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

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

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

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

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

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

Добавлено: 20.10.2021{, 18:18}
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.10.2021{, 19:41}
AndrejK
aidar_i писал(а):
20.10.2021{, 13:17}
Пример: digitalWrite() и digitalRead() выполняются около 3.5 мкс, когда прямая работа с портом микроконтроллера занимает 0.5 мкс, что почти на порядок быстрее.
Вроде не 3.5 мкс, а 3.5 мс.

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

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

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

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

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

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

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

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

Добавлено: 20.10.2021{, 21:02}
Dryundel
aidar_i, а что значит "Подтяжка к GND"? Разве в ATmega328 есть PULLDOWN-резисторы? Или я что то пропустил?

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

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

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

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

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

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

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

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

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

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

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

Добавлено: 23.10.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.10.2021{, 13:10}
Ingwar
aidar_i писал(а):
20.10.2021{, 14:43}
Сравнение скорости с этими делалось?

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

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

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