Подключение клавиатуры к МК по трем проводам на сдвиговых регистрах

Часто возникает необходимость использования в своем проекте большого количества кнопок для различный целей. Существуют разные варианты реализации данной задачи. Сегодня я расскажу вам о решении, которое пришло мне в голову однажды вечером. Тогда мне нужно было повесить клавиатуру на контроллер с ограниченным количеством свободных ножек. Скорее всего данное решение уже описывалось и использовалось где-либо ранее, но упоминаний в интернете я не нашел.

Суть
Подключение клавиатуры осуществляется по трем сигнальным проводам. Дополнительные элементы: сдвиговые регистры sn74198n и несколько резисторов. Максимальное количество кнопок ограничивается лишь максимально допустимым временем на сканирование клавиатуры. Я использовал в своем проекте 16 кнопок, но путем добавления новых сдвиговых регистров, можно увеличить данное число до необходимого вам значения. Вас будет ограничивать лишь пропорционально возрастающее время сканирования клавиатуры.

Аппаратная часть
Сдвиговые регистры – вещь довольно удобная за счет своей дешевизны и универсальности. Их часто используют для подключения светодиодов, семисегментных индикаторов и т.п. по небольшому количеству выводов микроконтроллера. В нашем случае, будем проделывать почти все тоже самое, но в обратную сторону:будем передавать данные не «из микроконтроллера», а «в него». Для наглядности привожу блок схему работы данного устройства:

  • 1.Блок Клавиатуры
  • 2.Сдвиговый регистр
  • 3.МК

Блок клавиатуры представляет собой набор кнопок, которые одним выводом подключены к земле, а другим подключаются к соответствующему входу сдвигового регистра.

Параллельная и последовательная передача
Если вы не знаете различия в параллельном и последовательном способе передачи информации, то рекомендую разобраться в этом сейчас. Далее я часто буду использовать эти термины, и без понимания их, вам будет немного сложнее.
Параллельной передачей данных называют метод передачи нескольких сигналов с данными одновременно по нескольким параллельным каналам, например порт целиком, сразу все восемь бит. При последовательной передачи данных биты пересылаются по одной линии связи, друг за другом, последовательно. Например по UART или по SPI

В нашей схеме сдвиговый регистр осуществляет конвертацию параллельного входного сигнала в последовательный выходной. В процессе сканирования клавиатуры он будет хватать 8 значений из блока клавиатуры и последовательно отсылать его в микроконтроллер.
Исходя из вышеописанного, к сдвиговому регистру предъявляются следующие требования:

  • параллельный вход
  • последовательный выход

Для этого нам подойдет регистр SN74198N. В моем месте обитания такие микросхемы редкость, поэтому я использовал советские монстровидные К155ИР13. Они являются полным аналогом, и различий в их использовании от импортных собратьев нет.

МК управляет сдвиговым регистром: говорит когда ему хватать сигнал с блока клавиатуры и передавать его своему хозяину.

Теперь разберем схему нашего устройства.

Схема упрощенная, показано только подключение клавиатуры. Питание и прочая обвязка контроллера как обычно.

Описание кнопок
Одним выводом кнопки подключены к входу сдвигового регистра. Другим – к общему проводу. Так же немаловажная детать – подтягивающие резисторы R1 – R8. Они создают высокий логический уровень на входе сдвигового регистра в то время, как соответствующая ему кнопка разомкнута.
Как только кнопка замыкается, на входе сдвигового регистра образуется логический ноль, так как он оказывается напрямую подключен к общему проводу. Значение резистора в 10 кОм не дает протекать слишком большому току, пока кнопка замкнута, и достаточно хорошо создает высокий логический уровень, пока кнопка разомкнута.

Сдвиговый регистр

  • Наш сдвиговые регистр имеет входной порт (D0-D7)
  • выходной порт (Q0-Q7)
  • и сигналы управления (SR, SL, CLK, S0, S1, MR).

