Forum: Mikrocontroller und Digitale Elektronik Verständnisproblem 74hc165 Funktion


von H-G S. (haenschen)


Angehängte Dateien:

Lesenswert?

Hallo,

mir erschliesst sich die genaue Funktion des 
74hc165-Parallel-zu-seriell-Umwandlerchips nicht so richtig.

Benötigt man wirklich 8 CLK-Takte um die 8 Bits aus dem Latch an Q7 
ausgegeben zu bekommen ?

Oder liegt D7 bereits an Q7 an (nach dem Latch-Laden) und man braucht 
nur 7 CLK-Takte um alle Datenbits seriell auszulesen ?


Ich habe die unklare Stelle mit einem Pfeil markiert.
Es sieht irgendwie nach 8 Takten aus, es geht aber der CLKINH runter mit 
dem ersten (aktiven ?) Takt.

von Falk B. (falk)


Lesenswert?

@H-G Sch (haenschen)

>Benötigt man wirklich 8 CLK-Takte um die 8 Bits aus dem Latch an Q7
>ausgegeben zu bekommen ?

Nein, das MSB ist nach dem Laden direkt am Ausgang lesbar.

>Oder liegt D7 bereits an Q7 an (nach dem Latch-Laden) und man braucht
>nur 7 CLK-Takte um alle Datenbits seriell auszulesen ?

Es reichen 7, wenn man nur ein Schieberegister hat. Aber der Empfänger, 
meist ein SPI, braucht 8 Lesetakte, um die 8 Bits zu lesen.

von karadur (Gast)


Lesenswert?

Mit fallender Flanke SH/LD gelangt Eingang H an QH.

Wird CLKINH L wird mit den folgenden 8 Clocks geschoben.

von H-G S. (haenschen)


Lesenswert?

Ich habe gleich 3 davon in Reihe an einem 8051 hängen :-)
Dazu noch Layouttechnisch überkreuzte Eingangspins.

Also mit den 8 CLK-Impulsen habe ich noch recht lustige (obwohl nicht 
richtige) Ergebnisse bekommen. Mit den 7 Impulsen fehlten sogar einige 
der Datenbits.


Kann man eigentlich davon ausgehen dass der erste Takt in dem Diagramm 
an der Spitze des roten Pfeils gültig ist ? Also da wo CLKINH runtergeht 
?

: Bearbeitet durch User
von karadur (Gast)


Lesenswert?

Kurze Leitungen ?
Blockkondensatoren an den ICs ?

Die Daten werden wenn CLKINH=L mit der steigenden Flanke an CLK 
geschoben.

von Manfred K. (mkch)


Angehängte Dateien:

Lesenswert?

Hallo,
es sind definitiv 8 Schiebetakte notwendig, um die Daten des 165 zu 
lesen. Siehe Anlage. Es kann zwar der QH ohne jeden Schiebetakt gelesen 
werden, aber da steht ja irgendwas aus der letzten Schiebeoperation 
drin.
Grüße Manfred

von Falk B. (falk)


Lesenswert?

@Manfred Koch (mkch)

>es sind definitiv 8 Schiebetakte notwendig, um die Daten des 165 zu
>lesen. Siehe Anlage. Es kann zwar der QH ohne jeden Schiebetakt gelesen
>werden, aber da steht ja irgendwas aus der letzten Schiebeoperation
>drin.

Nö, nach dem erneuten, weil sowieso nötigen _LD Puls steht dort das neue 
H Signal an QH an.

von Manfred K. (mkch)


Lesenswert?

Hallo nochmals,
was Herr Brunner schreibt stimmt natürlich, Entschuldigung, ich habe 
mich vertan.
Gruß Manfred

von H-G S. (haenschen)


Lesenswert?

Wenn die rote Pfeilspitze als Takt zählt müssen es wirklich 8 Takte 
sein, also wird mit dem ersten Takt "H" gehalten obwohl es die ganze 
Zeit schon anliegt...

Nunja meine Programmversion mit den 8 Takten hatte fast richtig 
angezeigt, die Nibble waren nur um eine Stelle verschoben :-)

Ich werde wohl nicht drumherum kommen eine Debug-Hardware aufzubauen um 
jeden Eingangsport zu beschalten und die kompletten 8x3 Eingänge an den 
Ausgangsports anzeigen zu lassen. Ich musste mir sowieso einen 
Portmonitor aus 8 Leds und einem Widerstandsnetzwerk zusammenfunzeln ... 
bei so vielen Bugs braucht man so etwas schon :-)

