Команды групповой обработки цифровых входов/выходов
- Войдите на сайт для отправки комментариев
Ср, 18/11/2015 - 12:24
Уважаемые знатоки, имеются ли команды групповой обработки(в описании языка не нашел):
1. Установить группу цифровых входов/выходов в состояние INPUT или OUTPUT?
2. Установить на группе цифровых выходов высокий или низкий потенциал?
Чтобы не писать для каждого пина команды pinMode(), digitalWrite(), digitalRead(). Если нет подскажите, каким компактным способом можно это сделать.
Макросы находятся в io.h и вызываемых из него файлах конкретного проца:
PORTB=0;
PORTD=0xFF;
Чем не устраивают?
Простой путь - с помощью массивов и циклов.
Более сложный - управлять портами через регистры (http://arduino.net.ua/Arduino_articles/Opisanie%20jazyka%20Arduino%20na%20russkom%20jazyke/Manipuljacii%20s%20portami/ http://arduino.ru/Tutorial/Upravlenie_portami_cherez_registry).
Чем сложный-то? Уж не знаю куда проще написать простое присваивание.. один раз выписать для своей машинки связку промеж портов и ножек платы и повесить себе на монитор. :)
Желаете похоливарить ? Извольте: мне проще написать и понятнее прочитать
digitalWrite(PIN_LED,HIGH);
digitalWrite(PIN_MOTOR,HIGH);
нежели
PORTD = B10101000;
// HIGH на цифровых выводах 7,5,3
Все дело в том, что выходов не 4-5 шт, а сразу 24 (на Mega2560) нужно ставить в нужное состояние, по результатам обработки, вот и возник вопрос как экономичнее, грамотнее это сделать, чтобы машинных циклов было минимум, а результат вдохновлял!!!
Как будет выглядеть команда для установки например, 34-54 портов в High?
PORTD = B10101000;
// HIGH на цифровых выводах 7,5,3
для 24-ёх выходов так лучше ( но через несколько портов )
Araris ,
всё правильно написал.... только первый вариант не подходит если нужна синхронность управления пинами
второй вариант это устраняет
но 24 пина.... это запись минимум в 3 порта ( но быстрее , чем digitalWrite(PIN_LED,HIGH); )
24 пина - не проще ли использовать 3 послПараллельных регистра ?
тут надо поаккуратнее, ибо насколько мне не изменяет память порты в Uno и Mega разные, точне данные команды привязаны к разным портам
тут надо поаккуратнее, ибо насколько мне не изменяет память порты в Uno и Mega разные, точне данные команды привязаны к разным портам
но 24 пина.... это запись минимум в 3 порта ( смотря как сигналы по портам распределить )
Как будет выглядеть команда для установки например, 34-54 портов в High?
тут уж точно нужны регистры 595 и SPI....
...зачем Мегу напрягать попиново ?
Как будет выглядеть команда для установки например, 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 (если выход), либо плавающий вход / вкл. подтяжка (если вход).
Вот это ближе к пониманию. Спасибо.
Как будет выглядеть команда для установки например, 34-54 портов в High?
смотри #3 и #10
для включения 48-ми пинов будет шесть ( минимум ) команд
PORTA=0xFF , PORTB=0xFF , PORTC=0xFF , PORTD=0xFF , PORTE=0xFF , PORTF=0xFF ;
через digitalWrite(PIN_1,HIGH); придётся прописать таких операторов 48 !!!!!
и всё-таки - почему не регистры 595 ?
ой ! воспринял что нужно 34....54 ШТ. пинов поднять , а не пины с 34 по 54 Меги :(
...но сути это не меняет :)
забрать у меги 21 пин или 3 пина и добавить 3 регистра ? я за второе...
IgorU , а чем будут управлять эти 21 пин ?
Коммутатор 24 пина, в зависимости от обработки - на аналоговых стоят датчики, в зависимости от состояния датчиков часть пинов становится в High, а остальные нужно сбросить в Low, - дальше исполнительные устройства...
Коммутатор 24 пина, в зависимости от обработки - на аналоговых стоят датчики
тут ничё не понял....
забрать у меги 21 пин или 3 пина и добавить 3 регистра ? я за второе...
про такое - что думаете ?
На Меге собран коммутатор, для управления исполнительными механизмами используются 24 пина. Датчики на аналоговых входах, а исполнители на цифровых. Программно происходит обрботка сигналов датчиков. Так вот, чтобы не писать кучу операторов установки состояния на этих пинах, задан вопрос, как компактнее это сделать. Что не понятно?
Вот это требует расшифровки.
Вот это требует расшифровки.
SU-27-16 говорил про сдвиговые регистры 74HC595 (последовательно-параллельные). Одним пином с Ардуины можно управлять сразу восемью устройствами. Это для пинов-выходов. Для входов есть сдвиговый регистр 74HC165 (параллельно-последовательный).
Спасибо за подсказку ребята, идея с расширением через регистры неплоха, буду изучать.
Jeka_M , не одним , а тремя пинами ( SPI )
и не 8-мью устройствами - а сколько хватит денежков на 74HC595 х 8 :)
IgorU ,
1 - 21 сигналов управления можно отобразить на пины Меги
2 - а можно отобразить на 24 выхода 3-ёх регистров
1 - отжирает у Меги 21 пин ( через прямую запись в порты пинов )
2 - отжирает всего ТРИ пина ( запись в три регистра упрСигналов по SPI )
Это для пинов-выходов. Для входов есть сдвиговый регистр 74HC165 (параллельно-последовательный).
для аналоговых входов - не подходит , тут нужен АНАЛОГОВЫЙ мультиплексор....
Jeka_M , не одним , а тремя пинами ( SPI )
Ага, ошибся.
и не 8-мью устройствами - а сколько хватит денежков на 74HC595 х 8 :)
Имел в виду 8 устройств на один сдиговый регистр. А так да - множим регистры, строим каскады :)
IgorU, статья на этом сайте - http://arduino.ru/Tutorial/registr_74HC595 , ну и гугл рулит.
Спасибо за подсказку ребята, идея с расширением через регистры неплоха, буду изучать.
Самый цинус внешних выходных регистров в том, что писать Вы туда можете как угодно не спешно, а данные на выходах всех регистров появятся одновременно по одному аппаратному сигналу. Такой одновременности на выводах МК добиться нельзя. По входам тоже. Если важен прямой срез времени (одновременность считывания данных), то лучше аппаратной защелки ничего нет. Но тут уже надо понимать тонкости задачи. Поэтому если нужна скорость, то через порты ассемблером, а если одновременность, то через аппаратные регистры любым удобным способом.
Не прочел все что тут понакатали .. идея с расширением сдвиговыми регистрами - не просто "не плохая" а по-настоящему бредовая для Меги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); :)
на вкус и цвет кода нет !
человек спросил - ему показали все варианты... пусть выбирает...
....угу, 24 раза пинать в сдвиговый регистр, предварительно закрыв его на выход
такого не может быть...
Я бы на регистрах делал....
А чтобы не дёргать их ноги с помощью медленных 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
Ага, вот первая ласточка: На регистрах сигнал продвгается последовательно от одной ячейки к другой. Мне нужно получить, например в 7 бите высокий уровень. По логике, высокий уровень во время установки появляется на выходах предыдущих ячеек 1-6. Поскольку исполнители подключены к каждой ячейке, то "дерганья" не избежать (пусть и на короткое время!). Такого мне не нужно. Для индикации еще пойдет, там время изменения невилико и "на глаз" возможно не заметно.
Преимущество в регистрах вижу в том, что устанавливаются нужные биты в "1" или "0" в любой комбинации. Имеется ли в таких регистрах механизм смены уровней ТОЛЬКО ПОСЛЕ УСТАНОВКИ всего байта? Пин 12 ST_CP(Синронизация выходов) - это оно??? А если их каскад, то как, прогоняем все байты по всем регистрам, потом сигнал ST_CP в "1"?
Этот вариант больше нравится. Не хочется усложнять схему дополнительным логическими элементами, поэтому и выбрана Мега, т.к. имеет большое количество входов/выходов!
Так я вас так и понял, что есть 24 ноги и хочется написать "дешево и сердито", а не дублировать 224 команды .. вот и предложил: подберите пины из полных портов .. кстати порты "A" и "C" кажется 22 .. 38 ноги меги - как раз идут "подряд". там xmem интерфейс сидит. 16 ножек точно подряд идут.
Да, имеются. Регистры с трех-стабильным выходом созданы специально для таких операций: отключаете выхода парралельной части, загоняете новое значение сдвигами и открываете выхода на вывод. Итого 10 операций на запись одного байта.
При подборе ножек по портам у вас 3 операции.
Каждая команда на 16Мгц - это 62.5 наносекунды. То есть 3-я командами вы проставите свой коммутатор за 190нс = 0.19мкс. А 26-ю .. соответственно за 26*62.5нс. Цена "сдвигового регистра". Цена библиотеки Wiring (digitalWrite) - около 20 команд реального исполнения на КАЖДЫЙ сдвиг.
Arhat109-2 - ОК, спасибо. Прочитал вашу статью скачал библиотеку "ARHAT", пытался в IDE с помощью МЕНЮ вставить в скетч, #include "arhat.h" - не появляется, вставляется пустая строка, что-то не так??? Все другие библиотеки таким образом прописываются нормально, у некоторых 4-5 файлов ***.h. Не хватает какого-то файла описания или что? Какой там(в IDE) механизм?
? Нормально вставляется. С ней активно работает уже человек 10 - точно. Это с кем периодически общаюсь. Один из пользователей уже положил её в гитхаб, вот сюда: https://github.com/dimanus/AVR_LIB_AUTOMAT
можно брать оттуда. Но там, в транке - текущая версия, может быть коммит, не тестированный ни разу..
попробуйте руками распаковать либу в ваш каталог скетчей в подкаталог /libraries .. свой подкаталог /Arhat оно должно создать самостоятельно. Я сейчас не могу посмотреть и/или что-то потестировать в силу очередной перестановки компа и всего ПО на нем .. неделю назад погорела очередная мамка. А там .. да за многа лет программирования .. :(
Как сейчас .. только что закоммитил возврат к управлению режимами либы по многочисленным просьбам .. и там ещё лежит начало распиновки под промини проц .. незавершенное. :)
Качал отсюда: http://cyber-place.ru/showthread.php?t=1909. Нет не ставит... Может есть другой ресурс с актуальной версией?
Там актуальная версия. Воткните ручками первой командой скетча #include "arhat.h" и посмотрите скомпиляет или куда..
Вставил "ручками". Сообщение об ошибке, не находит каталог(файл):
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, а в Вашей нет. Можно к стандарту привести этот косячок? Не критично, но все же...
Это не "стандарт". И в этой либе нет *.cpp поскольку С++ не используется. Так что ответ: "нельзя" ибо нечего. :)
ОК! Спасибо за библиотеку, все здорово! Тестирую операторы ...
Для дальнейшего обсуждения, приглашаю сюда: http://arduino.ru/forum/programmirovanie/arduino-kak-konechnyi-avtomat-z...
тема создана специально под либу. Или на почту.
#27 - Мне нужно получить, например в 7 бите высокий уровень. По логике, высокий уровень во время установки появляется на выходах предыдущих ячеек 1-6.
Не так работает регистр...
?!? А как? :)
Есть сдвиговые регистры с обычным выходом и есть трехстабильные .. первые именно так и работают. А вторые могут работать И так и иначе.
Только для того чтобы было иначе, надо сначала перевести выходы в третье состояние отдельной командой, потом подвигать данные в регистр 8 раз, и потом тольк открыть выходы снова отдельной командой. Итого 10 операций .. и это ещё без дублриующего байта данных в памяти. Поскольку если надо изменить состояние только одного бита, то:
1. Достать копию содержимого из памяти
2. логически (И/ИЛИ) изменить состояние требуемого бита
3. сохранить копию в памяти
4. закрыть регистр .. и далее ещё 9 команд.
Итого 13 операций ... вместо одной: "Записать значение в порт" .. и это при 70-и свободных ногах платы. Класс. :)
текст не про то - что лучше , а про регистр 74HC595....
регистр на выходах держит код до окончания записи в его сдвиговый БУФЕР нового значения - потом с буфера все 8 бит одновременно записываются в выходной каскад ( никаких изменений на выходе во время сдвигов НЕТ )
решать ТС-у как реализовать....
но брать под эту задачу Мегу - не совсем оптимальный вариант :(
UNO и регистры вполне справятся с задачей
вывод 24-ёх сигналов на 3 ( минимум ) порта - да это быстро , но....
как эти сигналы перед выводом на порты распределить по пинам портов ? сколько команд на это уйдёт ?
регистры : отображаем 24 сигнала управления по битам в переменной int , пишем функцию вывода этого значения в 595 , остальное происходит аппаратно....
а если сигналов управления станет больше ? покупать МегаМегаМега ?
или добавить регистров и допилить функцию вывода этого значения в 595....
это не спор - это ИМХО :)
Архат , твоя библиотека классная !
если бы её сразу в голову залить :) , а то изучать приходится
в коллекцию вариантов - если есть точный перечень цифровых пинов, то можно решить задачу через #define , т.е. полностью сделать дефайн целого блока стандартных функций, иначе можно написать короткую функцию, которой передавать номера пинов
Тема ТС-а не как кучеряво можно сдвигать на урезанной УНО, а как на МЕГА сделать короче. Только и вся разница. Вы "не ту" задачу решаете в данный момент. :)
"Исходный код" - лучшая документация. Там в хидерах есть полное описание чего к чему и как пользовать или НЕ пользовать. В т.ч. и допустимые значения параметров прописаны. Если их нет для этого макроса, то значит они у предыдущего, ибо похожи. :)