Входной и выходной порт можно использовать как в параллельном режиме, так и в последовательном. За счет этого, данный сдвиговый регистр достаточно универсален. Но мы лишь остановимся на тех функциях, которые нам необходимы, остальное вы можете сами прочитать в даташите.

  • D0-D7 – собственно вход. Сюда мы будем подавать 8 сигналов с наших кнопок.
  • Q0-Q7 – параллельный выход. Мы будем использовать лишь одну ногу – Q7. Остальные в нашем случае нам не нужны.
  • CLK – тактовый вход. Все в сдвиговом регистре делается только по дрыгу на этой ножке. А точнее по нарастающему фронту. Если нам необходимо что-то сделать, то просто подаем высокий уровень на ножку CLK, а затем опускаем ее (подаем логический ноль). Для простоты изложения, я буду по деревенский говорить, что нам нужно кликнуть ножкой CLK.
  • S0 и S1. Эти ножки отвечают за поведение выхода регистра (Q0-Q7). По сути этот регистр может иметь как последовательный (наш случай), так и параллельный выход. Когда обе ножки подняты (высокий логический уровень), мы можем загрузить на выход те данные, которые в данный момент находятся на входе (D0-D7).

    Для этого нам нужно при поднятых S0 и S1 кликнуть ножкой CLK. Сразу же после этого, ножки на выходе примут те же значения, что и на входе.

    Если же опустить одну ножку в ноль, например S1, то стоит нам дернуть ножкой CLK, как данные на выходном порте сдвинутся в сторону старшего бита (бит с выхода Q0 перескочит на выход Q1, а бит, который раньше был на месте Q1 — перелезет на Q2 и т.д.). Кликнем еще раз, биты сдвинутся опять.

    Проделав это 8 раз, наши данные убегут вникуда, а на смену им прийдут новые, взявшиеся ниоткуда (откуда они берутся, мы поговорим позже). Дабы не терять эти данные, а передавать их в микроконтроллер, нужно вовремя их считывать.

Так как наши биты двигаются в сторону старшего (Q7), то и ловить их следует там.

Алгоритм действий

  • 1. Ставим S0 и S1 в высокий уровень и кликаем. На выходе Q0-Q7 у нас фиксируется необходимый нам байт (8 бит).
  • 2. Опускаем S1 (S0 остается в высоком уровне всегда, поэтому его можно смело напрямую сажать на плюс и забыть про него)
  • 3. Считываем бит с ножки Q7
  • 4. Кликаем. Бит, который раньше был на ножке Q7, убегает в нибытие, а на смену ему приходит бит, который раньше стоял на ножке Q6.
  • 5. Возвращаемся на пункт 3 и проделываем эти операции еще 7 раз. Ибо у нас 8 бит, и нам важен каждый из них.

Итого, использую 3 ножки микроконтроллера, подключенных к сдвиговому регистру (CLK, S1, Q7), мы легко и непринужденно опрашиваем наши 8 кнопок.

На бумаге это все работает, но проверим это в реальном железе. Для этого я собрал демонстрационную платку и подключил ее к Pinboard. Использовал, как я уже говорил, советские аналоги сдвиговых регистров, а именно К155ИР13, поэтому плата разведена под них.

Не пугайся что на плате 16 кнопок и уже 2 сдвиговых регистра, позже я опишу и этот вариант схемы. Главное знай, что данная схема может безболезненно работать и в восьмикнопочном режиме.

16-ая кнопка у меня отсутствует по причине отсутствия ее у меня в запасах и мороза на улице. Плату я перекатал ЛУТом на текстолит, вытравил и запаял. Вся эта технология хорошо расписана на данном сайте, поэтому останавливаться на деталях не буду.

Итак, плата готова, приступаем к самому интересному – написанию прошивки.

Програмная часть
Хотя представленный вариант работы со сдвиговым регистром совместим с аппаратным SPI микроконтроллера, опрашивать кнопки будем программно. Напишем функцию, которая будет опрашивать наши кнопки, и помещать результат в регистр R17.

		.equ	BTN_PORT	=	PORTB
		.equ	BTN_DDR		=	DDRB
		.equ	BTN_PIN		=	PINB
 
		.equ	BTN_DATA_IN	=	0
		.equ	BTN_HOLD	=	1
		.equ	BTN_CLK		=	2
 
btn_start:	SBI	BTN_PORT,BTN_HOLD	; Поднимаем S1	
 
		SBI	BTN_PORT,BTN_CLK	; кликаем
		CBI	BTN_PORT,BTN_CLK
 
		CBI	BTN_PORT,BTN_HOLD	; опускаем S1
 
btn_again:	LDI	R17,0			; В этом регистре будет накапливаться наш результат.
						; неизвестно где он побывал, а нам гарантированно
						; нужен ноль.
		LDI	R16,8			; счетчик. Цикл будем проделывать 8 раз
 
