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
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.
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
> 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.
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...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.