Аккуратная инициализация 595-го сдвигового регистра
- Войдите на сайт для отправки комментариев
Если ошибся разделом, поправьте, кто может.
На соседнем форуме возник вопрос, как в момент включения питания «придавить» 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 в китайских «Нанах».
Евгений, 2.2 мс явно ОЧЕНЬ мало. На практике "холодная" загрузка Нано занимает не 2-3 - а сотни миллисекунд. Если бы выходы 595 находились в случайном состоянии всего пару мс - никто бы этого и не заметил. А так при включении четко видно, что случайные выходы сдвигового остаются включенными значительное (по меркам МК) время - имхо десятые секунды.
Если надо - могу провести натурный опыт, у меня валяется планка с двумя 595 и светодиодами на выходах.
Так формула ж приведена, кому сколько надо, тот столько и посчитает. Нужны сотни миллисекунд - ставим десятки микрофарад да и резистор можно побольше (до полусотни-сотни килоом мне кажется, нормально).
Так формула ж приведена, кому сколько надо, тот столько и посчитает.
ну так-то да :) Просто раз тема в Песочнице, логично для примера использовать близкую к реальности постоянную времени :)
Будет время на выходных - померяю. сколько знаимает старт Нано от подачи питания до инициализации выходов 595 регистра... если это кому-то интересно.
Мне интересно
Так вроде, на разных загрузчиках, разное время, или не?
ну, я во, никогда не ставлю загрузчики в готовое изделие, так что меня интересует инициализация самого контроллера и не более того. А там как раз единицы миллисекунд, а то и меньше. Отсюда и мой пример на 2 мс.
А так вообще, ну разное, и что? Под своё издели подбираешь правильный конденсатор и пользуешь.
Ставить 595-е регистры и при этом испытывать недостаток одного пина для управления ОЕ представляется очень надуманной ситуацией.
Но даже и в таком случае, решений - миллион, вопрос только в том, что каждый случай это конкретная схема.
Предложенный вариант не годится на все случаи жизни, бо входное напряжение отнюдь не функция Хевисайда, а как повезет.
Когда я как-то процитировал эту фразу в компании двух американцев, с которыми мы топили в пиве выездное поражение Акул от Далласа, повисла пауза с минуты две, потом один из них спросил "What did you say? Kinda fucking zen?" и пока я думал, что ответить, другой ему ответил: "This should be a Russian code for "Shit happens"" :)
Прошу прощения за некропостинг, а какова роль R1 в этой схеме?
Прошу прощения за некропостинг, а какова роль R1 в этой схеме?
Чтобы при выключении питания конденсатору было куда разряжаться. Если этот резистор убрать, то, после выключения питания, конденсатор будет оставаться заряженным весьма продолжительное время. Он, конечно, будет разряжаться, но очень медленно. Тогда, при повторном включении питания, схема не выполнит своего предназначения, т.к. её суть в том, что HIGH попадает на OE на время зарядки конденсатора, а если он уже и так заряжен, то HIGH туда не попадёт.
Спасибо за разъяснение, про это я совсем не подумал.
Таким образом, при тех номиналах, что у меня на схеме, время получается 0,22*10 = 2,2 миллисекунды.
Для входов стандартной логики нельзя использовать такие заваленные фронты - это вызывает тонны проблем на практике.
https://www.ti.com/lit/an/scba004d/scba004d.pdf
По-моему использование входа MR(10 нога) куда продуктивнее
А если выходы 595 активны нулём?
По-моему использование входа MR(10 нога) куда продуктивнее
Вот только она сбрасывает регистр, но не защелку... Потом CLK необходимо дёрнуть чтобы до защелки нули на выхода дошли