Вывод правильных данных в сдвиговый регистр с синхронизацией часов от микроконтроллера

Я хочу иметь возможность выводить правильные данные из микроконтроллера в сдвиговый регистр 74HC595 без отдельного использования тактовых линий. Эта схема соответствует моим идеям для 16 бит данных:

Регистр сдвига

Микросхема, которую я использую, основана на 8051 (at89C2051).

Если бы линии RCK и SCK были подключены к микроконтроллеру отдельно, то мой код для отправки данных был бы следующим:

RCK equ P1.1
SCK equ P1.2
DATA equ P1.3
LOWBYTE equ 20h
HIGHBYTE equ 21h

clr SCK
clr RCK
mov A,HIGHBYTE
mov R1,#8h
send1:
  rlc A
  mov DATA,C
  nop
  setb SCK
  nop
  clr SCK
djnz R1,send1

mov A,LOWBYTE
mov R1,#8h
send2:
  rlc A
  mov DATA,C
  nop
  setb SCK
  nop
  clr SCK
djnz R1,send2
setb RCK
nop
clr RCK

Но у меня недостаточно контактов GPIO на моем микро, чтобы обеспечить отдельные линии синхронизации, и у меня недостаточно места на плате для большего микро. Поэтому я попытался закодировать строки, связанные вместе следующим образом. Здесь CK означает все часы, связанные вместе:

CK equ P1.2
DATA equ P1.3
LOWBYTE equ 20h
HIGHBYTE equ 21h

clr CK
mov A,HIGHBYTE
mov R1,#8h
send1:
  rlc A
  mov DATA,C
  nop
  setb CK
  nop
  clr CK
djnz R1,send1

mov A,LOWBYTE
mov R1,#8h
send2:
  rlc A
  mov DATA,C
  nop
  setb CK
  nop
  clr CK
djnz R1,send2

Где-то кто-то упомянул, что часы сдвига (SCK) опережают часы фиксации данных (RCK), когда они связаны и используются вместе, но как мне применить это в моем коде и при этом обеспечить отправку правильных 16 бит? выходные строки сдвигового регистра?

Подсказка: вы можете использовать инвертор на тактовой линии, чтобы передний фронт сдвигал данные, а задний фронт загружал регистр, но вы можете захотеть, чтобы порядок был противоположен тому, что я написал. В таком случае просто поменяйте местами подъем/спуск.
Обратите внимание, что в упомянутой мной схеме вы загружаете НЕ побайтно, а по одному биту за раз. Попробуйте придумать запасную булавку для важного аппаратного управления.
Так ты говоришь, что мне лучше вообще никогда не соединять часы вместе? (время для более сложной проводки, я думаю....)
Майк, вы действительно НЕ хотите связывать SRCLK и RCLK вместе. Или, если вы свяжете их вместе, вам нужно знать, что система ворот не будет работать должным образом. (На самом деле, я не уверен, что поведение определено в этом случае.) Однако, если вы подключите инвертор между SRCLK и RCLK, это будет работать нормально. Держите SRCLK подключенным непосредственно к вашему MCU. Используйте инвертор между этой линией и RCLK. В противном случае, очень приятно иметь RCLK отдельно. Это позволяет вам перемещать материал, не влияя на вывод, пока вы не будете готовы заблокировать его. (Или вы можете использовать строку /OE, я полагаю.)

Ответы (1)

В идеале вы хотите загрузить 16 бит данных с помощью SCK, а затем вывести все 16 бит параллельно с помощью RCK. Связывание SCK и RCK вместе делает нормальную операцию переключения/нагрузки практически невозможной. Обычно OE/G имеет низкий уровень, поэтому выходы всегда включены. Нет необходимости выключать, если только другая пара 74LS585 не будет управлять теми же 16 выходами.

Если все 16 выходов должны поддерживать состояние, а затем изменять состояние одновременно, необходимо выполнить правильную последовательность переключения/загрузки.

Идея правильного использования MPU заключается в том, чтобы зарезервировать столько контактов, сколько необходимо для управления внешним оборудованием. Это требует детального планирования заранее, поэтому сначала вы назначаете обязательные функции.

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

Просто из любопытства, как вы закоротили контакт управления на 20-контактном MPU? Были ли остальные контакты уже привязаны к существующему оборудованию?