Команды групповой обработки цифровых входов/выходов

IgorU
Offline
Зарегистрирован: 03.12.2014

Уважаемые знатоки, имеются ли команды групповой обработки(в описании языка не нашел):
1. Установить группу цифровых входов/выходов в состояние INPUT или OUTPUT?
2. Установить на группе цифровых выходов высокий или низкий потенциал?

Чтобы не писать для каждого пина команды pinMode(), digitalWrite(), digitalRead(). Если нет подскажите, каким компактным способом можно это сделать.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Макросы находятся в io.h и вызываемых из него файлах конкретного проца:

PORTB=0;

PORTD=0xFF;

Чем не устраивают?

Araris
Offline
Зарегистрирован: 09.11.2012

Простой путь - с помощью массивов и циклов.

Более сложный - управлять портами через регистры (http://arduino.net.ua/Arduino_articles/Opisanie%20jazyka%20Arduino%20na%20russkom%20jazyke/Manipuljacii%20s%20portami/       http://arduino.ru/Tutorial/Upravlenie_portami_cherez_registry).

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Чем сложный-то? Уж не знаю куда проще написать простое присваивание.. один раз выписать для своей машинки связку промеж портов и ножек платы и повесить себе на монитор. :)

Araris
Offline
Зарегистрирован: 09.11.2012

Желаете похоливарить ? Извольте: мне проще написать и понятнее прочитать

digitalWrite(PIN_LED,HIGH);

digitalWrite(PIN_MOTOR,HIGH);

digitalWrite(PIN_SERVO,HIGH);

нежели

PORTD = B10101000; // HIGH на цифровых выводах 7,5,3

IgorU
Offline
Зарегистрирован: 03.12.2014

Все дело в том, что выходов не 4-5 шт, а сразу 24 (на Mega2560) нужно ставить в нужное состояние, по результатам обработки, вот и возник вопрос как экономичнее, грамотнее  это сделать, чтобы машинных циклов было минимум, а результат вдохновлял!!!

Arhat109-2 пишет:
PORTB=0; PORTD=0xFF; Чем не устраивают?

Как будет выглядеть команда для установки например, 34-54 портов в High?

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

PORTD = B10101000; // HIGH на цифровых выводах 7,5,3
для 24-ёх выходов так лучше ( но через несколько портов )

Araris , 
всё правильно написал.... только первый вариант не подходит если нужна синхронность управления пинами
второй вариант это устраняет

но 24 пина.... это запись минимум в 3 порта ( но быстрее , чем digitalWrite(PIN_LED,HIGH); )

24 пина - не проще ли использовать 3 послПараллельных регистра ?

sirik
Offline
Зарегистрирован: 10.11.2012

тут надо поаккуратнее, ибо насколько мне не изменяет память порты в Uno и Mega разные, точне данные команды привязаны к разным портам

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

sirik пишет:

тут надо поаккуратнее, ибо насколько мне не изменяет память порты в Uno и Mega разные, точне данные команды привязаны к разным портам

но 24 пина.... это запись минимум в 3 порта ( смотря как сигналы по портам распределить )

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

Как будет выглядеть команда для установки например, 34-54 портов в High?
тут уж точно нужны регистры 595 и SPI....
...зачем Мегу напрягать попиново ?

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

IgorU пишет:

Arhat109-2 пишет:
PORTB=0; PORTD=0xFF; Чем не устраивают?

Как будет выглядеть команда для установки например, 34-54 портов в High?

Только не портов, а пинов (порты - это PORTA, PORTB, PORTC и т.д., на каждом порту по 8 пинов  - PA0, PA1, PA2 ... PA7)

Для этого надо определить, к каким ножкам микроконтроллера подключены пины ардуины 34-54. Надо смотреть распиновку Ардуины. Там видно, что пин 34 это ножка PC3, 35 - PC2, 36 - PC1, 37 - PC0, 40 пин это уже PORTG - PG1, 41 - PG0, а 42 уже PORTL - PL7, ну и так далее.....

Т.е., хоть пины на Ардуине и идут подряд, к ножкам микроконтроллера они подключаются вразнобой, к разным портам. Нужно смотреть внимательно.

После этого управляем через регистры: DDRA, DDRB, DDRC и т.д. - это настройка вход/выход. PORTA, PORTB, PORTC и т.д. - это подача лог. 0 / лог. 1 (если выход), либо плавающий вход / вкл. подтяжка (если вход).

IgorU
Offline
Зарегистрирован: 03.12.2014

Вот это ближе к пониманию. Спасибо.

 

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

Как будет выглядеть команда для установки например, 34-54 портов в High?
смотри #3 и #10
для включения 48-ми пинов будет шесть ( минимум ) команд

PORTA=0xFF , PORTB=0xFF , PORTC=0xFF , PORTD=0xFF , PORTE=0xFF , PORTF=0xFF ;

