Forum: Mikrocontroller und Digitale Elektronik Schieberegister IN/OUT an SPI


von Darkleon (Gast)


Lesenswert?

Hallo!

Ich habe vor vier 74HC595 und drei 74HC165 an SPI meines PIC 18F4550 zu 
betreiben.
Das mit den 595 kapier ich schon. Also diese kaskadiere ich und sende 
jedesmal die vier Bytes raus, bevor die ihre Ausgänge aktualieren 
sollen.

Ich programmiere mit dem C18 Compiler. In meinem Code werde ich ein 
Array aus vier Bytes für die Ansteuerung der 74HC595 einrichten. Mit 
bitweisen setzen oder löschen ( &=.., |=.. ) kann ich dann im Array 
jedes beliebige Bit, das ja einen Ausgang darstellt, manipulieren wie 
ich will. Danach wird das Array an der SPI Schnittstelle rausgeschoben.

Jetzt hab ich nur das Problem mit den 74HC165. Wie häng ich die auf den 
Bus? Einfach nach den 74HC595 weiter kaskadieren? oder parallel drauf 
und dann irgendwie zwischen den 595 und 165 umschalten? Abfragen werde 
ich die 165 alle 1ms, die 595 bei Bedarf dann aktualisieren.

So wie ich das verstanden habe muss ich ein "Dummy" Byte an den 165 
senden und dann wird dessen Inhalt synchron eingelesen und steht mir 
dann im Buffer der SPI Schnittstelle zur Verfügung. Aber wie mache ich 
das mit drei Stück?

Und dann hab ich das Byte im MC, jedes Bit sollte dann in anderen einem 
Array an einzelnen Stellen abgespeichert werden. Wie kann ich das in C 
machen?
Also ich bekomme z.B.: 00110100 in den Buffer. Das Bit 0 sollte dann in 
z.B.: Eingang[0], das Bit 1 in Eingang[1] usw. gespeichert werden.

Hoffe Ihr versteht mich und könnt mir bei all diesen Fragen 
weiterhelfen.

Danke schon im Voraus.

MfG Darkleon

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

1
When PL is HIGH, data enters the register serially at the DS input 
2
and shifts one place to the right (Q0 → Q1 → Q2, etc.) with each 
3
positive-going clock transition. This feature allows parallel-to-serial 
4
converter expansion by tying the Q7 output to the DS input of the 
5
succeeding stage.
Also Pin 9 vom vorhergehenden IC mit Pin 10 vom nachfolgenden verbinden. 
Und zum Schluss Pin 9 als MISO verwenden.

> Einfach nach den 74HC595 weiter kaskadieren?
Ja. Einfach den Ausgang vom letzten 595 mit dem DS vom ersten 165 
verbinden, und die dann in die Kette hängen. Und dann 7 Bytes 
übertragen: erst 3 Dummy-Bytes, dann die 4 Ausgangsbytes. Zurück kommen 
dann gleichzeitig 3 Eingangsbytes und 4 Dummybytes.

von Darkleon (Gast)


Lesenswert?

Hi Lothar!

danke für die schnelle Antwort. Das klingt verständlich :) Was passiert 
aber, wenn sich während des Bitschiebens ein Eingang ändert? Oder werden 
die Eingänge erst wieder durch PL ins Register übernommen?

Freu mich eh schon wieder auf eine Steckboardsession :) Werd das mal 
versuchen zusammenzubauen.

Nochmals Danke.

MfG

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> Oder werden die Eingänge erst wieder durch PL ins Register übernommen?
Ja, so stehts im Datenblatt.
1
When the parallel load (PL) input is LOW, parallel data from the 
2
D0 to D7 inputs are loaded into the register asynchronously.
3
4
When PL is HIGH, data enters the register serially at the DS input ...
Du mußt also den PL-Pin entsprechend ansteuern, dann klappt das.

von Darkleon (Gast)


Lesenswert?

Aha :)

