Здравствуйте,
да, здесь уже было про 74hc165, и поиск тому подтверждение, но у меня не получилось просто взять схему из интернета и воткнуть "лишь бы заработало", и такая элементарная (для кого то) задача вызвала кучу вопросов:
есть блок на 16 кнопок, 74hc165 и МК (16Мгц),
нужно последовательно получить состояние всех кнопок, при этом нужно иметь ввиду, что в предыдущем цикле могли быть считаны не все 16, а например, 13 кнопок, поэтому нужно при каждом чтении заново записывать данные в параллельные регистры. Количество управляющих сигналов надо свести к минимуму.
1) Читаю документацию по 74hc165 от NXP - "When the parallel load (!PL) input is LOW, parallel data from the D0 to D7 inputs are loaded into the register asynchronously.", я это понимаю так, что когда на !PL низкий уровень, то что есть на входах D0-D7 то и будет на внутреннем регистре вне зависимости от других сигналов типа !CE или CP. Далее пишут "When !PL is HIGH, data enters the register serially at the DS input and shifts one place to the right (Q0 -> Q1 -> Q2, etc.) with each positive-going clock transition." т.е. когда на !PL высокий уровень, с каждым нарастающим фронтом на CP данные во внутреннем регистре будут сдвигаться на 1 позицию, при этом в первый D триггер будет записано значение из DS. Тут не ошибся?
2) "The clock input is a gated-OR structure which allows one input to be used as an active LOW clock enable (!CE) input. The pin assignment for the CP and !CE inputs is arbitrary and can be reversed for layout convenience." - !CE и CP подключены через лог. вентиль типа ИЛИ, и несмотря на названия, их можно менять местами ?
3) "The LOW-to-HIGH transition of input !CE should only take place while CP HIGH for predictable operation." - т.е. если 2 верно, то для того чтобы один использовать для чтения строба, на втором должен быть высокий уровень?
4) "Either the CP or the !CE should be HIGH before the LOW-to-HIGH transition of !PL to prevent shifting the data when !PL is activated." - если на выбраном (выше) !CE будет низкий сигнал, то при переключении !PL с низкого на высокий уровень произойдёт сдвиг?
5)(длинный
) :
Сначала решил соединить так:
74hc165#1 DS -> GND
74hc165#1 Q7 -> 74hc165#2 DS
74hc165#1 !CE -> 74hc165#2 !CE -> GND
74hc165#1 !PL -> 74hc165#2 !PL -> MCU
74hc165#1 CP -> 74hc165#2 CP -> MCU
74hc165#2 Q7 -> MCU
D0-D7 каждого к кнопкам (между кнопками и регистрами стоят max6818 (время устранения дребезга 60мс))
название, номер пина, описание
!PL 1 asynchronous parallel load input (active LOW)
CP 2 clock input (LOW-to-HIGH edge-triggered)
!Q7 7 complementary output from the last stage
GND 8 ground (0 V)
Q7 9 serial output from the last stage
DS 10 serial data input
D0 to D7 11, 12, 13, 14, 3, 4, 5, 6 parallel data inputs (also referred to as Dn)
!CE 15 clock enable input (active LOW)
VCC 16 positive supply voltage
Управление 2мя сигналами - !PL, CP, данные - Q7 второго регистра. на !CE всегда низкий уровень
Алгоритм:
1. вначале подаём низкий уровень на !PL
2. ждём 139нс (по документации "input transition rise and fall rate, VCC = 4.5V, Max=139ns" что кстати ограничивает частоту загрузки данных в каждый регистр до ~7Мгц, это так?), данные записываются во внутренний регистр, читаем первый из 16 бит с Q7 (на второй МС)
3. подаём высокий уровень на !PL
4. ждём 139нс чтобы дать время на запись Q7 первой микросхемы в DS второй
5. начинаем в цикле (16-1 итераций) подавать на CP импульсы, здесь нужна задержка между фронтами импульса ? (МК работает на 16Мгц, можно ли здесь иставить две инструкции установки нужного бита порта в 0 и 1 подряд или нужна задержка?)
6. после каждого импульса CP читаем бит из Q7 второй микросхемы. (нужна ли задержка ?)
7. конец
Ну и как бы всё нормально, так как алгоритм начинается с подачи низкого уровня на !PL то не важно что было до этого во внутренних регистрах.
6) Однако на просторах интернета было обнаружено предложение соединить !PL и CP и управлять с помощью одного сигнала, это возможно? Какой будет алгоритм?
Заранее благодарен.
P.S. Несмотря на то что период max6818=60мс, читать надо на макс. возможной скорости, так чтение состояния кнопок и вывод данных на светодиоды это основная программа, а критические части имеют свои кнопки с прерываниями.
Раздел: Начинающим