Триггер или регистр или не знаю что...

Тема в разделе "Посоветуйте детальки", создана пользователем ivanych, 22 мар 2017.

  1. ivanych

    ivanych Нерд

    Подскажите, пожалуйста, схему вот такой штуки:

    1) Есть некоторое количество входов. Допустим, пусть будет 10, для конкретности. На входы может подаваться низкий или высокий сигнал. Каждый сигнал, независимо от других, может подаваться "разово" - например, от тактовой кнопки, или "постоянно" - например, от выключателя.

    2) Есть один выход. Из выхода выходит "разовый" высокий сигнал, как от тактовой кнопки.

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

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

    Может быть, есть готовые решения для такого? Микросхема какая? Вроде бы это должна быть достаточно частая задача - поймать любое изменение на выходах некоего прибора...
     
  2. Tomasina

    Tomasina Сушитель лампочек Модератор

    а зачем внешняя микруха, если Arduino сама может генерить прерывание по изменению сигнала на любом своем пине?
    Или нужно освободить пины Arduino для других целей? Тогда любую микросхему - мультиплексор с интерфейсом I2C, а Arduino будет постоянно опрашивать ее состояние.
     
    Последнее редактирование: 22 мар 2017
  3. ivanych

    ivanych Нерд

    Не на любом, там всего пара пинов с прерываниями.
     
  4. rkit

    rkit Гуру

    io expander, если нужны прям прерывания
    а вообще обычно делают клавиатурную матрицу для таких вещей
     
  5. ivanych

    ivanych Нерд

    И у меня выходов больше, чем пинов на любой Ардуине, я не могу воткнуть их напрямую, даже если обрабатывать не по прерыванию, а опрашивать по кругу. Мне нужно будет использовать сдвиговые регистры, и запускать все эти процессы хотелось бы именно по прерыванию.
     
  6. Tomasina

    Tomasina Сушитель лампочек Модератор

    На любом. Это незадокументированная в Arduino функция, но штатная возможность чипа 328p, на которой построена Arduino.
    ссылка 1, ссылка 2.
     
  7. ivanych

    ivanych Нерд

    Это не совсем та задача, которую мне нужно решить. Мне не нужно знать сигналы на выходах устройства, про устройство я просто для иллюстрации написал.

    Моя задача - узнать, что где-то что-то изменилось. Просто этакий триггер нужен. Что именно изменилось - не важно.
     
  8. ivanych

    ivanych Нерд

    Гугл на "io expander" выдает что-то невнятное. Не могли бы вы чуть подробнее написать?

    Клавиатурная матрица, я так понимаю, выдает кучу выходов. Мне нужен всего один. Мне не нужно знать, что именно изменилось, нужен только факт, что что-то изменилось.
     
  9. rkit

    rkit Гуру

  10. ivanych

    ivanych Нерд

    Я не очень понимаю, что эта штука делает.

    Она собирает отдельные входящие сигналы и "упаковывает" их в некий протокол по нескольким (двум?) проводам?

    Она умеет выдавать по одному проводу "разовый" сигнал, как от тактовой кнопки, при изменению любого входящего сигнала?
     
  11. Unixon

    Unixon Оракул Модератор

    От всех входов вычисляете XOR любой комбинацией элементов, результат дифференцируете RC цепочкой и округляете триггером Шмитта/компаратором/и т.п.
     
  12. Unixon

    Unixon Оракул Модератор

    8-входовая логика - 74HC86, CD4030, из них в иерархическом порядке набираете сколько нужно. Если входов ну совсем много, тогда FPGA.
     
  13. ivanych

    ivanych Нерд

    Про XOR понял. Входов у меня около 60-ти, нужно будет построить каскад микросхем.

    Не совсем понял про RC-цепочку. Какую роль она тут выполняет? Микросхема XOR ведь выдаст готовый логический сигнал, без дребезга?
     
  14. Unixon

    Unixon Оракул Модератор

    Вам на выходе нужно получить импульс, а не новое значение напряжения. Выход логической схемы на входе (каскад XOR) может измениться либо 0->1 либо 1->0, но только один раз при измерении одного входа, а вам нужно по одному изменению сгенерировать импульс с двумя фронтами. Это можно сделать продифференцировав сигнал, для чего в цепь последовательно включается конденсатор, а резистор в паре с ним будет определять длительность импульса. Для устранения дребезга применяется интегрирующая RC цепочка, а здесь вам нужна дифференцирующая, в ней резистор и конденсатор меняются местами... Единственный недостаток такой схемы будет заключаться в том, что импульсы, соответствующие переходу 0->1 и 1->0 будут сдвинуты по фазе, но это можно побороть некоторой дополнительной логикой, одновременно обрабатывая прямой и инвертированный выход и потом смешивая сигналы.
     
  15. Unixon

    Unixon Оракул Модератор

    Впрочем, здесь можно уже не заморачиваться со сложными схемами, а просто поднять прерывание на одной ноге МК или двух ногах с разными условиями (RISING/FALLING).
     
  16. ostrov

    ostrov Гуру

    Написано много, не осилил. Правильно понимаю, что если на одном из пинов сигнал поменяется с 0 на 1 должен быть подан сигнал куда то еще?
    Считывать данные с ног, собирать из них байты каждые сколько там надо мс, сравнивать прошлым, если хоть один байт увеличился на сколько нибудь, значит произошло искомое событие. Задача на несколько строк.
     
  17. ivanych

    ivanych Нерд

    Разобрался с дифференцирующей RC-цепочкой. Действительно, получается два фронта, один резкий, другой сглаженный. Выровнять сглаженный можно триггером Шмитта, с этим тоже разобрался.

    Некоторое сомнение есть из-за того, что импульсы, выдаваемые дифференцирующей RC-цепочкой, переходят из "плюса" в "минус" (или как это называется?). Это видимо то, что Вы описали как "что импульсы, соответствующие переходу 0->1 и 1->0 будут сдвинуты по фазе".

    Картинка:
    [​IMG]

    Мне бы хотелось, чтобы импульсы были в "плюсовой" зоне. Триггрер Шмитта не сможет их "развернуть"?

    Да, согласен, в принципе прерывание по обоим фронтам полностью решает мою задачу, даже без дифференцирующей цепочки и Шмитта. Достаточно одного XOR. Но мне теперь хочется разобраться до конца:) Ну и потом, при нормальном импульсе можно диодик повесить, который будет мигать при любом переключении:)
     
  18. ivanych

    ivanych Нерд

    Да, только это не Ардуино, эту "штуку" нельзя запрограммировать. Это аппаратное решение. Микросхема. Т.е. теоретически можно реализовать это на Ардуино, но суть в том, что это должна быть не программа внутри Ардуино, а датчик для Ардуино.
     
  19. Unixon

    Unixon Оракул Модератор

    Немного не так. Сдвиг получается от того, что при переходе 0->1 восходящий фронт импульса будет передним, а при переходе 1->0 задним, т.е. сдвинутым от переднего на ширину импульса. Отрицательная полуволна в простейшем случае срезается диодом.

    Нет, тут немного другой подход.
    а) Сигнал инвертируется, потом дифференцируются оба - и прямой и инверсный, отрицательные полуволны у обоих срезаются диодами, фронты правятся триггерами, потом положительные импульсы от прямого и инверсного сигнала (они будут взаимоисключающими) склеиваюится логическим "или".
    б) Сигнал после дифференцирующей емкости подвешивается к Vref=Vcc/2 с помощью делителя (один резистор к Vcc, другой к GND, средняя точка на емкость), затем пропускается через "оконный" (2-х пороговый) детектор на ОУ или соответствующем компараторе, который на выходе всегда генерирует положительный (или отрицательный) импульс, если сигнал отклонился от Vref в одну или другую сторону до некоторого порога.
     
  20. Unixon

    Unixon Оракул Модератор

    Последнее редактирование: 27 мар 2017