von A. S. (Gast)


Lesenswert?

Du must vielleicht bedenken, dass die Daten mit der Clock-High-Flanke 
weitergetaktet werden. Das bedeutet, dass Du sie mit der LOW-Flanke 
einlesen musst. Dass bedeutet, dass Du also 7.5 Takte brauchst. Der 
letzte halbe Takt ist dann "über", aber 7 reichen nicht.

Bei SPI-Modulen im µC kannst du i.d.R. einstellen, auf welcher Flanke 
gesampelt werden soll.

von H-G S. (haenschen)


Lesenswert?

In dem Diagramm sieht man keine Änderung bei der Low-Flanke des 
CLK-Taktes.

Aber ich sah dass in scheinbar allen Tutorials im Netz der 
CLK-Enable-Eingang des Schieberegisters an den Controller geführt wird, 
also 4 Leitungen benutzt werden.

Ich habe den CLK-Enable einfach auf GND verbunden und nur 3 Leitungen am 
Controller. Laut Datenblatt sollte das eigentlich auch funktionieren 
meine ich ...

Edit: die Tutorials setzen erst den CLK auf 1 und dann den CLK-Enable 
auf Low dann gehts weiter. Leider sind das allesamt üble 
Arduino-Programme die nicht so einfach die genaue Taktung anzeigen.

: Bearbeitet durch User
von Achim (Gast)


Lesenswert?

Was ist denn Deine Frage, was funktioniert denn nicht oder schon, auf 
was bezieht sich Deine Aussage mit der low-flanke?

von H-G S. (haenschen)


Lesenswert?

Achim schrieb:
> Was ist denn Deine Frage, was funktioniert denn nicht oder schon, auf
> was bezieht sich Deine Aussage mit der low-flanke?

Das mit der Low-Flanke bezog sich auf den Post von Achim S.



Ich habe jetzt den Code umgeschrieben und die reingeschobenen Daten des 
ersten Schieberegisters 1:1 auf einem Ausgangsport anzeigen lassen (in 
Binärform mit LEDs).

Es sieht aus als wäre alles um eine Stelle Richtung D7 verschoben.
Ich habe (insgesamt drei mal) 8 mal CLK hochgeflankt und anschliessend 
jeweils den Portpin in das Carrybit eingelesen und anschliessend ein 
"RLC A" ausgeführt und den Akku nach 8 mal rotieren in den Speicher 
geschrieben.

Theoretisch müssten dadurch alle 24 Bit der 3 kaskadierten 74hc165 
eingelesen worden sein.

Das Schieberegister von Interesse ist das erste in der Kaskade (kommt 
also
als Letztes am Controller an), und es scheint dass es um eine Stelle 
zuviel geschoben wurde - also D0 des Schieberegisters auf D1 des 
Ausgabeports kommt. Am Ausgabeport und dessen Routine wird es wohl nicht 
liegen, denn ich habe schon soviel richtig ausgegeben ...

Dickes EDIT: im letzten Absatz!

: Bearbeitet durch User
von H-G S. (haenschen)


Lesenswert?

Update:

Ich habe das Programm versuchshalber so umgeschrieben, dass der 
Schiebe-CLK auf Low ist bevor ich Shift/Load durchführe.

Leider brachte das keine Besserung: D0 des Schieberegisters gelangt auf 
D1 des Ausgangs.



Ich hatte nämlich die Eingebung dass am Anfang der 24 Schiebetakte beim 
Shift/Loaden wegen dem High-CLK ein extra-Schiebetakt ausgelöst wird - 
scheint aber doch nicht der Fall zu sein.

Edit: ich hänge das nächste mal mein fummeliges Binärzähler-Board dran 
und zähle die Schiebetakte.

: Bearbeitet durch User
von H-G S. (haenschen)


Lesenswert?

Die Messung mit meinem Zählermodul zeigt tatsächlich 25 CLK-Impulse an!

Was aber kurios ist:
Am Shift/Load-Pin des 74hc165 zeigt der Zähler ganze 26 Impulse an :-)
Obwohl ich nur einen Durchlauf des Programms habe (Endlosschleife nach 
einem Durchlauf der Einleseroutine) und Shift/Load eigentlich nur einmal 
kurz auf Low und wieder zurück gehen sollte laut Programm.