через digitalWrite(PIN_1,HIGH); придётся прописать таких операторов 48 !!!!!

и всё-таки - почему не регистры 595 ?

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

ой ! воспринял что нужно 34....54 ШТ. пинов поднять , а не пины с 34 по 54 Меги :(
...но сути это не меняет :)

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

забрать у меги 21 пин или 3 пина и добавить 3 регистра ? я за второе...
IgorU ,  а чем будут управлять эти 21 пин ?

IgorU
Offline
Зарегистрирован: 03.12.2014

Коммутатор 24 пина, в зависимости от обработки - на аналоговых стоят датчики, в зависимости от состояния датчиков часть пинов становится в High, а остальные нужно сбросить в Low, - дальше исполнительные устройства...

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

Коммутатор 24 пина, в зависимости от обработки - на аналоговых стоят датчики
тут ничё не понял....
забрать у меги 21 пин или 3 пина и добавить 3 регистра ? я за второе...
про такое - что думаете ?

IgorU
Offline
Зарегистрирован: 03.12.2014

Цитата:
тут ничё не понял....

На Меге собран коммутатор, для управления исполнительными механизмами используются 24 пина. Датчики на аналоговых входах, а исполнители на цифровых. Программно происходит обрботка сигналов датчиков. Так вот, чтобы не писать кучу операторов установки  состояния на этих пинах, задан вопрос, как компактнее это сделать. Что не понятно?

Цитата:
забрать у меги 21 пин или 3 пина и добавить 3 регистра ? я за второе... про такое - что думаете ?

Вот это требует расшифровки.

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

IgorU пишет:

Вот это требует расшифровки.

SU-27-16 говорил про сдвиговые регистры 74HC595 (последовательно-параллельные). Одним пином с Ардуины можно управлять сразу восемью устройствами. Это для пинов-выходов. Для входов есть сдвиговый регистр 74HC165 (параллельно-последовательный).

IgorU
Offline
Зарегистрирован: 03.12.2014

Спасибо за подсказку ребята, идея с расширением через регистры неплоха, буду  изучать.

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

Jeka_M ,   не одним  , а тремя пинами ( SPI )
и не 8-мью устройствами - а сколько хватит денежков на 74HC595 х 8  :)

IgorU ,   
1 - 21 сигналов управления можно отобразить на пины Меги
2 - а можно отобразить на 24 выхода 3-ёх регистров

1 - отжирает у Меги 21 пин ( через прямую запись в порты пинов )
2 - отжирает всего ТРИ пина ( запись в три регистра упрСигналов по SPI )

 

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

Это для пинов-выходов. Для входов есть сдвиговый регистр 74HC165 (параллельно-последовательный).
для аналоговых входов - не подходит , тут нужен АНАЛОГОВЫЙ мультиплексор....

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

SU-27-16 пишет:

Jeka_M ,   не одним  , а тремя пинами ( SPI )

Ага, ошибся.

SU-27-16 пишет:

и не 8-мью устройствами - а сколько хватит денежков на 74HC595 х 8  :)

Имел в виду 8 устройств на один сдиговый регистр. А так да - множим регистры, строим каскады :)

IgorU, статья на этом сайте - http://arduino.ru/Tutorial/registr_74HC595 , ну и гугл рулит.

Duino A.R.
Offline
Зарегистрирован: 25.05.2015

IgorU пишет:

Спасибо за подсказку ребята, идея с расширением через регистры неплоха, буду  изучать.


Самый цинус внешних выходных регистров в том, что писать Вы туда можете как угодно не спешно, а данные на выходах всех регистров появятся одновременно по одному аппаратному сигналу. Такой одновременности на выводах МК добиться нельзя. По входам тоже. Если важен прямой срез времени (одновременность считывания данных), то лучше аппаратной защелки ничего нет. Но тут уже надо понимать тонкости задачи. Поэтому если нужна скорость, то через порты ассемблером, а если одновременность, то через аппаратные регистры любым удобным способом.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Не прочел все что тут понакатали .. идея с расширением сдвиговыми регистрами - не просто "не плохая" а по-настоящему бредовая для Меги2560! У чела коммутатор на 24 выхода. И?

Один предлагает 24 раза прописать команду, длиной в 400 байт (вместо 3-х команд МК!) .. а другой поставить 3 сдвиговых регистра и .. угу, 24 раза пинать в сдвиговый регистр, предварительно закрыв его на выход, а потом ещё отдельно открывать его когда данные коммутаторам установлены наконец-то .. теми же самыми 24-ю командами по 400 байт.

Класс.

