Часы на основе высоковольтного шифт-регистра supertex HV5222 и борьба с мерцанием.
- Войдите на сайт для отправки комментариев
Добрый день, коллеги.
Изучаю МК, совсем начинающий, чтоб был стимул, решил сделать часы на индикаторных лампах, в основном в учебных целях.
Делать решил на шифт-регистре supertex HV5222 (32 порта, коммутирует 0, высоковолтьтный).
описание http://ww1.microchip.com/downloads/en/DeviceDoc/HV5222%20B072213.pdf
Возникла проблема, по завершении цикла загрузки последовательности бит в регистр, светодиоды или лампы, подключенные к выходам, которые долждны быть закрыты, вспыхивают на очень короткое время.
С портом DE, который как я думал и должен это регулировать, я игрался - и к GND его притягивал, и к + питания, и в воздухе оставлял болтаться - пофиг, на мерцание это не влияет.
Ниже прилагаю код, подключение думаю из него понятно, если что еще надо, дополню. Код должен гонять по кругу огонек, в принципе работает.
Вопрос собственно такой - это я с кодом что-то намудрил, или с железом, или вообще это его нормальное поведение ? И конечно коронный вопрос - что делать ? Мне что-то в голову ничего не приходит ..
void setup() { pinMode(4, OUTPUT);//strobe PD4 pinMode(6, OUTPUT);//clock PD6 pinMode(8, OUTPUT);//data PB0 } void loop() { for (int x = 1; x <= 32; x++) { PORTD &= ~(1 << 4); строб-защелка 0 for (int i = 1; i <= 32; i++) { if (i == x) { PORTB |= _BV (0); } else { PORTB &= ~_BV (0); } PORTD |= (1 << 6); // (arduino 6) даем 1 затем 0 на клок PORTD &= ~(1 << 6); // (arduino 6) } PORTD |= (1 << 4); // (arduino 4) строб-защелка 1 delay(100); } delay(1000); }
С портом DE, который как я думал и должен это регулировать, я игрался - и к GND его притягивал, и к + питания, и в воздухе оставлял болтаться - пофиг, на мерцание это не влияет.
Там ещё STR есть. Насколько я понял, он зажигает все лампочки, даже когда OE в нуле.
Нужно подать единицу, и на OE и на STR.
этот регистр отличается от 595.
STR у меня и так есть, это strobe, в коде видно
а OE здесь нет, вместо него DE, но насоклько я понял из датащита, функции отличаются
========
Хочу добавить, из моего сообщения может не очевидно.
Регистр работает, огонек по светодиодам по кругу бегает, проблема именно в том, что остальные светодиоды подмигивают на каждый цикл записи в регистр
cyrax73, вас не понять. Даёте даташит на свой чип, но сигнала OE , который описан в нём, почему то у вас нет. Значит это не от него даташит?
да, прошу прощения, перепутал, здесь OE. Датащит тот. Долго гуглил, путаюсь уже в разных регистрах ..
но это ничего не меняет, как я и писал, я не понимаю, что еще с ним сделать.
если притянуть его к +, огонек по светодиодам бегает, но мерцание остается (т.е. один светодиод зажигается, которому положено, и в этот момент все остальные легонько на доли секунды вспыхивают)
если притянуть к GND, то они не зажигаются вообще, но мерцание опять остается.
cyrax73, тут нужно детально разобраться что это за мерцание такое. В какой момент оно начинается, в какой заканчивается. Одновременно ли появляется единица на выходах, или этот всплеск последовательный. Может попробывать задействовать сигнал STR А может есть смысл сделать отладочный скетч, в котором каждая команда выполняется только после нажатия на кнопку. Чаще всего глюки бывают из-за того, что допустимые тайминги устройства и контроллера не совпадают. Вряд ли кто пользовался таким чипом и имеет опыт, так что рассчитывайте на собственные силы.
Тоже прошу прощения - могу ошибаться, подробно не разбирался.
Но насколько я понял, STR там используется совсем по-другому. Во всяком случае, на картинке в даташите никакой защёлки я вообще не вижу.
Попробуйте, всё-таки, подать на STR постоянное значение, и больше вообще не дёргать.
-----
Upd: Попробуйте добавить, например, delay(2000) перед строкой PORTD |= (1 << 4). Всё сразу станет понятно. :)
Разобрался, никакой защёлки там нет. Данные со сдвигового регистра подаются сразу на выход.
Из-за этого, возможно, будет заметно небольшое мерцание "лишних" светодиодов в момент вдвигания данных в регистр. Вот тогда действительно может пригодиться этот OE - можно будет на время сдвига просто гасить все выходы одновременно.
Благодарю за ответы, и за попытки помочь. Постораюсь в ближайшее время (надеюсь, завтра смогу) проверить все приведенные советы, и отпишусь.
Уважаемый Datak, похоже вы совершенно правы. выше код, как то коряво вставляется, в самое начало ..
PORTD 3 - data
PORTB 0 - clock
а строб поднят в 1 еще в сетапе.
Так все работает. Т.е. те ноги, куда записываем 0, не мерцают. Правда ноги, где был записан 1 до записи данных в регистр, и куда снова записали 1, опять мерцают, но очень коротко. Но если раньше мне казалось я хоть примерно понимаю, как это все работае, то теперь я вообще ничего не понимаю. Для чего здесь вообще strobe ? Как регистр понимает, что загружены все данные ?
cyrax73, в 595 микросхеме, на самом деле, два регистра - сдвиговый, в который данные вдвигаются по сигналу clock, и ещё один, в который данные из сдвигового регистра параллельно копируются по сигналу strobe. Этот, второй, подключен к выходам микросхемы.
В вашей HV5222 второго регистра нет, а к выходам подключен сам сдвиговый регистр, напрямую. Значит, сигнал strobe здесь просто не нужен.
если раньше мне казалось я хоть примерно понимаю, как это все работае, то теперь я вообще ничего не понимаю. Для чего здесь вообще strobe ? Как регистр понимает, что загружены все данные?
Да так же всё работает, абсолютно. Все данные загружены тогда, когда вы их загрузили - то есть вдвинули в регистр 32 бита. :)
А strobe здесь совсем для другой цели. Он просто зажигает все светодиоды одновременно. Для чего это может понадобиться - я не знаю - разработчикам микросхем видней, наверное. :)
С мерцанием побороться скорей всего можно, но надо понять, почему оно появилось. Я там писал выше - мне кажется, будет достаточно отключать выходы на время сдвига.
Получится примерно то же что в первом варианте программы, только вместо сигнала STB нужно подключить к тому же выходу ардуины сигнал OE.
Кажется так, если я нигде не перепутал нули с единицами.
Добрый день.
Работаю сейчас с этим чипом, вопрос: логика, если я все правильно понял, у него 12в, верно?
Самая верхняя таблица на стр. 3 даташита ни о чём не говорит? Там же, вроде, всё написано.