Подключение кнопки

Тема в разделе "Схемотехника, компоненты, модули", создана пользователем yden, 13 авг 2016.

  1. Onkel

    Onkel Гуру

    да ладно вы со статусами (это я про "я очень уважаю..."), чепуха полная, все мы тут имеем один статус!
    Я конечно попробую, весьма неожиданно. Интересно, а статус пина (вход / выход) не меняется после команды digitalWrite на выход? Опять же, если судить по схеме мк, у него нет подтяжки на землю. Ну конечно, самому попробовать надо. Попробую.
     
    rff-ei нравится это.
  2. Onkel

    Onkel Гуру

    С последним не согласен, но смотрите что происходит.
    Вы командой
    pinMode (14,INPUT);
    переводите выход C0 в третье состояние, а вход к пину физически всегда подключен и не отключается.
    Как только вы дали команду
    digitalWrite (14,HIGH);//подтягиваем к +5v
    у вас выходной каскад С0 выходит из третьего состояния и дает на выход +Vcc, при этом если у вас пин С0 (он же A0 в ардуине) замкнут на землю, то мк будет плошать все плоше и плоше, и если у вас нормальный питатель (не usb, там ограничение ), то мк сгорит, это лишь вопрос времени. Тоже самое с командой
    digitalWrite (14,LOW);//подтягиваем к земле
    но при этом пин не подтягивается к земле, а ползет к земле со скорость 1 В/мс, видно на осциллографе, а также видно даже считыванием PINC, хотя PORTC cразу же (что естественно) показывает 0.
    Да, еще это не подтяжка - подтяжка это когда вход подключается к Vcc или GND через резистор, обычно порядка 30 кОм внутренний и до сотен Ом, если наружный. Вы же командой digitalWrite (14,х) просто подаете gnd или Vcc через выходной каскад. Что чревато. Да ,если вы еще раз переведете пин в режим входа pinMode (14,INPUT); то нуль или Vcc исчезнут, а если не переведете - так и будет там или 0, или Vcc в режиме жесткой посадки. Настоятельно рекомендую так не делать.
    Я почему сразу про такую штуку вспомнил - у atmega можно вызвать прерывание по изменению состояния на пине, подав на пин нужный выход, и будет обработано прерывание. Так что неотключение выходного каскада при состоянии пина "вход" не баг, а фича. В других мк это может быть не так.
     
  3. Onkel

    Onkel Гуру

    Вот как раз выход!
     
  4. ANV

    ANV Гуру

    Это работает только потому, что при кратковременном нажатии кнопки выходной транзистор не успевает разогреться до физического разрушения.
    Очень хорошо что такой "трюк" придумали не вы, потому что его придумал человек далекий от электроники.
    Давайте так, открываем страницу 98 и вы показываете где на схеме pull-down резистор: http://www.atmel.com/Images/Atmel-4...ontroller-ATmega328-328P_datasheet.pdf#page98
    Если его там нет, то ваша теория рушится и вниз тянет выходной транзистор
     
  5. Onkel

    Onkel Гуру

    выходной каскад, когда пин объявлен входом, как - то кстати странно работает - выставляется в 1 с постоянной времени 5 мкс, а в 0 с постоянной времени 2 мс. Видно что-то неправильное все-таки есть, когда объявленный входом пин выставляется в 0 или 1. Тут еще может что ардуинское, хрен его знает, соответсвует ли точно digitalWrite(A0,LOW) обычной команде PORTC&=~0xFE , но проверять не буду уже, и так все ясно - так делать нельзя.
     
  6. rff-ei

    rff-ei Гик

    @Onkel-Вы настоящий Гуру ! " Черт возьми ". Все было очень убедительно, прислушаюсь к вашим настояниям;) Спасибо !
     
  7. vvr

    vvr Инженерище

    Выводы, сконфигурированные как INPUT_PULLUP
    Микроконтроллер ATmega в Ардуино имеет внутренние подтягивающие резисторы (резисторы, подключенные к питанию внутри микросхемы), которыми можно управлять. Если вы предпочитаете использовать их вместо внешних резисторов, подключенных к земле, - используйте параметр INPUT_PULLUP в функции pinMode(). Это позволит инвертировать поведение подключенного к выводу внешнего датчика: HIGH будет означать его отключение, а LOW - включение.

    https://www.arduino.cc/en/Tutorial/InputPullupSerial
     
  8. rff-ei

    rff-ei Гик

    @vvr- обычно я к питанию и подтягивал ,только как оказалась не правильным способом :oops:
     
  9. AlexU

    AlexU Гуру

    Ошибаетесь. Таким образом пин к земле не подтяните, в AVR-ках нет внутреннего резистора для подтяжки к земле. Есть только для подтяжки к питанию. Вы наверно перепутали с Малинкой или ещё каким контроллером, где такая подтяжка есть.
    Ну и как заметил пользователь 'ostrov' в посте #16 есть более короткая запись для подтяжки к питанию.
     
    ostrov нравится это.
  10. ostrov

    ostrov Гуру

    Я против извращений на готовых изделиях и за притяжку кнопки к +5В через внешний резистор, например 10 КОм. При нажатии просаживаем в 0 и все довольны. Внутрисхемное юзать только на прототипах для оперативности, да и то...
     
  11. AlexU

    AlexU Гуру

    Некорректные рассуждения.
    Если пин контроллера настроить как входной -- INPUT или INPUT_PULLUP -- то последующие вызовы функции 'digitalWrite' ни какого вреда контроллеру не принесут, т.к. эта функция не меняет "направление" пина (как был входным, так и останется). Функция 'digitalWrite' изменяет только регистр PORTx (регистр DDRx остаётся не тронутым) при этом, если пин входной, то регистр PORTx отвечает за подключение/отключение подтяжки пина к питанию через внутреннее сопротивление 30..60 кОм, а не за "коммутацию" пина к питанию или к земле.
    И если посмотреть на код функции 'pinMode' то можно увидеть, что:
    Код (C++):
    // вызов
    pinMode (14,INPUT_PULLUP); // изменяются биты регистров DDRxn = 0, PORTxn = 1
    // эквивалентен вызовам

    pinMode (14,INPUT); // изменяются биты регистров DDRxn = 0, PORTxn = 0 -- подтяжка выключена
    // подключаем подтяжку к питанию
    digitalWrite (14,HIGH); // изменяется бит регистра PORTxn = 1
     
    Последнее редактирование: 18 авг 2016
  12. Onkel

    Onkel Гуру

    Ну да, точно. Поторопился я в ночи, забыл что PORTx и за выходное состояние, и за подтяжки отвечает. Причем видел ведь , что состояние регистра DDRC не меняется, все нули....
    Но тогда получается что применяя эти команды сжечь порт невозможно, но вряд ли стоит их применять где-либо кроме setup{}, да и там применять один раз на пин.