Ich habe die Zählungen wiederholt und es kam immer das Gleiche heraus.


Übrigens war QH des ersten 74hc165 nur einmal High das heisst es ging da 
nur das eine an D0 angelegte Testbit durch das Schieberegister.


Edit: vielleicht sollte ich die Schaltung, das Layout und die 
Port-Pinbelegung nochmal prüfen ...

: Bearbeitet durch User
von A. S. (Gast)


Lesenswert?

Ich habe den Thread nochmals durchgeschaut, aber ich habe Deinen Code 
noch nicht gesehen. Ich nehme an, Du toggelst selber an den Pins? Dann 
mach es doch so langsam, dass Du es mit dem Auge verfolgen kannst, also 
jede s ein Clockwechsel. Und eine 5V-LED an Clock und Dout etc.

H-G S. schrieb:
> Das mit der Low-Flanke bezog sich auf den Post von Achim S.

H-G S. schrieb:
> In dem Diagramm sieht man keine Änderung bei der Low-Flanke des
> CLK-Taktes.

Das ist der Grund, warum das Samplen mit der Low-Flanke erfolgt.

Sofort Nach der High-Flanke stellt sich der nächste Ausgangspegel ein. 
Das Samplen kann zwar dementsprechend auch wenige ns vorher erfolgen, 
das ist aber schwierig, hier die Laufzeiten alle richtig zu 
berücksichtigen und dann ein "kurz-davor" zu realisieren.

Darum schaltet man das neue Signal mit der High-Flanke weiter und 
sampled es mit der Low-Flanke.

Wenn Du es mit der High-Flanke samplen würdest, bräuchtest Du ebenfalls 
8 Takte, da Du mit jeder High-Flanke das vorherige Signal samplest.

von Michael U. (amiga)


Lesenswert?

Hallo,

die 74xx165 schieben mit der Low->High Flanke an Clock.
Natürlich gibt es dann verzögerungszeiten bis der Ausgang gültig ist.
Die Timing-Diagramme sind ja auch im Datenblatt.

CP L->H, minimale Clockbreite warten, CP H->L und Daten einlesen usw. 
wäre ein sinnvoller Ablauf.

Gruß aus Berlin
Michael

von H-G S. (haenschen)


Lesenswert?

Ich löte jetzt zuerst ein paar Pullups an die Leitungen CLK und SH/LD 
und teste ob es dann funktioniert.

Falls nicht werde ich wie von euch empfohlen Wartezyklen einfügen und 
erst nach der fallenden CLK-Flanke einlesen.


Edit: die Idee mit den LEDs an den Signalen ist auch gut, obwohl sie 
mögliche Störimpulsflanken nicht anzeigen wird sondern nur statische 
Zustände. Aber vielleicht muss ich das am Ende doch machen  :-)

: Bearbeitet durch User
von H-G S. (haenschen)


Lesenswert?

Ich bin jetzt einen Debug-Schritt weiter  :-)


Nachdem ich an CLK und SH/LD jeweils einen 4,7k Pullup lötete reduzierte 
sich die Impulszahl an SH/LD auf 1, daraus schliesse ich dass das 
Übersprechen damit beseitigt wäre.

An CLK sind immer noch 24 Impulse, leider erscheint am Ausgang immer 
noch D0 auf D1 usw. - also um eine Stelle zu weit links.


Ich habe noch dazu einzigartige Bitmuster an die Ausgangsports geschickt 
um festzustellen ob da ein Fehler ist. Die Muster wurden aber 
einwandfrei ausgegeben, also haben die Ausgangsports und die 
Ausgabesoftware sehr wahrscheinlich keinen Bug.



Mir bleibt jetzt wohl nichts anderes übrig als (wie empfohlen) ein paar 
LEDs an CLK, SH/LD etc. anzubringen, die Impulsgeschwindigkeit in den 
Sekundenbereich zu reduzieren und das Ganze zu beobachten bzw. zu 
zählen.

: Bearbeitet durch User
von A. S. (Gast)


Lesenswert?

H-G S. schrieb:
> An CLK sind immer noch 24 Impulse, leider erscheint am Ausgang immer
> noch D0 auf D1 usw. - also um eine Stelle zu weit links.

Ich nehme an, das erste Bit geht verloren. Wenn das so ist, (und du 
Weiterhin bei der Low-Flanke samplest), dann must Du erst samplen und 
dann clocken.