Hab jetzt noch gegrübelt...Muss ich überhaupt 7 Bytes senden? Denn wenn 
ich PL auf High stelle, und das erste Byte (letzter 595) rausschiebe, 
dann kommt ja schon das erste Beyte vom 165 zurück, oder?? Das würde 
bedeuten wenn ich drei Bytes für die 4 595 gesendet hab sollte ich ja 
alle drei 165 schon empfangen haben. Dann stell ich PL auf LOW und sende 
noch das vierte Byte von den 595. Dann brauch ich ja die drei Dummy 
Bytes nicht. (Vorraussetzung ist wahrscheinlich, dass die 165 an den 595 
dranhängen und nicht umgekehrt).

Und zum Thema speichern der einzelnen Bits. Angenommen ich erhalte 
folgendes Muster von einem 165: 00010110 (Dieses Byte wird in der 
Variable Input gespeichert)

Und angenommen ich will das Bit 4 in der Variable Ergebnis[2] speichern, 
dann müsste doch folgendes klappen, oder??
1
Ergebnis[2] = ((Input >> 2) & 0b00000001)
So sollte ja das dritte Bit an die Stelle des Bit0 gerückt werden, 
danach wird logisch zusammengezählt. Hatte das Bit 3 die 1, so ist das 
Ergebnis auch eins. Hatte es 0 so ist auch das Ergebnis 0. Und alle 
anderen Bits werden auch auf 0 gesetzt. So steht dann in Ergebnis[2] der 
Wert des 3.Bits von Input. Oder nicht?
Und für die anderen Bits (werden ja im Array irgendwo anders 
abgespeichert) müsste ich dann nur mehr oder weniger oft verschieben.
Oder hab ich einen kompletten Denkfehler???

MfG Darkleon

von Darkleon (Gast)


Lesenswert?

"Und angenommen ich will das Bit 4 in der Variable Ergebnis[2] 
speichern, dann müsste doch folgendes klappen, oder??"

Ich meinte natürlich das 2. Bit (eine 1) :) Komm langsam durch das ganze 
rumschieben und arbeiten mit binärzahlen ganz durcheinander ;)

von STK500-Besitzer (Gast)


Lesenswert?

Wieso willst du was ins 165er reinschicken?
Du willst das Ding doch nur als Eingang benutzen. DAzu brauchst du es 
nur an MISO (Master In Slave Out) hängen. Den Takt teilt es sich mit dem 
595.
Wenn du nur ein 165er hast, dann fragst du es 4 mal ab, wenn du 4 595er 
hast...

von Darkleon (Gast)


Lesenswert?

Sorry für die blöde Frage, aber was meint ihr mit MISO. Ich hab bei der 
SPI Schnittstelle SDO (Ausgang), SDI (Eingang), SCK (Takt) und optional 
SS (Slave Select). Hab im Datenblatt unter 19.0 MSSP Modul bei SPI nie 
was von MISO gelesen. Oder hab ich was übersehen.

Wäre nett, wenn Ihr mich mal aufklären könnt. Hatte ja bis jetzt nie das 
Vergnügen mit SPI und Schieberegistern


MfG

von Darkleon (Gast)


Lesenswert?

Hat sich erledigt ;) MISO ist bei mir SDO.

Ich weiß, zuvor schauen, denken und dann fragen  ......*schäm*

Kann mir jemand meine Denkweise bei den speichern der Bits bestätigen, 
oder bin ich da ins Horn gelaufen??

MfG

von STK500-Besitzer (Gast)


Lesenswert?

Ich kenne den PIC nicht (dass ich auch nicht wieder kennenlernen will, 
sei mal so dahin gestellt...).

Die Daten sollten bei einer Hardware-Lösung in einer Speicherstelle 
landen, die eine bytebreite hat. Da brauchst du dich um keine 
Bitschieberei kümmern.
Bei einer Software-SPI initialisierst du eine Variable mit 128 oder 1, 
je nach dem, welches Bit zuerst eintrifft.
Wurde eine Taktflanke erkannt (Daten liegen am Eingang an), überprüfst 
du den Eingang. Ist er 1, veroderst du die o.g. Variable mit der 
Ergebnisvariable und bearbeitest du die "Zählvariable", indem du sie mit 
2 multiplizierst oder durch 2 dividierst. Das entspricht ein Schieben um 
eine Stelle.
Irgendwann ist die Zählvariable 0...

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.