Работа со сдвиговым регистром 74HC595
- Войдите на сайт для отправки комментариев
Здравствуйте!
Начал осваивать сдвиговый регистр. Подключил к нему три светодиода. Пока играюсь с вкючением и выключением питания с ножек, вот скетч:
#include <Shift595.h> #define dataPin 8 #define latchPin 9 #define clockPin 10 #define numOfRegisters 1 Shift595 Shifter(dataPin, latchPin, clockPin, numOfRegisters); void setup() { pinMode(12, OUTPUT); digitalWrite(12, LOW); } void loop() { // put your main code here, to run repeatedly: Shifter.setRegisterPin(0, LOW); Shifter.setRegisterPin(1, LOW); Shifter.setRegisterPin(2, LOW); Shifter.setRegisterPin(3, LOW); Shifter.setRegisterPin(4, LOW); Shifter.setRegisterPin(5, LOW); Shifter.setRegisterPin(6, LOW); Shifter.setRegisterPin(7, LOW); }
Проблема, с которой я столкнулся - при подаче питания на плату Arduino все светоиоды кратковременно моргают, потом сразу гаснут, то есть на вход оегистра прилетает импульс. Подскажите, пожалуйста, как избавиться от этого эффекта. Выход OE на регистре подключен к земле, то есть все входы всегда включены. Пробовал подключать к шине 5V, тогда ничего не работает, светодиоды никогда не загораются, даже если отправить через set.Register команду HIGH. Пробовал данный контакт подключать к Arduino и в setup написать digitalWrite(pinOE, LOW). Но все равно проблема осталась.
Подсоедините ОЕ регистра через резистор ~10К к напряжению питания и напрямую к выходу Arduino. В нужный момент подать LOW.
Спасибо большое!
Подключил к 5V через резистор 10 кОм и к 12 выходу Arduino.
Написал такой скетч:
Все заработало! При включении нет промаргивания светодиодов.
Вновь подниму тему: Сделал все как описал выше. Теперь при подаче питания на плату Arduino не прилетают импульсы на выходы регистра. Но стоит подать с Arduino значение LOW на пин, подключенный на вход регистра OE (в любом месте программы), как проблема возвращается: кратковременно мерцают все светодиоды на регистре.
Можно как-нибудь полность избавить от этого эффекта, не только при подаче питания?
Чтобы ПОЛНОСТЬЮ избавиться от эффекта есть два способа: щадящий и радикальный.
Щадящий заключается в том, чтобы отключить от питания светодиоды.
Радикальный - отключить от питания всю ардуину.
Вообще-то нужно сначала установить на выходах регистра желаемые значения, а только потом активировать его по OE. Собственно, ОЕ только затем и нужен, чтобы подключать выходы регистра, а чтобы там были нужные данные - Вы сами должны заблаговременно позаботиться.
И еще, какая-то у Вас некрасивая инициализация регистров. Обычно пишут примерно так:
либо вообще упрятать данные в один байт:
А если мне нужно, чтобы при подаче питания (включении Arduino) один светодиод загорелся (на первом пине регистра), через какое-то время я на пульте кнопку нажал - второй светодиод загорелся (на втором пине регистра) и т.д. При этом, чтобы другие светодиоды при обращении к первым двум никак не реагировали, пока я их Shifter.setRegisterPin не вызову.
Процедура включения светодиодов на регистре с пульта уже написана, нужно исключительно избавиться от эффекта кратковременного мерцания при подаче LOW на OE и при подаче питания на Arduino.
Такая схема может быть реализована на сдвиговом регистре?
Заранее благодарен!
Из третьего поста я понял, что одна проблема решена, но осталась другая, правда, не понял, какая. Теперь уже вообще перестал что-либо понимать: что делаете, как делаете, что из этого получается, и чем это отличается от желаемого.
Есть подробная инструкция по работе со сдвиговым регистром: https://www.arduino.cc/en/Tutorial/ShiftOut
Начните с нее. Если этого окажется недостаточно, продробнее опишите, как подключаете и как программируете.
Для упрощения ситуации имеем вышенаписанный скетч. То есть после подачи питания на плату Arduino нужно, чтобы загорелся светодиод, подключенный к пину 0 на регистре. Что имеем: при подаче питания на плату кратковременно промаргивают все светодиоды, подключенные к регистру, а затем загорается постоянно светодиод, подключенный к 0 выходу.
Как мне поправить скетч, чтобы избавиться от промаргивания, а при подаче питания просто загорался только нужный светодиод, как это было бы, если светодиоды были подключены напрямую к Arduino?
У регистра есть ещё такой " волшебный" вход:
Надеюсь понятно что с ним надо сделать в первых строках сэтапа.
Так в моем скетче к 12 пину Arduino как раз подключен вход OE регистра, и я делаю его активным, подавая low, но получается, что на мгновение активизируются все выходы регистра, а потом уже начинает работать программа. Мне нужно избавиться от мгновенного промаргивания во время подачи питания на плату.
Ну так вы в сэтапе первым делом сделайте его ХАЙ чтобы отключить моргание!
Не забыв сначала сделать его оутпутом, а то получится включение резистора подтяжки.
А ещё дучше резистор 4к7 - 10 К на питание подвесить.
Если первым делом сделать HIGH на 12 выход, то выходы регистра не включаются даже после принудительного включения пина, например, Shifter.setRegisterPin(0,HIGH);
Получается, что в этом случае ничего не работает. Кстати, 10К резистор к питанию у меня используется.
Нужно сначала сделать HIGH на OE,
Затем занести нужныен данные в сдвиговый регистр,
И только потом делать на OE LOW.
Да. И это должно быть очевидно.
Скажу больше- если туда подавть сигнал ШИМ с AnalogWrite то получится управление яркостью светодиодов.
Итак! Сейчас у меня во такой скетч. В самом начале подаю HIGH на OE, записываю данные в регистр (все светодиоды выключены), затем подаю LOW на OE. По идее, при запуске программы ничего гореть не должно, так и просходит. Но все равно пролетает промаргивание! Уже не знаю что делать, может это все же аппаратная особенность регистра? Или что-то поправить мне надо скетче?
А так моргает?
Нет, с таким скетчем не моргает. А что это означает?
А это значит :
С выключением выходов регистра всё в порядке, как и должно было быть.
Теперь добавляйте всё то что вы хотите с ним делать.
Спасибо большое!
Вот с таким скетчем все заработало как надо!
1. Одна команда для очистки всех регистров : clearRegisters();
2. И вроде включать в сэтапе выход очищенного регистра нет смысла- просто лишняя команда, и так всё выключено по OE.
3. А если это светодиоды- то как раз использовать AnalodWrite (OE, 0) для гашения и всёчто больше "0" для яркости.
Спасибо!
Еще вопрос есть, не совсем по теме, но есть общее.
К 13 пину у меня подключен светодиод, соответственно, при подаче питания на Arduino этот светодиод промаргивает, а потом гаснет, так как в setup у меня прописано pinMode (13, LOW). Все это происходит из-за того, что параллельно ему подключен светодиод на плате Arduino.
Как отключить промаргивание на 13 пине?
Заранее благодарен!
Можете в сетапе ничего не делать.
Диодом моргает загрузчик.
Он сам потухнет после окончания работы загрузчика- станет обычным входом.
Отключить загрузчик можно.
Это лечится фьюзом, но тогда вы не сможете программировать без программатора.
Зато получите мнОООООООго памяти ;)
З. Ы. А может есть и неморгающие загрузчики.....
Кстати 13 - это сигнал CLCK на хардварном SPI...
Как отключить промаргивание на 13 пине?
подумать, что можно "посадить " на 13 пин, чему промаргиваение не дудет мешать и выпаять LED, или смотрите пост 21 выше...
Как отключить промаргивание на 13 пине?
сотри или модифицируй загрузчик.
сотри или модифицируй загрузчик.
шеф, похоже ТС не в состоянии это сделать, куда проще ничего на ногу не вешать... а вообще в природе существует много разных готовых загрузчиков, но для экспериментов нужен программатор (сразу высоковольтный) или много МК - жертвы эксперимента
Доброго времени суток. Подскажите уважаемые знатоки, а можно ли, и как, при использовании сдвигового ригистра, байт (0b00000000) отправляемый на него формировать с переменных, значение которых изменяется в результате нажатия кнопки, т.е. 1 или 0.
Доброго времени суток. Подскажите уважаемые знатоки, а можно ли, и как, при использовании сдвигового ригистра, байт (0b00000000) отправляемый на него формировать с переменных, значение которых изменяется в результате нажатия кнопки, т.е. 1 или 0.
улыбнуло, как только поймете как работает кнопка и чего вы хотите - сразу получите ответ. подсказка, нарисуйте временную диаграмму работы системы.
Смущает выражение, «в результате нажатия кнопки» в единственном числе.
UPD, конечно можно :)
Всем доброго времени суток. Знатоки, подскажите, а как при использовании этой библиотеки shift595.h обращаться к пинам 2-го или 3-го регистра, если их подключать два или три соответственно? Или где найти описание библиотеки, второй день не могу найти.
Заранее благодарен.
У меня вот какая еть проблемка. На 7 пине регистра стоит пищалка. Вот даю команду:
Иногда срабатывает. А иногда виснет (и пищит постоянно). Из-за чего - не пойму.
И ещё вылезла ОООЧЕНЬ БОЛЬШАЯ проблемма. После того как команда выполнена у меня в порт (для компа) отправляеться OK. Сейчас тоже отправляеться, но перед этим сначала отправляться стали несколько пустых строк. В чём может быть проблемма?
Здравствуйте! возник вопрос, делал код такой как у автора, одна и та же библиотека, вот подскажите, как задействовать еще+3 выхода ардуино для еще одного регистра, не собирая последовательно, а именно еще 3 выхода. Возможно ли так? Вопрос возник из необходимости подключить 150 светодиодов как минимум, лучше 300, которыми нужно командой Shifter.setRegisterPin(1, HIGH); управлять, пробовал управлять Shifter.setRegisterPin(15, HIGH); подключив 2 регистра, библиотека увы не умеет добавлять сама номера Shifter.setRegisterPin(1-300, HIGH); например. Может возможно библиотеку как то доработать что бы просто вписать туда если количество регистров=2 при выборе в #define numOfRegisters 2 или #define numOfRegisters 10 то и появлялись бы пины 1-300. Какие еще есть способы поштучно включить 300 диодов, обошёл весь поиск и искать пришлось днями и сутками, набрёл на ваш форум, знает ли кто? Спасибо за ответы если кто знает.
друзья, придумал сам как сделать разветвление регистров каждый на 3 провода, что дало возможность управлять ими !!! каждым светодиодом отдельно каждой ножкой, теперь это возможно для примерно 120 светодиодов на MEGA2560, когда там предел для цифровых выходов был бы 54 выхода, если удалось бы еще 6 аналоговых сделать цифровыми то вышло бы из 60 цифровых выходов 160 выходов на диоды либо 160 цифровых выходов. но и 120 диодов при 8 битах ниже код покажу, сэкономит многим многие дни поиска решения, но так и не решил вопрос на 64 бит сделать на данном примере или даже на 16 бит на данном примере ничего не удаётся, код если кому нужен - очень простой, дальше из кода разберется каждый как добавить следующий регистр там всё написал
самый главный вопрос, как добавить 2й сдвиговый регистр паровозом? как их прицепить отдельно теперь я сделал код, а как сделать их в каждом по 2 регистра 16 бит управляя отдельными ножками, если сделаю расскажу сам, может есть знатоки?
друзья дополню тему сдвиговых регистров! успешно подключил и удалось управлять 16 ножками - 16 бит паровозиком на 16 бит
код тем, кто сэкономит долгие трудные часы и дни решения вопроса, разобрался изучив библиотеку, и удалось получить способ управления любой ножкой диода в паровозиках и в линиях по 3 провода паровозики расставив линиями, для mega2560 выйдет примерно 17 линий по 3 провода для 51 цифрового выхода, на каждую удастся паровозик либо 1 регистр ставить и управлять любым светодиодом 1 регистр - 136 выводов, 2 регистра - 272, 3 регистра - 408, 4 регистра - 544, 5 регистров - 680, 6 регистров - 816, 7 регистров - 952, 8 регистров - 1088, 9 регистров - 1224, 10 регистров - 1360, если паровозик потащит 11 регистров и выше то пинов еще добавится, если кому мало то еще +3 провода добавить возможно и сделав аналоговые выводы цифровыми.
у кого нет MEGA2560 могут добавтиь 2$ при покупке с небольшой памятью ардуин и получить 256кб памяти за 7$
на 17 линий по 3 провода возможно установить примерно 1224 светодиодов, используя лишь свдиговые регистры. Это означает 1224 цифровых выводов у MEGA2560 если она потянет по 10 регистров на линию, нужны тесты. 2 регистра на линию тянет, это не менее 272 вывода, уже протестировано на 1й линии и 2й линии которые управляют диодами.
код
для добавления новых ножек добавив новые регистры
// это будет как 1 микросхема на 80 ножек например для ситуаций где не понадобится супер скорость этого будет достаточно, а MEGA2560 получит до 1360 ножек, возможно больше если кто добавит больше ножек напишите, выше описаны все способы управления отдельной ножкой - на линии по 3 провода и в паровозике, не забывайте о правильной схеме подключения регистра, 2 земли 2х5в. вагончики сцепляются общим для всех CLOCK общим для всех LATH и друг за друга цепляются Q7' земля на ножках 8+13, 5в на ножках 10+16 всем спасибо кто изучает данный вопрос.
1. Непонятно, зачем здесь вообще нужна библиотека. Библиотеки, как правило, пишутся для того, чтобы упростить работу с каким-либо устройством. Управление же сдвиговым регистром настолько просто само по себе, что наличия дополнительной библиотеки не нужно.
2. Каскадное включение сдвиговых регистров - стандартная практика, прекрасно описанная в литературе, что к этому еще можно добавить - непонятно.
3. MYFRIEND, Вам бы следовело ознакомиться с таким понятием как циклы. Без них код получается просто неприличным.
4. Наиболее простой, радикальный и БЫСТРЫЙ (!) способ подключения большого количества сдвиговых регистров - повесить их все каскадом на аппаратный SPI. Скорость получается примерно в 100 раз выше, чем при использовании shiftOut(). Да и лишние ноги не тратятся, тот же SPI можно использовать и для других устройств.
PS. Да, на всякий случай: один вызов shiftOut() занимает примерно 180-190 мкс. Для каскада из 10 регистров - соответственно под 2 мс, что, скажем, для программного диммирования уже критично. Так что еще раз хотел бы подчеркнуть, что при большом количестве регистров наилучший способ подключения - аппаратный SPI.
Добрый день. Воспользовался библиотекой примером и библиотекой из первого поста Схема подключения:
Только пины на ардуине другие. Если это важно то 11,12,13.
Так вот при подаче питания на конктерную ногу
На ножка 74hc595 абсолютно рандомные значения, иногда сразу все включены, иногда чать выключена, часть включена, менял 74hc595 не помогло. Где-тоя что-то упускаю. Единственное что показания я снимаю через мультиметр, т.е. к 74hc595 ничего не подключено!!! Возможно стоит подключить какую-то нагрузку? Светодиоды?
andriano Большое спасибо вам за советы! Точнее не посоветовать! Подскажите на ваш взгляд удачный пример SPI подключения сдвиговых регистров, нужно нацепить их не много не мало 172 выхода через них пропустить, справится SPI ? и быстрее выйдет ?
SPI справится. Задачу опишите детально, иогда можно будет обсуждать конкретно.
MYFRIEND, сдвиговые регистры - достаточно быстрые устройства - гораздо быстрее, чем Ардуина. Здесь условно можно ориентироваться на скорость обмена 4 МГц. Т.е. для Ваших 172 выходов максимальная частота обновления будет 4000/172=23 кГц. Разумеется, при условии, что не будет проблем с других сторон: не будет длинных соединительных проводов, и будет обеспечено стабильное питание для всех микросхем и т.п.
Как менять к примеру по нажатию кнопки изменить только один бит в переменной? Несколько кнопок, чтоб каждая кнопка менял только один бит, а остальные оставляла не изменными. Индикация кнопок, кнопки титанового велосипеда, при использовании For не чего не работает.
int fff = B00000000;
shiftOut(dataPin, clockPin, MSBFIRST, fff);
... при использовании For не чего не работает.
int fff = B00000000;
shiftOut(dataPin, clockPin, MSBFIRST, fff);
Во-первых, я не вижу здесь никакого for.
А во-вторых, все работает - в переменной fff теперь установлен в единицу 2-й разряд. Чего ж Вам еще нужно?
Во-первых, я не вижу здесь никакого for.
А во-вторых, все работает - в переменной fff теперь установлен в единицу 2-й разряд. Чего ж Вам еще нужно?
Несколько кнопок с различными вариантами нажатий. Три одновременно, удержание и т.д. Если все 8 бит задавать на каждую кнопку с условиями нажатий других кнопок, то это капец.
Пример с For не стал приводить, он блокирует все кнопки и двигателя.
К примеру чтоб каждая кнопка меняла только один бит, каждая кнопка меняет только один свой бит из восьми. Не все восемь переписывала, а только один. Другие биты меняются другими кнопками.
Понял, можно так менять отдельно биты:
Только |, а не +. И вообще, открой перечень операторов и изучи - куча вопросов исчезнет.
Только |, а не +. И вообще, открой перечень операторов и изучи - куча вопросов исчезнет.
поддерживаю, битовые операторы штука полезная
тут вроде нормально написано, по простому https://learnc.info/c/bitwise_operators.html
и маленький вопросик, я его выделил
Как менять к примеру по нажатию кнопки изменить только один бит в переменной? Несколько кнопок, чтоб каждая кнопка менял только один бит, а остальные оставляла не изменными. Индикация кнопок, кнопки титанового велосипеда, при использовании For не чего не работает.
int fff = B00000000;
shiftOut(dataPin, clockPin, MSBFIRST, fff);
что у вас за переменная? 1 или 2 байта - вы как-нибудь определитесь int или byte
При подключении светодиодов на прямую к кнопкам для индикации нажатой кнопки. Как сделать правильно, вот так?
Я обычно использую цепочку: +5В-резистор-светодиод-контакты-земля. Сигнал на входной пин подается из точки соединения светодиода и контактов. В принципе, если включить встроенную подтяжку, схема будет почти как на рисунке выше, только обратной полярности (замкнутая кнопка, как и положено, дает логический ноль).