Salida de datos correctos en el registro de desplazamiento con relojes vinculados desde el microcontrolador

Quiero poder enviar datos correctos desde el microcontrolador al registro de desplazamiento 74HC595 sin usar las líneas de reloj por separado. Este esquema coincide con mis ideas para 16 bits de datos:

registro de turnos

El micro que estoy usando está basado en 8051 (at89C2051).

Si las líneas RCK y SCK estuvieran conectadas al microcontrolador por separado, mi código para enviar los datos sería el siguiente:

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

Pero no tengo suficientes pines GPIO en mi micro para permitir líneas de reloj separadas y no tengo suficiente espacio en la placa para un micro más grande. Así que intenté codificar con las líneas unidas de la siguiente manera. Aquí, CK significa todos los relojes unidos:

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

En algún lugar, alguien mencionó que el reloj de cambio (SCK) está uno por delante del reloj de bloqueo de datos (RCK) cuando están vinculados y se usan juntos, pero ¿cómo aplico esto en mi código y me aseguro de que se envíen los 16 bits correctos? las líneas de salida del registro de desplazamiento?

Sugerencia: posiblemente podría usar un inversor en la línea del reloj para que un flanco ascendente cambie los datos mientras que el flanco descendente carga el registro, pero es posible que desee que el orden sea el opuesto al que escribí. En tal caso, simplemente invierta las conexiones de subida/bajada.
Tenga en cuenta que con el esquema que mencioné, NO está cargando un byte a la vez, sino un solo bit a la vez. Intente encontrar un pin de repuesto para el control de hardware crucial.
Entonces, ¿estás diciendo que es mejor que nunca junte los relojes en primer lugar? (supongo que es hora de un cableado más complejo...)
Mike, realmente NO quieres unir SRCLK y RCLK. O bien, si los une, debe tener en cuenta que el sistema de activación no funcionará como se esperaba. (De hecho, no estoy seguro de que el comportamiento se especifique en ese caso). Sin embargo, si conecta un inversor entre SRCLK y RCLK, funcionará bien. Mantenga SRCLK conectado directamente a su MCU. Use un inversor entre esa línea y RCLK. De lo contrario, es muy bueno tener RCLK, por separado. Eso le permite cambiar cosas sin afectar la salida hasta que esté listo para soltarlas. (O puede usar la línea /OE, supongo).

Respuestas (1)

Idealmente, desea cargar 16 bits de datos usando el SCK, luego generar los 16 bits en paralelo usando el RCK. La unión de SCK y RCK hace casi imposible la operación normal de cambio/carga. Normalmente, OE/G es bajo, por lo que las salidas siempre están activadas. No es necesario apagar a menos que otro par 74LS585 esté manejando las mismas 16 salidas

Si las 16 salidas necesitan mantener el estado y luego cambiar de estado al mismo tiempo, se debe realizar una secuencia de cambio/carga adecuada.

La idea de usar una MPU correctamente es reservar tantos pines como sea necesario para controlar el hardware externo. Esto requiere una planificación detallada por adelantado, por lo que primero asigna las funciones obligatorias.

Los pines excesivos son mucho mejores que quedarse cortos en los pines de control obligatorios.

Solo por curiosidad, ¿cómo te quedaste corto con un pin de control en una MPU de 20 pines? ¿El resto de los pines ya estaban comprometidos con el hardware existente?