Работа с портами ввода и вывода Ардуино через регистры.
-
- Полковник
- Сообщения: 3358
- Зарегистрирован: 24 дек 2016, 16:55
- Откуда: Уфа
- Имя: Айдар
- Благодарил (а): 13 раз
- Поблагодарили: 100 раз
- Контактная информация:
Работа с портами ввода и вывода Ардуино через регистры.
Периферия микроконтроллера настроена так, что работает очень медленно.
Пример: 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.
Пример: 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 окт 2021, 22:08, всего редактировалось 32 раза.
-
- Полковник
- Сообщения: 1928
- Зарегистрирован: 28 окт 2015, 22:47
- Откуда: Ленобласть
- Имя: Игорь
- Поблагодарили: 2 раза
Работа с портами ввода и вывода Ардуино.
Сравнение скорости с этими делалось?
Люди в своем большинстве живо интересуются всем на свете, за исключением того, что действительно стоит знать.
-
- Полковник
- Сообщения: 3358
- Зарегистрирован: 24 дек 2016, 16:55
- Откуда: Уфа
- Имя: Айдар
- Благодарил (а): 13 раз
- Поблагодарили: 100 раз
- Контактная информация:
-
- Полковник
- Сообщения: 1928
- Зарегистрирован: 28 окт 2015, 22:47
- Откуда: Ленобласть
- Имя: Игорь
- Поблагодарили: 2 раза
Работа с портами ввода и вывода Ардуино.
Да я не спорю, просто из любопытства спросил )
Люди в своем большинстве живо интересуются всем на свете, за исключением того, что действительно стоит знать.
- Sancho
- Полковник
- Сообщения: 4066
- Зарегистрирован: 25 дек 2015, 17:32
- Откуда: Ярославль.
- Имя: Александр
- Поблагодарили: 5 раз
- Контактная информация:
Работа с портами ввода и вывода Ардуино.
[ref=#000080]aidar_i[/ref], Всегда с уважением отношусь к Вашим работам,но в данном случае вопросы.
Новый редактор не пробовал, не знаю.
Какого бы размера не был проект, сколько плат, с данной конфигурацией при отключении антидребезга входы всё-равно читаются только в начале цикла, т.е. в плату с выходом по условию входа не вставишь.
Всё равно, при отключении антидребезга, создаётся переменная для него.
Надеюсь, что Вы поняли ход моих мыслей.
Отправлено спустя 26 минут 6 секунд:
Новый редактор не пробовал, не знаю.
Какого бы размера не был проект, сколько плат, с данной конфигурацией при отключении антидребезга входы всё-равно читаются только в начале цикла, т.е. в плату с выходом по условию входа не вставишь.
Всё равно, при отключении антидребезга, создаётся переменная для него.
Надеюсь, что Вы поняли ход моих мыслей.
Отправлено спустя 26 минут 6 секунд:
И для выхода тоже! Читал в АиФ, что можно обойтись без неё.Sancho писал(а): 20 окт 2021, 15:25 Всё равно, при отключении антидребезга, создаётся переменная для него.

мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.
- Dryundel
- Полковник
- Сообщения: 2430
- Зарегистрирован: 22 май 2017, 23:15
- Откуда: Ярославль
- Имя: Андрей
- Благодарил (а): 3 раза
- Поблагодарили: 30 раз
Работа с портами ввода и вывода Ардуино.
[ref=#ff8000]Sancho[/ref], вот правда, не фига не понял. Можно пояснения? И при чем здесь антидребезг?Sancho писал(а): 20 окт 2021, 15:51 Какого бы размера не был проект, сколько плат, с данной конфигурацией при отключении антидребезга входы всё-равно читаются только в начале цикла, т.е. в плату с выходом по условию входа не вставишь.
Всё равно, при отключении антидребезга, создаётся переменная для него.

По моему для кнопки (для которой нужен дебонс), данная тема вообще не актуальна. 3,5мкс по сравнению с 30мс дебонса вообще ни о чем.
Или ты не про то?
-
- Полковник
- Сообщения: 3358
- Зарегистрирован: 24 дек 2016, 16:55
- Откуда: Уфа
- Имя: Айдар
- Благодарил (а): 13 раз
- Поблагодарили: 100 раз
- Контактная информация:
Работа с портами ввода и вывода Ардуино.
Уберу я эту переменную, уберу. Просто там много работы, поэтому пока так.
Антидребезг я поставил просто, чтобы было.
Переменную выхода тоже можно убрать.
Отправлено спустя 8 минут 24 секунды:
Уже прикинул, вот код полученный, работает.
Спасибо за наставления 
Блок буду править!
Антидребезг выкину, зачем засунул?
Антидребезг я поставил просто, чтобы было.
Переменную выхода тоже можно убрать.
Отправлено спустя 8 минут 24 секунды:
Уже прикинул, вот код полученный, работает.
Код: Выделить всё
void setup()
{
DDRC &= ~(1<<PC1);
PORTC |=(1<<PC1) ;
pinMode(13, OUTPUT);
digitalWrite(13, 0);
}
void loop()
{
//Плата:1
digitalWrite(13, !((PINC & 1<<PC1)));
}

Блок буду править!
Антидребезг выкину, зачем засунул?
Работа с портами ввода и вывода Ардуино.
Вроде не 3.5 мкс, а 3.5 мс.aidar_i писал(а): 20 окт 2021, 13:17 Пример: digitalWrite() и digitalRead() выполняются около 3.5 мкс, когда прямая работа с портом микроконтроллера занимает 0.5 мкс, что почти на порядок быстрее.
-
- Полковник
- Сообщения: 4006
- Зарегистрирован: 12 фев 2016, 11:40
- Откуда: Шатура
- Имя: Энвер
- Благодарил (а): 137 раз
- Поблагодарили: 153 раза
Работа с портами ввода и вывода Ардуино.
Проблема ускорения работы с портами актуальна.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 это реализовано.
Так же реализован быстрый дискретный ввод в т.ч. и с защитой от дребезга (работает без "тормозов").
Все блоки реализованы с определением номера пина на входе блока - это позволяет реализовать простой переход от между контроллерами разных типов без переделки проекта.
Конечно микросекунды....
-
- Полковник
- Сообщения: 3358
- Зарегистрирован: 24 дек 2016, 16:55
- Откуда: Уфа
- Имя: Айдар
- Благодарил (а): 13 раз
- Поблагодарили: 100 раз
- Контактная информация:
Работа с портами ввода и вывода Ардуино.
Обновил блок: удалил антидребезг, переменные все.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 раза.
Работа с портами ввода и вывода Ардуино.
Точно! Почему в голову запало "мс". Так и жил эти годы с ненавистью к digitalWrite() и digitalRead(), потому давно уже перешел на управление напрямую.
- Dryundel
- Полковник
- Сообщения: 2430
- Зарегистрирован: 22 май 2017, 23:15
- Откуда: Ярославль
- Имя: Андрей
- Благодарил (а): 3 раза
- Поблагодарили: 30 раз
Работа с портами ввода и вывода Ардуино.
[ref=#000080]aidar_i[/ref], а что значит "Подтяжка к GND"? Разве в ATmega328 есть PULLDOWN-резисторы? Или я что то пропустил?
-
- Полковник
- Сообщения: 3358
- Зарегистрирован: 24 дек 2016, 16:55
- Откуда: Уфа
- Имя: Айдар
- Благодарил (а): 13 раз
- Поблагодарили: 100 раз
- Контактная информация:
Работа с портами ввода и вывода Ардуино.
Это я разогналсяDryundel писал(а): 20 окт 2021, 21:02 [ref=#000080]aidar_i[/ref], а что значит "Подтяжка к GND"? Разве в ATmega328 есть PULLDOWN-резисторы? Или я что то пропустил?

Удалю.
Вообще внутренние подтяжки тоже не нужны, лучше внешние.
-
- Полковник
- Сообщения: 3358
- Зарегистрирован: 24 дек 2016, 16:55
- Откуда: Уфа
- Имя: Айдар
- Благодарил (а): 13 раз
- Поблагодарили: 100 раз
- Контактная информация:
Работа с портами ввода и вывода Ардуино.
Окончательный вариант, убрал лишнее, добавил, чтобы, для удобства, номер пина отражался на на блоке. Пины 0 и 1 вернул, используйте, если не прошиваете Ардуино через UART и не используете Serial.
Так же добавлена проверка выбранного контроллера и предупреждение о смене контроллера.
Так же добавлена проверка выбранного контроллера и предупреждение о смене контроллера.
Последний раз редактировалось aidar_i 22 окт 2021, 08:42, всего редактировалось 1 раз.
- Sancho
- Полковник
- Сообщения: 4066
- Зарегистрирован: 25 дек 2015, 17:32
- Откуда: Ярославль.
- Имя: Александр
- Поблагодарили: 5 раз
- Контактная информация:
Работа с портами ввода и вывода Ардуино.
Отлично!aidar_i писал(а): 21 окт 2021, 07:41 Окончательный вариант, убрал лишнее, добавил, чтобы, для удобства, номер пина отражался на на блоке.
Ждём выходы.
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.
-
- Полковник
- Сообщения: 3358
- Зарегистрирован: 24 дек 2016, 16:55
- Откуда: Уфа
- Имя: Айдар
- Благодарил (а): 13 раз
- Поблагодарили: 100 раз
- Контактная информация:
Работа с портами ввода и вывода Ардуино.
Обновил блок, по рекомендации Naladchik добавил проверку правильного типа выбранного контроллера (ATmega328) и вывод надписи об этом в блоке.
Работа по созданию выходов тоже продвигается.
Работа по созданию выходов тоже продвигается.
-
- Полковник
- Сообщения: 4006
- Зарегистрирован: 12 фев 2016, 11:40
- Откуда: Шатура
- Имя: Энвер
- Благодарил (а): 137 раз
- Поблагодарили: 153 раза
Работа с портами ввода и вывода Ардуино.
Выскажу некоторые критические соображения по оптимизации кода для Arduino Nano:
1.Прекрасный контроллер по конструктиву и функционалу, но в нем встроены ключевые ограничения по доступной памяти -30к ROM и 3к RAM.
2.Когда появляются новые решения, блоки - например продвинутые блоки LCD, или использование TFT дисплеев и пр., очень быстро проекты разрастаются и приходиться переходить на другой контроллер.
3.К слову оптимизация быстродействия ввода-вывода через прямой доступ к регистрам дело хорошее, но оно также приводит к увеличению размера кода.
-----------
Может быть не стоит растрачивать усилия для совершенствования кода для Arduino Nano, а сосредоточить объединенные усилия на более важные задачи?
Например, считаю важной задачей совершенствования кода для реализации ModBus, чтобы одновременно могли работать несколько мастеров и слэйвов (актуально для MEGA2560,STM32).
------------
По конструктиву Arduino Nano.
Если бы кто-то взялся за разработку в этом же конструктиве плату на каком-нибудь кристалле ATmega и корпусе, чтобы чип встал на плату, с добавлением на плату 4-х пиновых разъемов под три UART - получилась бы интересная плата, которую можно было бы продвигать например под маркой FLProg.
ecoins в подобном проекте готов выступить технически, организационно, материально и пр.
1.Прекрасный контроллер по конструктиву и функционалу, но в нем встроены ключевые ограничения по доступной памяти -30к ROM и 3к RAM.
2.Когда появляются новые решения, блоки - например продвинутые блоки LCD, или использование TFT дисплеев и пр., очень быстро проекты разрастаются и приходиться переходить на другой контроллер.
3.К слову оптимизация быстродействия ввода-вывода через прямой доступ к регистрам дело хорошее, но оно также приводит к увеличению размера кода.
-----------
Может быть не стоит растрачивать усилия для совершенствования кода для Arduino Nano, а сосредоточить объединенные усилия на более важные задачи?
Например, считаю важной задачей совершенствования кода для реализации ModBus, чтобы одновременно могли работать несколько мастеров и слэйвов (актуально для MEGA2560,STM32).
------------
По конструктиву Arduino Nano.
Если бы кто-то взялся за разработку в этом же конструктиве плату на каком-нибудь кристалле ATmega и корпусе, чтобы чип встал на плату, с добавлением на плату 4-х пиновых разъемов под три UART - получилась бы интересная плата, которую можно было бы продвигать например под маркой FLProg.
ecoins в подобном проекте готов выступить технически, организационно, материально и пр.
-
- Полковник
- Сообщения: 1928
- Зарегистрирован: 28 окт 2015, 22:47
- Откуда: Ленобласть
- Имя: Игорь
- Поблагодарили: 2 раза
Работа с портами ввода и вывода Ардуино.
Скачал, проверил, сравнил. Скорость одинаковая. Но у Айдара чуть экономнее в используемой памяти. Молодец!aidar_i писал(а): 20 окт 2021, 14:43 Сравнение скорости с этими делалось?
Здесь прямое обращение портам!
Люди в своем большинстве живо интересуются всем на свете, за исключением того, что действительно стоит знать.
- Dryundel
- Полковник
- Сообщения: 2430
- Зарегистрирован: 22 май 2017, 23:15
- Откуда: Ярославль
- Имя: Андрей
- Благодарил (а): 3 раза
- Поблагодарили: 30 раз
Работа с портами ввода и вывода Ардуино.
Однозначно стоит!!!ecoins писал(а): 23 окт 2021, 12:23 Может быть не стоит растрачивать усилия для совершенствования кода для Arduino Nano, а сосредоточить объединенные усилия на более важные задачи?
Разработки ecoins не единственно верное направление приложения усилий!
Замечательно! Вот только зачем все это в данной теме?!ecoins писал(а): 23 окт 2021, 12:23 Например, считаю важной задачей совершенствования кода для реализации ModBus, чтобы одновременно могли работать несколько мастеров и слэйвов (актуально для MEGA2560,STM32).
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 7 гостей