Ещё раз: смотрите распиновку портов на Меге - полно где есть и даже на этом ресурсе. Выбирайте свои 24 ноги из полных портов, а не 25..48 "как удобно", ибо они действительно по большей части "вразнобой" .. ноги получатся "в рассыпную". И уж думаю выбрать из 70-и ног 24 в требуемых портах проблемы не составит.

и управляйте всего ТРЕМЯ командами МК (6 байт кода).

P.S.

Любителям писать digitalWrite(pin, level); -- в либе arhat.h именно так и переименован макрос, пишуший ОДНОЙ командой в пин. Нисколько не хуже. Можно даже так: pinOut(pin, level); :)

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

на вкус и цвет кода нет !
человек спросил - ему показали все варианты... пусть выбирает...

....угу, 24 раза пинать в сдвиговый регистр, предварительно закрыв его на выход
такого не может быть...

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Я бы на регистрах делал....
А чтобы не дёргать их ноги с помощью медленных digitalWrite  Использовал библиотеку https://www.arduino.cc/en/Reference/SPI

What is the maximum SPI speed your device can use?
This is controlled by the first parameter in SPISettings. If you are using a chip rated at 15 MHz, use 15000000.

Или CyberLib.h хотя-бы  http://istarik.ru/blog/arduino/1.html  
http://cyber-place.ru/showthread.php?t=550

 

Ну и   спасибо отдельное Arhat109   http://cyber-place.ru/showthread.php?t=1909

Ещё библиотека  https://sites.google.com/site/shift595arduino/downloads

// The constant max595s defines the maximum number of 74HC595's this library supports;
// change it if you need more, or less. The default settings allow eight daisy-chained 595's,
// creating an additional 64 Digital Output pins from just three of your Aurdino's native pins.

#define max595s 8

IgorU
Offline
Зарегистрирован: 03.12.2014

Ага, вот первая ласточка: На регистрах сигнал продвгается последовательно от одной ячейки к другой. Мне нужно получить, например в 7 бите высокий уровень. По логике, высокий уровень во время установки появляется на выходах предыдущих ячеек 1-6. Поскольку исполнители подключены к каждой ячейке, то "дерганья" не избежать (пусть и на короткое время!). Такого мне не нужно. Для индикации еще пойдет, там время изменения невилико и "на глаз" возможно не заметно.

Преимущество в регистрах вижу в том, что устанавливаются нужные биты в "1" или "0" в любой комбинации. Имеется ли в таких регистрах механизм смены уровней ТОЛЬКО ПОСЛЕ УСТАНОВКИ всего байта? Пин 12 ST_CP(Синронизация выходов) - это оно??? А если их каскад, то как, прогоняем все байты по всем регистрам, потом сигнал ST_CP в "1"?

Arhat109-2 пишет:
и управляйте всего ТРЕМЯ командами МК (6 байт кода).

Этот вариант больше нравится. Не хочется усложнять схему дополнительным логическими элементами, поэтому и выбрана Мега, т.к. имеет большое количество входов/выходов!

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Так я вас так и понял, что есть 24 ноги и хочется написать "дешево и сердито", а не дублировать 224 команды .. вот и предложил: подберите пины из полных портов .. кстати порты "A" и "C" кажется 22 .. 38 ноги меги - как раз идут "подряд". там xmem интерфейс сидит. 16 ножек точно подряд идут.

Да, имеются. Регистры с трех-стабильным выходом созданы специально для таких операций: отключаете выхода парралельной части, загоняете новое значение сдвигами и открываете выхода на вывод. Итого 10 операций на запись одного байта.

При подборе ножек по портам у вас 3 операции.

Каждая команда на 16Мгц - это 62.5 наносекунды. То есть 3-я командами вы проставите свой коммутатор за 190нс = 0.19мкс. А 26-ю .. соответственно за 26*62.5нс. Цена "сдвигового регистра". Цена библиотеки Wiring (digitalWrite) - около 20 команд реального исполнения на КАЖДЫЙ сдвиг.

IgorU
Offline
Зарегистрирован: 03.12.2014

Arhat109-2  - ОК, спасибо. Прочитал вашу статью скачал библиотеку "ARHAT", пытался в IDE с помощью МЕНЮ вставить в скетч, #include "arhat.h" - не появляется, вставляется пустая строка, что-то не так??? Все другие библиотеки таким образом прописываются нормально, у некоторых 4-5 файлов ***.h. Не хватает какого-то файла описания или что? Какой там(в IDE) механизм?

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

? Нормально вставляется. С ней активно работает уже человек 10 - точно. Это с кем периодически общаюсь. Один из пользователей уже положил её в гитхаб, вот сюда: https://github.com/dimanus/AVR_LIB_AUTOMAT

можно брать оттуда. Но там, в транке - текущая версия, может быть коммит, не тестированный ни разу..