btn_loop:	LSL	R17			; если мы проходим тут, первый раз, то данная команда
						; с нулем ничего не сделает, если же нет, то двигаем все биты влево
 
		SBIC	BTN_PIN,BTN_DATA_IN	; если к нам на вход пришла 1,
		INC	R17			; записываем 1 в самый младший разряд регистра R17
 
		SBI	BTN_PORT,BTN_CLK	; кликаем
		CBI	BTN_PORT,BTN_CLK
 
		DEC	R16			; уменьшаем счетчик
		BREQ	btn_exit		; если счетчик досчитал до нуля, то переходим выходим btn_exit
		Rjmp	btn_loop		; иначе повторяем цикл, где первой же командой сдвигаем все биты
						; влево. Таким образом старые старшие байты постепенно
						; сдвигаются на свое место.
 
btn_exit:		RET

На данном этапе я сразу выделяю ее как функцию, чтобы далее было проще ее использовать.
Функцию написали, теперь создадим простейшую программу (это только для начала, развлечения впереди). Она в бесконечном цикле будет вызывать функцию сканирования клавиатуры, и полученный результат записывать в выходной порт PORTA, к которому мы подсоединим линейку светодиодов. Ничего сложного.

; Сначала инициализируем ноги контроллера:
	SBI	BTN_DDR,BTN_HOLD		; выход HOLD
	SBI	BTN_DDR,BTN_CLK			; Выход CLK
	SBI	BTN_PORT,BTN_DATA_IN		; вход DATA_IN
 
	OUTI	DDRA,0xFF			; Порт D ставим на выход. К нему будут
						; подключаться светодиоды
 
;Затем создаем бесконечный цикл, в котором помещаем следующее:
 
main:	RCALL	btn_start			; вызываем функцию опроса клавиатуры
	COM	R17				; инвертируем пришедший байт
	OUT	PORTA,R17			; и записываем его в порт A
	RJMP	Main				; возвращаемся на начало

Инвертируем регистр R17 для нагдяности. Так как изначально бит нажатой кнопки у нас Ноль, а светодиод загорается при единице.

Компилируем и заливаем в замечательную отладочную плату PinBoard. Подключаем наш блок кнопок так, как показано на фотографии.

  • 1 пин блока кнопок — PORTB.0
  • 2 пин блока кнопок — PORTB.1
  • 3 пин блока кнопок — PORTB.2
  • 4 пин блока кнопок — +5 V
  • 5 пин блока кнопок — Общий провод (Ground)
  • PORTA (0..7) — линейка светодиодов.

Перезагружаем МК и наблюдаем следующую картину

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

На этом конец первой части.

В следующей стетье я расскажу вам как увеличить число кнопок до 16 (24, 32 и т.д), как легко определять какая кнопка нажата в данный момент, и как на нажатие каждой кнопки прикрутить свою функцию.

В самом конце у нас получится примерно это

Все вопросы и пожелания оставляйте в комментариях.

Смотри также статьи

UPD
Продолжение банкета! Часть 2

