Аккуратная инициализация 595-го сдвигового регистра

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Если ошибся разделом, поправьте, кто может.

На соседнем форуме возник вопрос, как в момент включения питания «придавить» 595-ый сдвиговый регистр, чтобы на его выходах не было свистопляски на то время, пока ардуина не «прочухается» и не установит ему нужные значения.

Классический расово-верный подход: притянуть пин OE (13-ый пин сдвигового релистра) к питанию внешним резистором. Тогда на нём при включении питания появится высокий уровень и все выходы регистра окажутся в высокоимпедансном состоянии. А когда правильные значения будут установлены, подать на пин OE низкий уровень и спокойно работать.

Но такой подход требует лишнего пина, а пины – ресурс дефицитный – жаба душит! Обычно народ тупо заводит OE на землю. Но тогда – между включением питания и инициализацией регистра свистопляска на его выходах обеспечена.

Хочу показать. Как это можно сделать без использования лишнего пина.

Собираем такую схему (я физически не собирал – моделировал в протеусе):

В момент включения питания (тумблером) конденсатор разряжен и потому напряжение на правой (по рисунку) обкладке конденсатора сразу же подскакивает практически до напряжения питания (появляется тот самый HIGH, который нам нужен, чтобы выходы сдвигового регистра оказались в высоимпедансном состоянии). По мере зарядки конденсатора, напряжение на правой обкладке спадает до нуля и тогда с регистром можно работать. Фокус в том, чтобы успеть проинициализировать регистр за то время, пока там держатся HIGH. А для того, чтобы успеть, нужно знать сколько у нас времени. 

Слава Богу, время, которое там продержится HIGH рассчитать нетрудно. LOW на выходе появится тогда, когда напряжение упадёт до 0,3 от напряжения питания. Т.е. время здесь приблизительно равно постоянной времени.

T = C1 x R2

Если С1 в микрофарадах, а R2 – в килоомах, то время получится в миллисекундах.

Таким образом, при тех номиналах, что у меня на схеме, время получается 0,22*10 = 2,2 миллисекунды.

Собственно всё. Проверяем в протеусе. Осциллограмма в момент включения:

Здесь клетка по вертикали соответствует 0,5 вольта, а по горизонтали – 1 миллисекунде. Линии HIGH и LOW нарисованы на 3В и 1,5В соответсвеено (см. даташит на ATmega328P, разд. 30.2, стр. 313)

Как видите, время более или менее правильное.

Это приём можно применять везде, где нужно установить пин в некоторое состояние на некоторое время. например, именно так «нажимает на reset ардуины» микросхема CH340 в китайских «Нанах».

b707
Offline
Зарегистрирован: 26.05.2017

Евгений, 2.2 мс явно ОЧЕНЬ мало. На практике "холодная" загрузка Нано занимает не 2-3 - а сотни миллисекунд. Если бы выходы 595 находились  в случайном состоянии всего пару мс - никто бы этого и не заметил. А так при включении четко видно, что случайные выходы сдвигового остаются включенными значительное (по меркам МК) время - имхо десятые секунды.

Если надо - могу провести натурный опыт, у меня валяется планка с двумя 595 и светодиодами на выходах.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Так формула ж приведена, кому сколько надо, тот столько и посчитает. Нужны сотни миллисекунд - ставим десятки микрофарад да и резистор можно побольше (до полусотни-сотни килоом мне кажется, нормально).

b707
Offline
Зарегистрирован: 26.05.2017

ЕвгенийП пишет:

Так формула ж приведена, кому сколько надо, тот столько и посчитает.

ну так-то да :) Просто раз тема в Песочнице, логично для примера использовать близкую к реальности постоянную времени :)

Будет время на выходных - померяю. сколько знаимает старт Нано от подачи питания до инициализации выходов 595 регистра... если это кому-то интересно.

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Мне интересно

bwn
Offline
Зарегистрирован: 25.08.2014

Так вроде, на разных загрузчиках, разное время, или не?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

ну, я во, никогда не ставлю загрузчики в готовое изделие, так что меня интересует инициализация самого контроллера и не более того. А там как раз единицы миллисекунд, а то и меньше. Отсюда и мой пример на 2 мс.

А так вообще, ну разное, и что? Под своё издели подбираешь правильный конденсатор и пользуешь.

ВН
Offline
Зарегистрирован: 25.02.2016

Ставить 595-е регистры и при этом испытывать недостаток одного пина для управления ОЕ представляется очень надуманной ситуацией.

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

Предложенный вариант не годится на все случаи жизни, бо входное напряжение отнюдь не функция Хевисайда, а как повезет.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

ВН пишет:
входное напряжение отнюдь не функция Хевисайда, а как повезет.
"Жизнь такова, какова она есть, и больше - никакова" :(

Когда я как-то процитировал эту фразу в компании двух американцев, с которыми мы топили в пиве выездное поражение Акул от Далласа, повисла пауза с минуты две, потом один из них спросил "What did you say? Kinda fucking zen?" и пока я думал, что ответить, другой ему ответил: "This should be a Russian code for "Shit happens"" :)

Dinosaur
Dinosaur аватар
Offline
Зарегистрирован: 01.01.2018

Прошу прощения за некропостинг, а какова роль R1 в этой схеме?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Dinosaur пишет:

Прошу прощения за некропостинг, а какова роль R1 в этой схеме?

Чтобы при выключении питания конденсатору было куда разряжаться. Если этот резистор убрать, то, после выключения питания, конденсатор будет оставаться заряженным весьма продолжительное время. Он, конечно, будет разряжаться, но очень медленно. Тогда, при повторном включении питания, схема не выполнит своего предназначения, т.к. её суть в том, что HIGH попадает на OE на время зарядки конденсатора, а если он уже и так заряжен, то HIGH туда не попадёт.

Dinosaur
Dinosaur аватар
Offline
Зарегистрирован: 01.01.2018

Спасибо за разъяснение, про это я совсем не подумал.

rkit
Offline
Зарегистрирован: 23.11.2016

ЕвгенийП пишет:

Таким образом, при тех номиналах, что у меня на схеме, время получается 0,22*10 = 2,2 миллисекунды.

Для входов стандартной логики нельзя использовать такие заваленные фронты - это вызывает тонны проблем на практике.

https://www.ti.com/lit/an/scba004d/scba004d.pdf

Alexey_Rem
Offline
Зарегистрирован: 09.09.2019

По-моему использование входа MR(10 нога) куда продуктивнее

Green
Offline
Зарегистрирован: 01.10.2015

А если выходы 595 активны нулём?

Dinosaur
Dinosaur аватар
Offline
Зарегистрирован: 01.01.2018

Alexey_Rem пишет:

По-моему использование входа MR(10 нога) куда продуктивнее

Вот только она сбрасывает регистр, но не защелку... Потом CLK необходимо дёрнуть чтобы до защелки нули на выхода дошли