Выбор типа цифрового входа
- Войдите на сайт для отправки комментариев
Добрый день!
У меня вопрос: мне нужно получить реакцию на нажатие кнопки. Как я вычитал, есть 2 пути:
1) pinMode(2, INPUT);
затем в loop проверять digitalRead(2) и если HIGH тогда некие действия...
при этом кнопка должна быть подключена к pin 2 одним контактом и к +5v другим?
2) pinMode(2,INPUT_PULLUP);
затем в loop проверять digitalRead(2) и если LOW тогда некие действия...
при этом кнопка должна быть подключена к pin 2 одним контактом и к GND другим?
то есть в первом случае кнопка подаёт на 2-й пин логическую ЕДИНИЦУ, во втором логический НОЛЬ?
Подскажите плюсы или минусы этих решений. На самом деле, планирую детектировать нажатие и, используя Ethernet shield, отправлять по локалке определённые сообщения.
1) pinMode(2, INPUT);
затем в loop проверять digitalRead(2) и если HIGH тогда некие действия...
при этом кнопка должна быть подключена к pin 2 одним контактом и к +5v другим?
И ещё пин соединён с GND резистором 10-50 кОм (в особых случаях от 1 кОм, но меньше уже не стоит).
Подскажите плюсы или минусы этих решений.
Никакой разницы (кроме дополнительного резистора в варианте №1).
Решение принимается исходя из удобства по другим обстоятельствам (типа "куда удобнее дорожку подвести" и т.п.).
А в случае PULLUP все время пока вход не замкнут на землю будет состояние HIGH и в момент замыкания станет LOW?
А в случае PULLUP все время пока вход не замкнут на землю будет состояние HIGH и в момент замыкания станет LOW?
Ну, да, на пине будет всё время HIGH, пока не замкнёте на землю.
Кстати, я не прав, есть-таки одна маленькая разница, но она редко проявляется.
Вот смотрите, если Вы делаете по первому варианту через внешнией резистор на GND, то там будет всегда LOW, пока не нажмёте кнопку.
А вот по варианту с PULLUP в момент включения МК на пине установится LOW и будет LOW до тех пор, пока Вы не выполните pinMode с PULLUP. Если pinMode делается в setup, то очень которокое время, но в это корткое время на пине будет LOW. Если это важно (если очень нужно, чтобы HIGH там был ВСЁ время, пока не нажмут кнопку), то можно не пользоваться PULLUP, а просто поставить внешний резистор между пином и питанием, также, как в первом варианте, только притянуть не к земле, а к питанию.
Но это нечасто бывает важно. Я чаще всего пользуюсь PULLUP, чтобы лишний резистор не ставить и не парюсь.
Не совсем понял, что значит если "pinMode делается в setup"...
То есть после команды pinMode(2,INPUT_PULLUP) в void setup на входе 2 установится HIGH и до нажатия будет таковым и оставаться. Нажатие приведёт к LOW. И останется LOW даже после отпускания кнопки. То есть обработав такое событие надо снова приводить состояние входа pinMode(2,INPUT_PULLUP)?
А в случае PULLUP все время пока вход не замкнут на землю будет состояние HIGH и в момент замыкания станет LOW?
В момент замыкания он станет LOW и HIGH много раз подряд с большой частотой - дребезг контактов. Потому, либо простая схема RC фильтра с разряжающим и одновременно притягивающим резистором, либо программная обработка дребезга контактов потребуется.
От "не парюсь" и "без разницы" в таких случаях как раз глюки и приходят, от неожиданных где-то проявлений или временных явлений, ненужных переходных процессах. Оно же входит в привычку не париться и ещё как инфекция передаётся в советах. А человек может не знать про поставить настройки входов самым первым делом, и эти входы могут быть прочитаны на прерывании таймера успетыми. Пуллап есть зло, унаследованное от ТТЛ, всё надо тянуть на землю, защищать стабилитроном и отделать резистором, ибо может попасть не VCC на входе, а побольше. :)))
Не совсем понял, что значит если "pinMode делается в setup"...
То есть после команды pinMode(2,INPUT_PULLUP) в void setup на входе 2 установится HIGH и до нажатия будет таковым и оставаться. Нажатие приведёт к LOW. И останется LOW даже после отпускания кнопки. То есть обработав такое событие надо снова приводить состояние входа pinMode(2,INPUT_PULLUP)?
Нет, ну ... давайте по порядку ...
после команды pinMode(2,INPUT_PULLUP) в void setup на входе 2 установится HIGH
и до нажатия будет таковым и оставаться. Нажатие приведёт к LOW.
И останется LOW даже после отпускания кнопки.
То есть обработав такое событие надо снова приводить состояние входа pinMode(2,INPUT_PULLUP)?
3) с этого момента на пине всегда будет HIGH когда кнопка не нажата и LOW - когда нажата. Ничего больше делать не нужно.
Можно ли просто подсоединить кнопку к 2-му пину и земле для замыкания без доп. резисторов?
Как я это понимаю (пока понимаю так):
- после включения питания он будет в режиме INPUT и состояние LOW. После операции pinMode(2,INPUT_PULLUP) в setup, 2-й пин остаётся "входным" и переходит в состояние HIGH (для этого нужно что-то дополнительно вешать?)
- после замыкания его на GND состояние меняется на LOW и остаётся таковым пока кнопка нажата.
- после отпускания кнопки он вернётся в HIGH сам (потому что он в режиме PULLUP) или для этого надо, чтобы был "притягивающий к питанию" резистор или как?
Можно ли просто подсоединить кнопку к 2-му пину и земле для замыкания без доп. резисторов?
Да
Как я это понимаю (пока понимаю так):
- после включения питания он будет в режиме INPUT и состояние LOW.
Да
После операции pinMode(2,INPUT_PULLUP) в setup, 2-й пин остаётся "входным" и переходит в состояние HIGH (для этого нужно что-то дополнительно вешать?)
Почти так. Не то, чтобы он "переходит в сосоятние" HIGH, правильнее сказать он соединяется через внутренний подтягивающий резистор к питанию и на нём появляется высокий уровень (HIGH). (Нет, дополнительно ничего не нужно вешать.)
- после замыкания его на GND состояние меняется на LOW и остаётся таковым пока кнопка нажата.
Да.
- после отпускания кнопки он вернётся в HIGH сам (потому что он в режиме PULLUP)
Да.
или для этого надо, чтобы был "притягивающий к питанию" резистор или как?
Нет, дополнительный резистор не нужен. PULLUP - это и есть подтягивающий к питанию резистор, он находится внутри микроконтроллера.
Землёй управлять нехорошо :). Нормальная простая схема входа: с ноги резистор на землю, кондёр на землю, cтабилитрон на землю, резистор наружу.
Можно ли просто подсоединить кнопку к 2-му пину и земле для замыкания без доп. резисторов?
Вы знаете, вот я боюсь, что мы о разном говорим и Вы из-за этого поймёте меня неправильно.
Если Вы используете INPUT_PULLUP, то, конечно, можно, дело в том, что PULLUP включает соединение пина с питанием через резистор 20кОм. Этот резистор находится внутри микросхемы контроллера. Т.е. резистор там уже есть и дополнительный не нужен.
- после включения питания он будет в режиме INPUT и состояние LOW. После операции pinMode(2,INPUT_PULLUP) в setup, 2-й пин остаётся "входным" и переходит в состояние HIGH (для этого нужно что-то дополнительно вешать?)
Ничего вешать не нужно. Резистор, как я уже сказал, находится внутри микросхемы. Операция pinMode(2,INPUT_PULLUP) соединяет пин с питанием через этот резистор.
- после отпускания кнопки он вернётся в HIGH сам (потому что он в режиме PULLUP) или для этого надо, чтобы был "притягивающий к питанию" резистор или как?
Да, вернётся. Подтягивающий к питанию резистор там уже есть (как я писал выше) доплнительного не надо.
-----------------
Дополнительный внешний резистор нужен в двух случаях:
1) Вы хотите иметь на пине LOW когда кнопка НЕ нажата и HIGH когда нажата. Тогда нужен резистор между пином и землёй, а в pinMode пишете просто INPUT (БЕЗ PULLUP)
2) Вы хотите иметь на пиге HIGH когда кнопка НЕ нажата и LOW когда нажата, но при этом Вы по каким-то причинам НЕ хотите использовать PULLUP. Тогда нужен резистор между пином и питанием, а в pinMode пишете просто INPUT (БЕЗ PULLUP)
Если же Вы используете PULLUP никакого внешнего резистора не надо, т.к. он там уже есть.
Землёй управлять нехорошо :)
Не надо ля-ля... Кому как удобно, тот так и делает. Хочешь землёй управляй, хочешь питанием. На отладочных платах встречал, что кнопки как-раз на землю повешены.
Жека_М, спасибо, я выяснил примерное то же самое, почитав справочник по функциям. То есть вызов pinMode(2,INPUT_PULLUP) "накидывает" виртуальный подтягивающий к питанию резистор и за счёт этого состояние входа становится HIGH. Нажатие кнопки "опускает" это значение до LOW в момент нажатия и удерживает его там. Как только кнопка отпущена, значение САМО возвращается в HIGH - до следующего нажатия кнопки. Верно?
Если да, то это решение как раз для меня. Длительность нажатия я могу игнорировать (чтобы ОЧЕНЬ многократно не отсылать дальше сигнал о нажатии). Например, получив значение LOW (кнопка нажата) отправить сигнал дальше единожды и зафиксировать этот факт в переменную например SignalSended = true). После этого игнорировать состояние LOW и отслеживать уже HIGH (то есть отпускание кнопки). Как только кнопка отпущена переменную SignalSended ставить в false. И дальше снова ждать пока она не станет LOW.
Землёй управлять нехорошо :). Нормальная простая схема входа: с ноги резистор на землю, кондёр на землю, cтабилитрон на землю, резистор наружу.
Вы когда-нибудь матчасть выучите? Или так и будете бред нести, как обчыно это делаете?
Читайте раздел 14.1 даташита (ATmega328) и пока не прочитаете, потрудитесь не писать глупостей.
Жека_М, спасибо, я выяснил примерное то же самое, почитав справочник по функциям. То есть вызов pinMode(2,INPUT_PULLUP) "накидывает" виртуальный подтягивающий к питанию резистор и за счёт этого состояние входа становится HIGH. Нажатие кнопки "опускает" это значение до LOW в момент нажатия и удерживает его там. Как только кнопка отпущена, значение САМО возвращается в HIGH - до следующего нажатия кнопки. Верно?
Всё верно. Подтягивающий резистор там не виртуальный, а вполне реальный (реализован внутри на кристалле микросхемы). То есть физика процесса одинакова, что для внутреннего резистора, что для внешнего.
Вы когда-нибудь матчасть выучите? Или так и будете бред нести, как обчыно это делаете?
Я думаю не дождёмся...
Читайте раздел 14.1 даташита (ATmega328) и пока не прочитаете, потрудитесь не писать глупостей.
Чукча не читатель, чукча писатель... (с)
Длительность нажатия я могу игнорировать (чтобы ОЧЕНЬ многократно не отсылать дальше сигнал о нажатии). Например, получив значение LOW (кнопка нажата) отправить сигнал дальше единожды и зафиксировать этот факт в переменную например SignalSended = true). После этого игнорировать состояние LOW и отслеживать уже HIGH (то есть отпускание кнопки). Как только кнопка отпущена переменную SignalSended ставить в false. И дальше снова ждать пока она не станет LOW.
Плохая идея. Так Вы словите кучу нажатий вместо одного из-за дребезга контактов.
Вы поняли мой пост №11 - всё, больше вопросв нет?
Это я к тому, что к дребезгу переходить рано, если там не всё понятно.
Землёй управлять нехорошо :). Нормальная простая схема входа: с ноги резистор на землю, кондёр на землю, cтабилитрон на землю, резистор наружу.
Вы когда-нибудь матчасть выучите? Или так и будете бред нести, как обчыно это делаете?
Читайте раздел 14.1 даташита (ATmega328) и пока не прочитаете, потрудитесь не писать глупостей.
В каком месте читать? Цитирую http://www.atmel.com/images/atmel-8271-8-bit-avr-microcontroller-atmega48a-48pa-88a-88pa-168a-168pa-328-328p_datasheet_complete.pdf:
14.1 Overview All AVR ports have true Read-Modify-Write functionality when used as general digital I/O ports. This means that the direction of one port pin can be changed without unintentionally changing the direction of any other pin with the SBI and CBI instructions. The same applies when changing drive value (if configured as output) or enabling/disabling of pull-up resistors (if configured as input). Each output buffer has symmetrical drive characteristics with both high sink and source capability. The pin driver is strong enough to drive LED displays directly. All port pins have individually selectable pull-up resistors with a supply-voltage invariant resistance. All I/O pins have protection diodes to both VCC and Ground as indicated in Figure 14-1. Refer to ”Electrical Characteristics – (TA = -40°C to 85°C)” on page 299 for a complete list of parameters. All registers and bit references in this section are written in general form. A lower case “x” represents the numbering letter for the port, and a lower case “n” represents the bit number. However, when using the register or bit defines in a program, the precise form must be used. For example, PORTB3 for bit no. 3 in Port B, here documented generally as PORTxn. The physical I/O Registers and bit locations are listed in ”Register Description” on page 91. Three I/O memory address locations are allocated for each port, one each for the Data Register – PORTx, Data Direction Register – DDRx, and the Port Input Pins – PINx. The Port Input Pins I/O location is read only, while the Data Register and the Data Direction Register are read/write. However, writing a logic one to a bit in the PINx Register, will result in a toggle in the corresponding bit in the Data Register. In addition, the Pull-up Disable – PUD bit in MCUCR disables the pull-up function for all pins in all ports when set. Using the I/O port as General Digital I/O is described in ”Ports as General Digital I/O” on page 76. Most port pins are multiplexed with alternate functions for the peripheral features on the device. How each alternate function interferes with the port pin is described in ”Alternate Port Functions” on page 80. Refer to the individual module sections for a full description of the alternate functions. Note that enabling the alternate function of some of the port pins does not affect the use of the other pins in the port as general digital I/O.
Где тут написано про глупости с "без разницы куда притягивать" написано, потрудитесь указать?
Кстати, выскочка Jeka_M, потрудитесь тоже указать по делу что-то в процитированном тексте, вместо очередной своей сопли о моей личности. :)
В каком месте читать?
Читать целиком. Не копипастить, а именно читать.
А когда прочитаете, то подумайте. Например, нахрена там стабилитрон, на котором Вы так настаиваете, ну и вообще о жизни.
И ещё, знаете, Вы мне надоели. То у Вас ЦАП в AVR работает, то системы реального времени на двух килобайтах строить собираетесь. Отвяжитесь уже. Ну, надоели, правда.
Кстати, выскочка Jeka_M, потрудитесь тоже указать по делу что-то в процитированном тексте, вместо очередной своей сопли о моей личности. :)
1. Вас в эту тему никто не звал.
2. Любая тема, в которой появляетесь Вы, превращается в срач. (примеры нужны???)
3. Очень Вас прошу, отвалите, а?
В каком месте читать?
Читать целиком. Не копипастить, а именно читать.
А когда прочитаете, то подумайте. Например, нахрена там стабилитрон, на котором Вы так настаиваете, ну и вообще о жизни.
И ещё, знаете, Вы мне надоели. То у Вас ЦАП в AVR работает, то системы реального времени на двух килобайтах строить собираетесь. Отвяжитесь уже. Ну, надоели, правда.
Нет уж, укажите, пожалуйста! Я настаиваю. Ляпнули человеку чушь, пытаетесь это прикрыть переходя на нытьё как я Вас обидел... Давате уже, не побабски склочничате, а по делу, с объяснение, с аргументами, с теорией.
Если Вы увидели эквивалентную схему входа в этом пункте даташита, и решили, что там защитный диод на VCC сможет защитить от превышения VCC, который, кстати, и даёт ограничение по напряжения на пин (Vcc+напряжение падения на этом диоде), то глубока заблуждаетесь, что нет необходимосчти защищать вход для внешней цепи стабилитроном. Давайте, за компаний с Выскочкой, блетните знанием теории. :)))
P.S. Вас я тоже с большим удовольствем похлю их это й темы с советами чайника. :)))
Я настаиваю.
Мне плевать на чём Вы настаиваете. Вы мне осточертели своей агрессивной полуграмотностью. Холиварьте с Архатом и Логиком - это Ваша лига. Я из другой. До свидания.
Насчет "внутреннего резистора" всё понятно. Насчёт дребезга - осознал несостоятельность алгоритма с булевской переменной. Можно сделать проще. Получив единожды значние LOW при нажатии и совершив при этом нужные действия - далее игнорировать остальные значения в течении какого-то времени. Интервал можно организовать двумя способами:
1) при помощи delay() если ничего кроме одной кнопки не надо мониторить. Но это блокирующий таймер.
2) при помощи значения millis(), точнее разницы между сохранённым в момент нажатия значением и текущим при каждом повторении void loop {} и это будет неблокирующий таймер!
Интервал можно поставить например 1-2 сек. То есть адекватное время, в течение которого человек отпустит кнопку.
Ну, есть 100500 способов бороться с дребезгом. Если интересно, посмотрите хорошую статью на эту тему. В статье рассмотрены реально грамотные подходы как программные, так и аппаратные.
1) при помощи delay() если ничего кроме одной кнопки не надо мониторить. Но это блокирующий таймер.
Вы правы, плохая идея.
Это слишкмо большое время.
В борьбе с дребезгом всегда присутствует компромисс и подходить нужно всегда с головой. Во-первых нужно понимать что Вас интересует "факт нажатия" или "факт отпускания" кнопки. Во вторых, Вы должны понимать с чем Вы боретесь: только с дребезгом или заодно и с т.н. "наносекундными помехами" (это когда из-за какой-то помехи на очень короткое время Вам прилетает сигнал, что кнопка нажата, хотя её никто не трогал).
Ну и наконец, надо соизмерять надёжность борьбы с дребезгом и требования по надёжности к изделию в целом. Это я к вопросу стоимости борьы в сравнении с ущербом от возможного проскакивания дребезга. Например, с дребезгом отлично борется вот такая микросхема, и нужно просто понимать каков риск того, что дребезг проскочит (насколько это критично) и стоит ли ставить туда микросхему за 1200 рублей или хватит конденсатора за рубль (хотя, это и менее надёжно). (микросхема с такой ценой приведена для примера "стоимости" вообще. Конкретно эту микросхему можно купить значительно дешевле в более адекватном месте)
Я приведу примеры, а Вы решите что Вам в конкретно Вашем проекте нужно.
Пример 1. Интересует нажатие кнопки, а не отпускание. После нажатия начинается некая процедура, которая длится несколько секунд и в это время никакая реакция на нажатие кнопки не предусмотрена: Способ борьбы с дребезгом очень простой - плевать на него, при первом нажатии запускаем процедуру и просто не читаем состояние кнопки во время её выполнения; (Минус - наносекундная помеха точно также запустит нашу процедуру - а почему нет?)
Пример 2. Интересует нажатие кнопки, а не отпускание. После нажатия подаётся константный уровень на пин. КОнстантный - в смысле всегда одинаковый: способ борьбы с дребезгом такой же, как и впрошлом примере - плюём на него. При вервом нажатии мы подадим нужный уровень, а при всех последующих подадим его же ещё раз - никто не умрёт. (опять же, это не спасает от наносекундных помех)
Пример 3. Интересует нажатие-отпускание. После отпускания делаем что-то, что меняется от раза к разу, например, инвертируем пин.: плевать нельзя, иначе мы много раз его инвертировать будем. Здесь лучше воспользоваться каким-нибудь методом из статьи, но, если потери от ошибки не слишком велики, то можно применить простейший фильтр низких частот, а именно: при любом изменении состояния кнопки, выждать (при помощи миллис) 10 миллисекунд (от 5 до 20, как Вам больше нравится) и если состояние кнопки по-прежнему такое же, считать, что состояние реально поменялось. Это, кстати и от наносекундных помех спасёт.
На практике, если речь идёт о надёжном подавлении дребезга (например, счётчик оборотов двигателя), я применяю системы на основе триггера Шмитта примерно как описано в статье (или на основе той микросхемы - такая цена только в оборзевшем магазине, реально её можно купить рублей за 100-150). Если же требования не очень жёсткие (типа ну если когда проскочит разок, то ничего страшного), то просто ставлю между пином и землёй конденсатор на 20-100 нФ и забываю об этом - обычно хватает). Программно я делаю нечасто, т.к. работаю в основном с совсем крохотными контроллерами и там приходится экономить каждый байт.
Ктстати, если есть вопрос как выбрать подходящий конденсатор: это зависит от кнопки - насколько она раздолбана. На практике я беру конкретную кнопку, конденсатор на 22nf (или даже меньше) и смотрю на осциллографе есть дребезг или нет. Если есть - беру конденсатор побольше, пока не будет 0 случаев дребезга из 10-20 нажатий и отпусканий. Это если не лень. А если лень (что чаще) просто ставлю на 100nf - обычно, для нормальных кнопок отлично работает.
Я настаиваю.
Мне плевать на чём Вы настаиваете. Вы мне осточертели своей агрессивной полуграмотностью. Холиварьте с Архатом и Логиком - это Ваша лига. Я из другой. До свидания.
Ну, так нет аргументов, херню безосновательную несёшь - плачь громче о моей личности, мож поверят. :)))
Баба базарная, нахватавшаяся кусков, примитивной практики на коленках паять. :)))
Сейчас почитаю статью. Кстати, а старая добрая экранировка не даст защиты от "наносекундных" помех?
старая добрая экранировка не даст защиты от "наносекундных" помех?
У них бывает разная природа. Если источник внешний, то может и выручит, а если источник помехи на Вашей же плате, так они по дорожкам бегают - при чём тут экранировка? Вот неплохая статья про них. Там и про борьбу с ними есть.
В общем, выводы:
1) Экранировка нужна
2) Кондёр надо повесить
3) Программно смотреть что нажатие продолжается 20-50 миллисекунд (подобрать интервал опытным путём) и только тогда принимать решение, что нажатие имеет место)))
P.S. Кстати, в моей ситуации, случайное срабатывание категорически недопустимо))))
P.S. Кстати, в моей ситуации, случайное срабатывание категорически недопустимо))))
Ну, если так, то я бы ещё подумал о том, чтобы использовать не PULLUP, а внешний резистор с меньшим номиналом (1-5кОМ). Там ведь в притяжке тоже компромисс. Чем меньше резистор, тем больше спасает от помех, но тем больший ток через него впустую на землю уходит.
Поясните. То есть вешать резистор того номинала, что вы подсказали с +5в на пина самостоятельно. При этом pinMode(2,INPUT) без PULLUP, правильно понял? Отслеживать по-прежнему LOW на нажатие...
P.S. ток, уходящий в землю будет лишь чуть больше греть резистор... ну так это не страшно))))
Кстати, выскочка Jeka_M
Чья бы корова мычала, как затычка в каждой теме. Ладно если бы по делу говорили, а то иногда такой бред несёте... Матчасть по МК Вы знаете хреново, зато гонору и спеси выше крыши.
За сим вступать с Вами в диалог больше не намерен. Адью.
Поясните. То есть вешать резистор того номинала, что вы подсказали с +5в на пина самостоятельно. При этом pinMode(2,INPUT) без PULLUP, правильно понял? Отслеживать по-прежнему LOW на нажатие...
P.S. ток, уходящий в землю будет лишь чуть больше греть резистор... ну так это не страшно))))
Вы всё правильно поняли.
Кстати, выскочка Jeka_M
Чья бы корова мычала, как затычка в каждой теме. Ладно если бы по делу говорили, а то иногда такой бред несёте... Матчасть по МК Вы знаете хреново, зато гонору и спеси выше крыши.
За сим вступать с Вами в диалог больше не намерен. Адью.
Обоснование будет и по-прежнему бабские обидки? :)))
В общем, выводы:
1) Экранировка нужна
2) Кондёр надо повесить
3) Программно смотреть что нажатие продолжается 20-50 миллисекунд (подобрать интервал опытным путём) и только тогда принимать решение, что нажатие имеет место)))
P.S. Кстати, в моей ситуации, случайное срабатывание категорически недопустимо))))
См. микросхему MC14490. Стоит копейки, 6 каналов аппратного антидребезга.
Нет уж, укажите, пожалуйста! Я настаиваю.
готов предоставить бесплатные услуги секунданта - вас двух много на этом форуме. должен остаться один.
Землёй управлять нехорошо :)
Поддерживаю!
Разработчики контроллера, индикаторов с общим анодом, tlc5940 и доброй тысячи других устройств - все как один безграмотные придурки. Вот спросили бы у фаэтона как правильно делать - не облажались бы так! А теперь что - дурачки, они дурачки и есть.
Жека и ЕвгенийП,
вы бы поменьше отвечали этому вундеркинду, пусть сам с собой беседует и упивается своим величием. С ним же спорить - как с голубем в шахматы играть. Не трожьте - вонять не будет.
Землёй управлять нехорошо :)
Советую поискать материалы с заголовками "внутрисхемные цепи" и "цепи внешних датчиков". Или "стандарты промышленных установок". Для эмпериков намекну - видели когда-нибудь забавно работающие задние фонари "девятки"?
P.S. Грамотный пример с общим анодом особо улыбнул. Давай до кучи к супе-профи на меня обидку гнуть и молчанку в песочнице устраивать. :))))
art100 внятно описал почему вешать кнопку на GND предпочтительнее чем на +5V.
Куда-то делся большой текст, который вчера написал про то, почему для подключения внешних цепей не хорошо (а не нельзя) использовать сигнал на землю. Простите, писать заново не стану. :)
По ошибке не в тут тему его написал... :))) Вот:
Для уравновешенных людей: почему землёй управлять плохо. Основные моменты своими словами, тугую теорию помех лучше смотреть в научных т.с. трудах с картинками и формулами. :)
1. При подаче управляющего сигнала внешней цепи замыканием на землю, необходимо притягивать вход микроконтроллера (МК) к питанию резистором. При этом провод, подключенный к входу МК и проложенный к внешнему датчику, является антенной-приёмником помех и наводок. Весь мусор, залетающий из этого провода, стекает на Vcc через резистор подтяжки, достаточно выкого сопротивления, чтобы что-то мелькнуло на входе. Далее накапливается потенциал на Vcc, дружно ликвидируемый армией конденсаторов в питащей цепи схемы на землю, "поднимая" таким образом землю семы, ибо питающие провода и дорожки питания тоже имеют сопротивление. При этом, возникают трудно прогнозируемые и не всегда ликвидируемые нежелательные токи и переходные процессы. В большинстве случаем, это не приводит к катастрофическим и даже заметным последствиям, но увеличивает риск сбоя.
2. Защитные цепи на входе в виде конденсатора, RC-фильтры в данном случае не желательны т.к. формируют переходной процесс в момент включения МК, давая на вход ноль на время своего заряда.
3. Управление "землёй" даёт соблазн не тянуть отдельный провод сигнальной земли, я зацепиться за ноль или землю силовой цепи, где может быть неуравновешенный потенциал.
4. Подача земли к датчикам мало вероятна для каждого отдельным проводом, чаще их соединяют кластерами общим проводом. При "отгорании" (обрыве) такого провода, два замкнутых одновременно контакта датчиков в кластере, не дадут сигнал на вход МК, а замкнут между собой входы. На обнаружение такой неисправности может потребоваться время, ибо она может быть схожа с нормальной работой - на обоих входах может долгое время не быть сигнала.
5. Предыдущая ситуация, более того, опасна. Когда датчики имеют разное напряжение питания и являются механическими контактами произойдёт замыкание двух различных истоников питания друг с другом. Если датчики являются схемными устройствами, они могут быть повреждены полученийм от соседа высокого напряжения.
6. При повреждении сигнальной линии, замыкании её на землю, вместо сигнала аварии, поступит сигнал срабатывания датчика, что требует выяснения ситуации.
Теперь вариант с управлением питающим напряжениям.
1. Притягивающий резистор ставится на землю, он может быть достаточно низкоомным и обязан быть установлен непосредственно в месте подключения входящей линии, ну, или как можно ближе. Земляные дорожки всех эти резисторов отводятся к входу питающей земли до питающей цепи МК. Таким образом хлам из провода, минуя схему улетает в землю или даже в заземление.
2. Притягивающий к земле резистор одновременно является разряжающим для кондесатор, в момент включения МК не происходит зарядка конденсатора и нет переходного процесса.
3. Тянут линию сигнального питания придётся - никуда не денешься.
4. Отгорание, повреждение, замыкание на землю сигнального питания лишь приведёт к отсуствию питания датчиков (замыкание отработает защита БП).
5. Обрыв питающей сигнальной линии при использовании нескольких линий разного напряжения, приведёт лиш к отсутствию питания датчиков.
6. Аналогично п.4.
Для тех, кто делает что-то для дома, для офиса и в своё удовольствие всё это, может быть, неважно. Использование гальванической развязки разом ликвидирует практически все риски, паразитных явлений. В промышленности практически никогда не применяется схема с нулём и питанием, используются отдельные изолированные контуры, если есть не железное, а логическое управление.
Я не говорил, что землёй управлять нельзя. При прочих равных, землёй управлять не хорошо, хуже. И хорошим тоном является выбор белее надёжного варианта, не требующего переворота при расширении и т.п.
Оценка рисков и эффективности применения той или иной системы может сконять к любому решению допустимому физически.
Ну, парень, ты передёргиваешь. Речь шла об испольоании кнопки на плате или рядом с платой, а вовсе не об удалённых датчиках. Вот ты писал о необходимости стабилитрона перед входом. Зачем, если на схеме явно нарисовано питание прямо с шины питания контроллера? Любой всплеск убьёт контроллер и защищать, так уж шину, а не вход. Также и здесь - в разговоре о наплатных решениях ты притягиваешь удалённые датчики. Так можно сказать и что тарелки для еды использовать нежелательно потому, что на МКС они неприменимы.
Тут в какой-то старой теме кто-то хорошо сказал о невозможности рассуждений что лучше, а что хуже вообще без привязке к конкретному проекту. Вот что лучше мерседес-кабрио или КАМАЗ с фурой? Можешь ответить? Бе того чтобы сначала выяснить, а что предполагается делать - девок катать или холодильники перевозить?
Речь шла о внешей кнопке... Там ещё вопрос по экранированию возникал... :) Но не исключено, что меня сглючило - у меня всё кнопки наруже, с которыми сейчас работаю. Кнопка на плате - это крайне редкое явление. :) Тем не менее, делать внутрисхемные кнопки отличными от внешних будет неудобно.
Стабилитрон, чтобы убить всплеск, прилетевший с кнопки в разокнутом состоянии от статики до того, как он полетит в подтягивающий резистор, от замыкания проводов в жгуте, от ошибки подключения. Лучше использовать стабистор - симметричный стабилитрон.
Faeton, Вам не надоело ещё недоумков учить уму-разуму? Мне показалось что предыдущего срача более чем достаточно. Напомню народную мудрость: дураков учить - только портить. Не, Вы не согласны? :)
ТС-у, вместо того чтобы слушать сладкий кисель в уши, я бы на вашем месте прислушался к советам знающего человека, даже если он пишет некузяво.
Faeton, Вам не надоело ещё недоумков учить уму-разуму? Мне показалось что предыдущего срача более чем достаточно. Напомню народную мудрость: дураков учить - только портить. Не, Вы не согласны? :)
ТС-у, вместо того чтобы слушать сладкий кисель в уши, я бы на вашем месте прислушался к советам знающего человека, даже если он пишет некузяво.
Да фиг с ними. К тому же, не такие уж и недоумнки. Скорее, неучи амбициозные, нахватавшиеся империки.
Но тут ведь много мальчишек, которым может что-то пригодится. В том числе и отношение к разработке. Увы, они же лишены сейчас, например, чтения журнала "Радио", где прежде всего формировалось на простых вещах отношения к колегам, к людям - когда не понты, а доброе отношения было в моде.
Да, пожалуй я был слишком резок. Приношу свои извинения.
Просто посмешило, про "неожиданные наносекундные на водки".