109 thoughts on “Подключение клавиатуры к МК по трем проводам на сдвиговых регистрах”

  1. Отличная статья! Может кто-нибудь написать ликбез по применениям серии 74ххх микросхем? Например оч понадобилось бы знать как работает и где применить буфер.

      1. Ага, список огромный. Знаю разве что твою статью про сдвиговый регистр ну и вот эту. Может начать с самых популярных?

        1. Да в том то и дело.

          Думаю описать буферы, стандартную логику (и или не), может аналоговые буферы вроде HEF4066. Что там еще… можно JK триггеры добавить. Про сдвиговые регистры уже целых две статьи. Кодеры-декодеры имхо в топку. Т.к. толку от них, можно программно сделать. АЦП-ЦАП, если найду.

          Чо там еще есть? Я уж не помню :)

    1. спасиб, эти микрухи лучше подойдут для данной задачи. жаль только что единственный магазин в моем городе их тож не продает(

    1. Действительно. джойстики на сдвиговых регистрах. впрочем я так и думал, что ничего нового я не описываю)

    1. точно также печатал на лазерном принтере на журнальном листе, и переводил на лицевую сторону текстолита утюгом)

      1. Странно, я так же пробовал (только у меня не журнал, а ломондовскя фотобумага), так после проглаживания утюгом у меня на текстолит перевелась часть бумаги и он стал в желто-белую полосочку, надписи при этом прочесть почти невозможно.

            1. хм. мне ломонд еще не доводилось использовать для перевода шелгографии, поэтому незнаю как фотобумага эта обычно ведет себя с лицевой частью текстолита.) может тут кто то пробовал и подскажет) но журналом все переводится на ура)

                1. Я тоже на макетку себе ЛУТом надписи сделал. К лицевой части пристало на ура, как и к меди. Специально не царапал, но вроде нормально держится. Поверхность перед ЛУТом так же прошкурить и обезжирить и нормально…

                2. Пшикнуть сверху уретаном или цапонлаком покрасить. Замечательно получается. И цвет становится не серым, а глубоко черным.

              1. Хм, что-то уведомлялка об ответе не пришла…

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

                1. я водой смывал. потом еще щеткой остатки бумаги удалял. иначе когда высыхает, краска становится белой из за мелких кусочков бумаги.

            2. На счет 0,3 мм, не уверен. Но вот 0,4 — 0,5 переводит замечательно. ЛУТом пользуюсь уже второй год и очень доволен, экономит время, деньги, и нервы.

        1. Глянец у ней липнет к текстолиту просто атас. Я для шелкографии использую не ломонд, а подложку от самоклеек. Ну или мелованую бумагу из журнала. Качество там не сильно важно, а вот так сильно она не липнет.

          1. Конечно постики давние, но для всех, кто делает печатные платы методом термопереноса могу сообщить следующее:
            Пробовал различные основы для нанесения маски, даже профессиональную пленку, используемую в издательстве… Наилучший результат получается при печати маски на глянцевой основе самоклеющейся бумаги!!!
            То есть берете такую бумагу, отклеиваете от нее самоклеящийся слой, а на глянцевую основу печатаете маску…
            Затем под утюг на предварительно зашкуренный нулевочкой и обезжиренный спиртом текстолит (только через прокладочку — листик 80-граммовки). Даете остыть… и вуаля! Если у вас нормальный порошок в принтере и не убитый термовал — печать получаете как на фабрике…

    1. действительно, один в один все) гуру наверно воспримут это как само собой разумеющееся, а новичкам будет полезно узнать, что так можно)

  2. >>Опускаем S0 (S1 остается в высоком уровне всегда, поэтому его можно смело напрямую сажать на плюс и забыть про него)
    На схеме S0 болтается в воздухе а S1 подрублено к контроллеру (PB1/T1).
    >>Она в бесконечном цикле будет вызывать функцию сканирования клавиатуры, и полученный результат записывать в выходной порт PORTA, к которому мы подсоединим линейку светодиодов
    А возможно от каждой кнопки вывести провода и через диоды соединить их все к одному интераптному порту МК чтоб не опрашивать а по интерапту работать?
    Спасибо за статью.

    1. Можно. Подключи катоды восьми (в данном случае)диодов со входами регистра, а их аноды, соединенные вместе и подтянутые резистором к «+» питания- на «интераптный» вход МК. Получим схему восьмивходового «И». Если кнопки не нажаты, на входе МК «1». Если нажата хоть одна из кнопок, то на входе получим «0».

  3. Можно. Подключи катоды восьми (в данном случае) диодов со входами регистра, а их аноды, соединенные вместе и подтянутые резистором к «+» питания- на «интераптный» вход МК. Получим схему восьмивходового «И». Если кнопки не нажаты, на входе МК «1». Если нажата хоть одна из кнопок, то на входе получим «0».

  4. Похожею идею высмотрел в книжке Майка Предко «Устройства управлени роботами» (п.4.17), правда для вывода информацию на LCD по двум проводам. К етой реализации добавили и считывание 6-ти кнопок (RLC-2 на pro-radio.ru). Алгоритм получился сложноватий, но за то економия ножек МК. Реализация ассемблер, PIC16.

  5. А как тут обстоит дело с дребезгом контактов? Я бы распаял параллельно каждой кнопке кондёр на 0.1 мкФ.

      1. Программно хорошо, когда кнопка подключена напрямую к МК. А тут если помеха проскочит во время сканирования, то до следующего сканирования будет не ясно, она ли это, или кнопка нажата/отпущена. Хотя можно анализировать несколько сканирований подряд…

        Ладно, подождём продолжения :)

      2. «Максимальное количество кнопок ограничивается лишь максимально допустимым временем на сканирование клавиатуры.»
        Это без учета программного антидребезга? Вообще, время сканирования в сравнении временем программного антидребезга (как правило, 30мс) ничтожно мало. А если не ждать 30мс в цикле, сделать проверку по 10мс таймеру, например, то и почти без проблем. Но… Но так не хочется писать лишний код для антидребезга. Поэтому лучше потратиться на шестнадцать инверторов с триггером Шмитта (в любых корпусах, каких удобно), столько же резисторов и столько же конденсаторов. Плюс на CLK-вход регистра емкость 0.01мкФ, чтобы убрать эту опасность.

        1. Инверторы не нужны, емнип большинство логических микрух уже содержит в себе элементы, обеспечивающие некий минимальный гистерезис.
          Хотя точно помню, в инверторах нашей 561 серии их не было, и на одном инверторе можно было собрать ВЧ-генератор :)

            1. На самом деле антридребезговая проблема сильно преувеличена. Я последнее время дребезг вообще не проверяю. Просто делаю опрос клавиатуры, скажем 10 раз в секунду. Стабильно стоящая кнопка не дребезжит. А будучи нажатой если дала сработку, значит уже имеет смысл считать ее нажатой, а на дребезг насрать. Главное чтобы частота сканирования была на пару порядков больше дребезга. Но без диспетчеризации сложно это сделать без гемороя :)

              1. «Просто делаю опрос клавиатуры, скажем 10 раз в секунду.»
                Так это и есть антидребезг ;) Или я не правильно Вас понял?
                У применения как программного, так и аппаратного антидребезга есть еще одна важная сторона — это испытание системы на помехоустойчивость. Ведь, если не дребезг, то помеху можно принять за «сработку» в момент сканирования. Для любительской практики это может и не важно, а для тех, кто профессионально занят в разработках — напротив. Подтянутая линия входа от кнопки потенциальный источник сбоя, нежели выход логики.

                1. Я тоже сканирую клавиатуру через каждые 50 мс. и при каждом полученном нажатии какой-либо кнопки ставлю флаг на 200 мс, который запрещает обрабатывать нажатие этой же самой кнопки. Более удобнее печатать так. нет нежелательных повторов.

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

                  1. «…и при каждом полученном нажатии какой-либо кнопки ставлю флаг на 200 мс, который запрещает обрабатывать нажатие этой же самой кнопки.»
                    Это уже обработка кнопки.

                    «а если процессорное время позволяет» — ключевое выражение. И я совсем не против нескольких строк кода. Мало того, в некоторых случаях для супер-пупер защиты от ложных данных использую и программную и аппаратную реализации.

                    «главное рассчитать время между этими сканированиями».
                    Необходимое временной интервал среднестатистического дребезга 20мс-30мс. Поэтому достаточно сделать два захода на сканирование с данным интервалом. Если сканирование в с короткими промежутками в цикле, то по уму надо взять, скажем, число 3 или 5 (кому как приятнее) и при его достижении без пропусков (вероятность совпадения с помехами и дребезгом минимальна) считать кнопку нажатой.

                    Вообще, если играться со светодиодной линейкой, то никакой антидребезг и не нужен — вы мерцание св.диода и не заметите. А, вот, если кнопка участвует в установке режимов электросудорожной терапии — тут есть о чем призадуматься.

                    1. «Если сканирование в с короткими промежутками в цикле, то по уму надо взять, скажем, число 3 или 5 (кому как приятнее) и при его достижении без пропусков (вероятность совпадения с помехами и дребезгом минимальна) считать кнопку нажатой.»

                      немного уточнить хочу.
                      допустим приходим на МК нажатие кнопки (еще неизвестно, дребезг это, или помеха). и в течении промежутка времени, скажем 30 мс, производим 5 замеров. если все 5 замеров оказались одинаковыми, то делаем действие. если же нет, то выход, и ждем нового нажатия кнопки.
                      Если случится помеха, то ложное нажатие МК поймает один раз, и быстро отсеет эту помеху.
                      При дребезге, который и длится примерно 30 мс, хоть один замер, да покажет ненажатое состояние. хотя и тут вероятность есть получить 5 положительных результатов в течение этого дребезга. если не ошибаюсь 3% при пяти замерах в течение дребезга в котором вероятность 50 на 50 появление высокого и низкого уровня). Но это не страшно, так как если есть дребезг, значит на кнопку нажимают. и за 30 мс мы проскочим через дребезг

                      Можно ли считать такую программную защиту от дребезга надежной? ну и в совокупности с аппаратной. Если DI HALT не против, могу потом и про такую защиту от помех написать статью.

                    2. Тут Вы должны для себя решить, как реализовать программно антидребезг: сканировать в цикле N-число раз и принять за нажатие кнопки К-число последовательных положительных результатов (а, уж, как часто запускать такие циклы решать вам) или, же, скажем, посредством таймера в 10мс сделать два или три сканирования (если положительных результатов столько же, то срабатывание).
                      В первом случае Вы как бы определяете, находитесь ли внутри дребезга или вне. (Чаще такой способ определения совмещают с внешним прерыванием от клавиатуры.)
                      Во втором случае, определив один раз положительный результат, вы возвращаетесь через интервал, когда дребезг «улегся» и сверяетесь с первым результатом.
                      А, уж, потом обрабатываете кнопку как Вам угодно: защита от частого нажатия, запрещеные комбинации, срабатывание на отжатие, поведение при удержании и т.п.
                      Но, повторюсь, что в последнее время использую описанную мной аппаратную защиту от напастей и в программе только раз опрашиваю кнопки и принимаю решение.

                    3. хорошо, спасибо за разъяснение. Использую программную борьбу с помехой во второй части статьи)

  6. Такое решение на самом деле использовалось… В джостиках Dendy 8-ми битки которые :) В Радио была онисана «обратная» конструкция. Там джостик подключали: сдвиговый регистр с паралельными выходами, регистр защёлка, счетчик и генератор. Так что второе название СТАТЬИ ДОЛЖНО БЫТЬ «Как подключить джостик денди к контроллеру» ;)

  7. Я для увеличения количества портов ввода планирую использовать К155КП1 — селектор-мультиплексор данных на 16 каналов. Количество ножек МК при это необходимо 6. Для следующих 16 каналов +1.

    1. С селекторрами-мультеплексорами не сталкивался. Надо будет посмотреть что за звери, и на что способны) у них плюсы перед сдвиговыми регистрами есть?

  8. мультиплексор коммутирует каналы/поток данных на 1 ножку. При этом направление в обе стороны. Канал выбираеться через адресные ножки. Номер канала соответствтет числан от 0 до 15 в двоичном коде.

    1. В обе стороны пропускают далеко не все мультиплексоры. Из ТТЛ- никакие (ЕМНИП). И число коммутируемых каналов начинается с двух. Например, есть мультиплексоры типа 555КП11, в них 4 двухканальных мультиплексора с общим адресным входом (иногда полезно коммутировать 4 пары сигналов). Желающие могут погуглить)

      1. Речь о том что:
        >DI HALT января 3, 2011 at 20:56
        >Одно дело на форуме побухтеть, другое дело расписать от и до :)

        Если я не ошибаюсь, то easyelectronics статей по этой теме нет. Это немного разочаровывает.

  9. Мое мнение: поделка чисто для домашнего пользования. Использование ТТЛ микросхем. Жручие. Я уже больше 10 лет ничего на них не паяю. И выкинул почти все запасы ТТЛ микросхем. Работаю с КМОП микросхемами и микроконтроллерами AVR.
    До недавнего времени я ни разу не использовал SPI. А также динамическую индикацию светодиодных семисегментных индикаторов. Нужно было сделать измеритель размера для бумагорезательной машины. Так как конечная схема была не ясна, взял большую макетную плату. На этой плате я оттестировал кучу схем. Мало того, на ней полгода экструдер (шлепает изделия из пластмасс, канистры, банки, например) отработал. В общем, я давно примерялся к схеме расширения ввода-вывода. В книге Вольфганга Трамперта «AVR-RISC микроконтроллеры» есть такая схема. Там используются для ввода 74HC165, для вывода 74HC595. Схема у меня получилась следующая: Вход-24 оптрона, 3 сдвиговых регистра 74HC165. Микроконтроллер. Выход-3 сдвиговых регистра 74HC595. Входы я оставил для последующих разработок, для измерителя размера использовал выходные регистры с верхними (TD62783APG) и нижними (ULN29803) ключами для динамической индикации.
    Программы пишу на асме. Если DIHALT-у и посетителям сайта будет интересно, выложу статью с примерами применения сдвиговых регистров.

    1. Ну речь то не о том, какую именно серию туда воткнуть. Тут что было то и поставили. В HCT тоже должна быть 198й регистр или похожий.

      1. Я хотел выяснить один момент. Ты активно используешь свою RTOS. И авторы статей пишут тут свои проекты с использованием твоей RTOS. Я готовлю статью. Программы пишу на карусельках. Многое сделано по другому. Скажу честно, не хочу подгонять свои проекты под твою RTOS. Как быть?

    2. До недавнего времени тоже успешно применял для вывода 74HC595, но есть один минус — куча резисторов и ограничение по току (для динамической индикации уже напряг, хотя, и на половинном токе св.диоды или семисегментники кажут нормально). Сейчас смотрю в сторону драйверов компании Macroblock, Inc. Резюк один — в задатчике тока.

          1. Я уже нашел драйверы по приведенному вами названию фирмы. По нижним ключам понятно. Как хотите решить ситуацию с верхними ключами?

            1. Я, похоже, не совсем понял задачу? Семисегментники имеют общую(ие) ногу(и) анода. В эти «ноги» я ставлю полевик, к примеру, IRLML6402. Далее, можно завести таймер на 10мс и по одной ноге через логику НЕ управлять динамикой (получается 50Гц — самое то).

              1. Ну, а если у вас 8 светодиодных индикаторов. С сегментами все ясно, ставим драйвер. Как вы анодами (верхние ключи) собираетесь управлять?

                1. Просто. Но… Давайте проясним ситуацию. Вы хотите в динамике задействовать 8 семисегментников? Это скважность — 8. Это значит, что для обеспечения индикатора паспортным средним (ибо, динамика) током, Вам на каждый придется подать 8 сегментов (включая точку) * 8 (скважность) * 20мА = 1.28А или на один сегмент 160мА. Не слишком ли расточительно? Да и о кристалле сегмента надо беспокоиться. И указа Как я говорил комфортно можно наблюдать цифры и при 12-15мА — ну, это 0.768А и 0.96А на индикатор и 96мА-120мА на сегмент, соответственно.
                  Думаю, стоит взять четыре 16-ти битных драйвера и объединить индикаторы попарно. Скважность уже 4. Но и этого (60мА на сегмент) пока много для указанных мною драйверов. Хотя, есть драйвер на 90мА в каждый канал.
                  И тогда мы приходим к решению, которое я применил в своей разработке: взял два 16-ти битных драйвера, каждый из которых обслуживает в прерывании 10мс таймера две пары индикаторов в зависимости от значения триггерного флага: в нечетный проход запись в драйверы (два раза прогоняем функцию последовательной записи — программная реализация) для двух пар индикаторов; в четный проход — для других пар индикаторов. Ну, понятно, что при таком раскладе на сегмент при скважности 2 приходится 25-30мА — нормально.
                  Что касается непосредственно ключей в анодных цепях? Для описанной динамики таких цепей четыре. В каждый ставим по упомянутому IRLML6402. На управление ими требуется две линии от МК, которые разделятся на четыре двумя инверторами. В нечетный проход 1 на одной линии и 1 на другой после того как будет записана информация в соответствующий драйвер, и в четный проход то же самое, но уже в 0 устанавливаем линии.
                  Итого, для управления индикацией нам понадобилось 6 линий от МК.
                  Но есть подводный камень в динамике — ничего не должно ее задерживать. То есть ее приоритет высший. Иначе индикация начнет переливаться по яркости из-за нарушений равного интервала времени на свечение каждого. Поэтому, иногда приходится применять статическую индикаци :( .

                2. Забыл предложить: если надо сброшу Вам на мыло (только укажите какое) скрин той части схемы, которая на примере отображает описанное.

  10. Камерады. А не подскажете ещё таких регистров? Я собираюсь городить клаву на 16 кнопок, а в Терре ничего такого нет. ИР13 ставить не хочу. Хочется чего-то посовременнее. Я понимаю что надо просто регистр со сдвигом и параллельной загрузкой?

    1. 74HC597 такой есть?) да, нужем сдвиговый регистр, с параллельной загрузкой и последовательным выходом.

    2. О! Нашёл вот что (в Терре): 74HC165 — сдвиговый регистр с параллельной загрузкой, последовательным выходом. Оно прокатит?

        1. Блин) Не умею %) Через недельки две живьём проверю!
          Я вообще прошерстил список на тему Parallel load shift register — там их уйма.

        2. А ещё во какой вопрос. Там написано про время 13 нс. Это примерно 70 МГц? Можно считывать без задержки вообще на 16МГц проца (ну кроме пары NOP’ов чтобы сам вывод успел переключиться)?

          1. а вот это я не знаю. на своей меге на 8 МГц считывал без задержек, и без NOP. Потом проверил экспериментально — все работает) так что стоит попробовать методом тыка)

            1. Вроде получается 1/(13*10^-9) = 76,92 МГц. Так что оно должно его тянуть как есть. Вобщем, я нафиг куплю регистр, соберу макетку и тут и отпишусь.

  11. можно подключить клавиатуру полноценную(PS/2) и на прерываниях реализовать(с отслеживанием нажатия\отпускания) через те-же 3 провода(общая земля, clk,data) :)

  12. Вот про ps\2 клавиатуру было бы жутко интересно!А то куча старых клавиатур лежит,так вообще для них применений можно кучу найти лишь бы знать как это к МК цеплять и как с ним работать.Читала статьи в инете,но там как правило все готовое(логгеры,законченные устройства)и не обьясняется ничего.А профит то какой-вместо того чтоб городить матричную,занимать ноги МК или на регистрах тоже еще тот огород.В клавиатурах один чип,и 105 кнопок,лишнее можно отрезать,а можно и свои кнопки туда вставить оставив лишь чип.

    1. Надо бы заняться да написать. А может кого попрошу. Вообще там протокол очень похож на обычный SPI скан коды идут открытым текстом.

  13. Можно использовать и обычный последовательн-паралельный регистр типа 155ИР8, таже схема только перевернутая наоборот :) только диоды защитные понадобятся чтобы не замкнуть выходы регистра, и резистор подтягивающий.

  14. Огромный + автору. DI HALT молодец!!!. Завтра микруху куплю буду эксперементы проводить, а то по порту челому на клаву жирно уделять. Есле не секрет чем вы на плату надписи наносите?

  15. Почитав статью появился вопрос.
    Данный метод позволяет использовать 3 ноги МК для 8 кнопок. Если, скажем, для 16меги, при ее 4*8=32 портах, возьмём 30 портов, навесим 30\3(ноги регистра)= 10шт. таких регистров. 10*8(портов регистра) —> 80 кнопок на один МК. Это реальная задача? С условием того, что могут быть одновременно включено любое количество кнопок.

    1. Там все проще. можно повесить и 80 кнопок на эти же 3 ножки микроконтроллера. Это я описал во второй части статьи, но ее еще пока не опубликовали. (если опубликуют еще)

  16. После прочтения данной статьи и медитирования пришла идея рацпредложения..)
    что, если не постоянно считывать состояние на входах, а только по прерыванию, которое приходит после нажатия хотя бы одной кнопки?…)
    так можно будет освободить некоторые ресурсы контроллера, да и само появление в программе прерывания по нажатию дает немаленький простор для программистской мысли…))

  17. А можно его использовать для управления шаговыми двигателями? если у мк мало ног например)

  18. можно сдвиговым управлять драйверами, а потом ШД. для расширения числа ножек лучше брать 74164 или 74595. в регистре из статьи ножки на вход будут незадействованны.

  19. Ребята, вопрос такой. Надо обеспечить расширяемость портов МК для подключения кнопок. Но сколько будет кнопок заранее неизвестно. Т.е. программа опроса должна быть одной и той же для любого кол-ва кнопок. Возможно ли реализовать такое с помощью данного способа (несколько сдвиговых регистров друг за дружкой), не привязываясь к их количеству? При этом качественно все опросить.

    1. Если заранее знать максимальное количество кнопок, которое только может быть. Под них сделать нужное количество сдвиговых регистров. Далее все эти регистры сканируем и храним в переменных в микроконтроллере. А там уже по необходимости и желанию использовать нужные.
      Или написать такую прошивку, в которой в настройках можно указывать количество сдвиговых регистров, подключенных в данный момент. Эти данные можно хранить в ЕЕПРОМ. и при желании — просто подпаять еще один сдвиговый регистр, запустить микроконтроллер, методом нажимания кнопочек изменить количетсво сдвиговых регистров, которые должен сканировать микроконтролер.

      1. Спасибо за ответ!
        Вообще есть идея к семи выводам регистра подключить кнопки (подтянуты к плюсу), а восьмой вывод каждого регистра пустить на МК. Подаём лог. 0 на эти восьмые выводы и считываем всё в МК. По кол-ву нулей определяем кол-во регистров, а дальше опрашиваем их без труда. Минус в том, что один вывод регистра теряется.

  20. А подскажите как опросить 74hc597. я подаю импульс на STcp затем начинаю подавать тактовый импульс на SHcp и пытаюсь принять данные, ничего не идет. не могу вкурить как подключить PL и MR.

Добавить комментарий

Ваш e-mail не будет опубликован.

Перед отправкой формы:
Human test by Not Captcha