Ausgabe korrekter Daten auf Schieberegister mit Takten, die vom Mikrocontroller gebunden sind

Ich möchte in der Lage sein, korrekte Daten vom Mikrocontroller an das Schieberegister 74HC595 auszugeben, ohne die Taktleitungen separat zu verwenden. Dieses Schema entspricht meinen Ideen für 16 Datenbits:

Schieberegister

Das Mikro, das ich verwende, basiert auf 8051 (at89C2051).

Wenn die RCK- und SCK-Leitungen separat mit dem Mikrocontroller verbunden wären, wäre mein Code zum Senden der Daten wie folgt:

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

Aber ich habe nicht genug GPIO-Pins an meinem Mikro, um separate Taktleitungen zu ermöglichen, und ich habe nicht genug Platz auf der Platine für ein größeres Mikro. Also habe ich versucht, Code mit den Zeilen wie folgt zusammenzubinden. Hier bedeutet CK alle aneinander gebundenen Uhren:

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

Irgendwo hat jemand erwähnt, dass der Shift-Takt (SCK) dem Daten-Latch-Takt (RCK) um eins voraus ist, wenn sie verknüpft und zusammen verwendet werden, aber wie wende ich dies in meinem Code an und stelle trotzdem sicher, dass die richtigen 16-Bits gesendet werden die Ausgangsleitungen des Schieberegisters?

Hinweis: Sie könnten möglicherweise einen Inverter auf der Taktleitung verwenden, damit eine steigende Flanke Daten verschiebt, während die fallende Flanke das Register lädt, aber Sie möchten vielleicht, dass die Reihenfolge entgegengesetzt zu dem ist, was ich geschrieben habe. In einem solchen Fall kehren Sie einfach die Steig-/Fall-Verbindungen um.
Beachten Sie, dass Sie mit dem von mir erwähnten Schema NICHT jeweils ein Byte laden, sondern jeweils ein einzelnes Bit. Versuchen Sie, einen Ersatzstift für die entscheidende Hardwaresteuerung zu finden.
Du sagst also, ich wäre besser dran, die Uhren gar nicht erst zusammenzuzählen? (Zeit für komplexere Verkabelung, denke ich ....)
Mike, du willst SRCLK und RCLK wirklich NICHT miteinander verbinden. Oder wenn Sie sie zusammenbinden, müssen Sie sich darüber im Klaren sein, dass das Gating-System nicht wie erwartet funktioniert. (Tatsächlich bin ich mir nicht sicher, ob das Verhalten in diesem Fall angegeben ist.) Wenn Sie einen Wechselrichter zwischen SRCLK und RCLK verdrahten, funktioniert das jedoch einwandfrei. Halten Sie SRCLK direkt an Ihre MCU angeschlossen. Verwenden Sie einen Inverter zwischen dieser Leitung und RCLK. Ansonsten ist es wirklich schön, RCLK separat zu haben. Das erlaubt Ihnen, Dinge hineinzuschieben, ohne die Ausgabe zu beeinflussen, bis Sie bereit sind, sie auszurasten. (Oder Sie können die /OE-Zeile verwenden, nehme ich an.)

Antworten (1)

Idealerweise möchten Sie 16 Bit Daten mit dem SCK laden und dann alle 16 Bit parallel mit dem RCK ausgeben. Das Zusammenbinden von SCK und RCK macht einen normalen Schalt-/Ladebetrieb nahezu unmöglich. Normalerweise ist OE/G niedrig, sodass die Ausgänge immer eingeschaltet sind. Ausschalten ist nicht erforderlich, es sei denn, ein anderes 74LS585-Paar würde dieselben 16 Ausgänge ansteuern

Wenn alle 16 Ausgänge den Zustand beibehalten und dann gleichzeitig den Zustand ändern müssen, muss eine ordnungsgemäße Schalt- / Ladesequenz durchgeführt werden.

Die Idee, eine MPU richtig zu verwenden, besteht darin, so viele Pins wie nötig zu reservieren, um die Kontrolle über externe Hardware zu erlangen. Dies erfordert eine detaillierte Planung im Voraus, sodass Sie zuerst obligatorische Funktionen zuweisen.

Übermäßige Pins sind viel besser, als bei den obligatorischen Kontrollpins zu kurz zu kommen.

Nur aus Neugier, wie sind Sie auf einen Steuerpin auf einer 20-Pin-MPU gekommen? Wurden die restlichen Pins bereits für vorhandene Hardware festgelegt?