Wenn das erste Bit doppelt ist, dann geschieht beim ersten Clock noch 
etwas anderes (z.B. mit CLKINH). Dann ignoriere den ersten Clock.

von H-G S. (haenschen)


Lesenswert?

Nach langer Fummelei weiss ich jetzt dass direkt nach der steigenden 
Flanke des 23. CLK-Pulses der Ausgang Qh des letzten Schieberegisters 
das Bit D0 des ersten Schieberegisters anzeigt.

Das heisst wohl dass tatsächlich irgendwo einmal zuviel geschoben wird - 
vermutlich gleich zu beginn.


Ich könnte das vielleicht mit einem weiteren Versuch irgendwie testen ob 
es bereits vor dem ersten CLK-Puls eine Reaktion an Qh des ersten 
Schieberegisters gibt. Dazu müsste ich an die Eingänge des ersten 
Schieberegisters ein bestimmtes Muster anlegen.

von A. S. (Gast)


Lesenswert?

H-G S. schrieb:
> Nach langer Fummelei weiss ich jetzt dass direkt nach der steigenden
> Flanke des 23. CLK-Pulses der Ausgang Qh des letzten Schieberegisters
> das Bit D0 des ersten Schieberegisters anzeigt.

Das deckt sich verdächtig mit der ersten Antwort!

Falk B. schrieb:
> Nein, das MSB ist nach dem Laden direkt am Ausgang lesbar.
>
>>Oder liegt D7 bereits an Q7 an (nach dem Latch-Laden) und man braucht
>>nur 7 CLK-Takte um alle Datenbits seriell auszulesen ?
>
> Es reichen 7, wenn man nur ein Schieberegister hat. Aber der Empfänger,
> meist ein SPI, braucht 8 Lesetakte, um die 8 Bits zu lesen.

Du brauchst nach dem 23. Clk-Impuls doch noch die nächste Low-Flanke, um 
das Bit auch zu samplen.

Mit der ersten Low-Flanke vor dem ersten Takt ergibt das 24 Samples.

von H-G S. (haenschen)


Angehängte Dateien:

Lesenswert?

Ich denke ich bin nach etlichen Messungen zu einem Abschlussergebnis 
gekommen:

1) Ein Puls an SH/LD (von High auf Low und wieder auf High) bewirkt dass 
sofort D7 von Schieberegister 3 an dessen Ausgang Q7 anliegt.

2) Die ansteigende Flanke des ersten CLK-Pulses schiebt D6 des 
Schieberegisters 3 in seinen Ausgang Q7.




Das bedeutet wohl dass man sofort nach dem SH/LD-Puls den Wert von D7 
des dritten Schieberegisters in den 8051 lesen muss weil er sonst mit 
dem ersten CLK-Puls verloren geht.

Ausserdem muss man wohl nur 23 CLK-Pulse aussenden, um die verbleibenden 
23 Eingänge einzulesen.

von Georg G. (df2au)


Lesenswert?

H-G S. schrieb:
> 1) Ein Puls an SH/LD (von High auf Low und wieder auf High) bewirkt dass
> sofort D7 von Schieberegister 3 an dessen Ausgang Q7 anliegt.

Hattest du von einem Eingang mit der Bezeichnung "LOAD" ein anderes 
Verhalten erwartet? Die Daten erscheinen mit der fallenden Flanke am 
Pin. So steht es im Datenblatt.

von H-G S. (haenschen)


Lesenswert?

Georg G. schrieb:
> Hattest du von einem Eingang mit der Bezeichnung "LOAD" ein anderes
> Verhalten erwartet? Die Daten erscheinen mit der fallenden Flanke am
> Pin. So steht es im Datenblatt.


Nunja, es hätte ja sein können dass ein internes Register/Latch geLOADet 
wird mit dem Signal. Etwa wie beim 74hc595 den ich auch in dem Projekt 
verbaut habe...

Aber es scheint dass diverse Kippstufen geladen werden, und der Ausgang 
der letzten Kippstufe ist eben auch noch Ausgang des Gesamtwerks.

von H-G S. (haenschen)


Lesenswert?

Ich habe das Programm auf Einlesen und dann 23x CLK+Einlesen umgestellt 
und siehe da es funktioniert.

Natürlich erst nachdem ich Programmteile etwa 3 mal neu 
schreiben/eingeben musste wegen Bugs. Ist vielleicht nicht gut wenn die 
Glotze nebenbei läuft :-)

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.