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
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.
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
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
"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 ;)
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...
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
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
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...