попробуйте руками распаковать либу в ваш каталог скетчей в подкаталог /libraries .. свой подкаталог /Arhat оно должно создать самостоятельно. Я сейчас не могу посмотреть и/или что-то потестировать в силу очередной перестановки компа и всего ПО на нем .. неделю назад погорела очередная мамка. А там .. да за многа лет программирования .. :(

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Как сейчас .. только что закоммитил возврат к управлению режимами либы по многочисленным просьбам .. и там ещё лежит начало распиновки под промини проц .. незавершенное. :)

IgorU
Offline
Зарегистрирован: 03.12.2014

Качал отсюда: http://cyber-place.ru/showthread.php?t=1909. Нет не ставит... Может есть другой ресурс с актуальной версией?

arhat.jpg

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Там актуальная версия. Воткните ручками первой командой скетча #include "arhat.h" и посмотрите скомпиляет или куда..

IgorU
Offline
Зарегистрирован: 03.12.2014

Вставил "ручками". Сообщение об ошибке, не находит каталог(файл):

Arduino: 1.6.5 (Windows 7), Плата"Arduino/Genuino Mega or Mega 2560, ATmega2560 (Mega 2560)" Blink.ino:19:70: fatal error: arhat.h: No such file or directory compilation terminated. Ошибка компиляции.

Все, нашел, IDE стандартно должен грузить из каталога /libraries. Перекинул папку в каталог скетчей - скомпилировалось.  Заметил, что в остальных библиотеках присутствует одноименные файлы ***.cpp, а в Вашей нет. Можно к стандарту привести этот косячок? Не критично, но все же...

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Это не "стандарт". И в этой либе нет *.cpp поскольку С++ не используется. Так что ответ: "нельзя" ибо нечего. :)

IgorU
Offline
Зарегистрирован: 03.12.2014

ОК! Спасибо за библиотеку, все здорово! Тестирую операторы ...

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Для дальнейшего обсуждения, приглашаю сюда:  http://arduino.ru/forum/programmirovanie/arduino-kak-konechnyi-avtomat-z...

тема создана специально под либу. Или на почту.

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

#27 - Мне нужно получить, например в 7 бите высокий уровень. По логике, высокий уровень во время установки появляется на выходах предыдущих ячеек 1-6.
Не так работает регистр...

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

?!? А как? :)

Есть сдвиговые регистры с обычным выходом и есть трехстабильные .. первые именно так и работают. А вторые могут работать И так и иначе.

Только для того чтобы было иначе, надо сначала перевести выходы в третье состояние отдельной командой, потом подвигать данные в регистр 8 раз, и потом тольк открыть выходы снова отдельной командой. Итого 10 операций .. и это ещё без дублриующего байта данных в памяти. Поскольку если надо изменить состояние только одного бита, то:

1. Достать копию содержимого из памяти

2. логически (И/ИЛИ) изменить состояние требуемого бита

3. сохранить копию в памяти

4. закрыть регистр .. и далее ещё 9 команд.

Итого 13 операций ... вместо одной: "Записать значение в порт" .. и это при 70-и свободных ногах платы. Класс. :)

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

текст не про то - что лучше , а про регистр 74HC595....
регистр на выходах держит код до окончания записи в его сдвиговый БУФЕР нового значения - потом с буфера все 8 бит одновременно записываются в выходной каскад ( никаких изменений на выходе во время сдвигов НЕТ )

решать ТС-у как реализовать....
но брать под эту задачу Мегу - не совсем оптимальный вариант :(
UNO и регистры вполне справятся с задачей

вывод 24-ёх сигналов на 3 ( минимум ) порта - да это быстро , но....
как эти сигналы перед выводом на порты распределить по пинам портов ? сколько команд на это уйдёт ?

регистры : отображаем 24 сигнала управления по битам в переменной int , пишем функцию вывода этого значения в 595 , остальное происходит аппаратно....

а если сигналов управления станет больше ? покупать МегаМегаМега ?
или добавить регистров и допилить функцию вывода этого значения в 595....

это не спор - это ИМХО :)

Архат , твоя библиотека классная !
если бы её сразу в голову залить :) , а то изучать приходится

Maverik
Offline
Зарегистрирован: 12.09.2012

в коллекцию вариантов -  если есть точный перечень цифровых пинов, то можно решить задачу через #define , т.е. полностью сделать дефайн целого блока стандартных функций, иначе можно написать короткую функцию, которой передавать номера пинов  

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Тема ТС-а не как кучеряво можно сдвигать на урезанной УНО, а как на МЕГА сделать короче. Только и вся разница. Вы "не ту" задачу решаете в данный момент. :)

"Исходный код" - лучшая документация. Там в хидерах есть полное описание чего к чему и как пользовать или НЕ пользовать. В т.ч. и допустимые значения параметров прописаны. Если их нет для этого макроса, то значит они у предыдущего, ибо похожи. :)