Zwei 74HC165 Shift Register in "Reihe" mit dem SPI betreiben

Guten Tag,
ich bin schon mit meinem Projekt ein gutes Stück voran gekommen. Es geht darum einen 16 Bit Absolutwinkelgeber auszulesen und die Werte auf einem Display anzuzeigen, mehr nicht.

Die Schaltung, denke ich, ist soweit i.O. , da ich die Werte vom jeweiligen IC übertragen bekomme, wenn ich mit dem Serial-Out auf den Pin 9 vom Nano gehe.
Nur in Reihe, also den Serial-Out vom ersten IC zum Serial-In des 2. IC und dessen Serial-Out zum Nano, bekomme ich nur Werte vom ersten IC.
Gefunden habe ich folgendes:
https://www.gammon.com.au/forum/?id=11979
... und da sind auch Teile meines Codes her.
Wie kann ich die beiden ShiftRegister in Reihe bringen?
Bitte kann mir eine hilfreiche Person auf die Sprünge helfen?

#include <Wire.h>                   
#include <LiquidCrystal_I2C.h>      
#include <SPI.h>

LiquidCrystal_I2C lcd(0x27, 16, 2);  

const byte LATCH = 9;
int val = 0;

//byte switchBank1;   // Register 1
//byte switchBank2;   // Register 2

void setup ()
{
  SPI.begin ();
  pinMode (LATCH, OUTPUT);
  digitalWrite (LATCH, HIGH);
  
  lcd.init(); 
  lcd.backlight(); 
  

  lcd.print("Encoder:");
}  // end of setup

int optionSwitch;
//byte oldOptionSwitch; // previous state

void loop ()
{
  digitalWrite (LATCH, LOW);    // pulse the parallel load latch
  digitalWrite (LATCH, HIGH);
  
//switchBank1 = SPI.transfer (0);
//switchBank2 = SPI.transfer (0);
optionSwitch = SPI.transfer (0);
//switchBank1 = SPI.transfer (0);
  
     lcd.setCursor(0, 1);
if (val<100000) lcd.print(' ');
if (val<10000) lcd.print(' ');
if (val<1000)  lcd.print(' ');
if (val<100)   lcd.print(' ');
if (val<10)    lcd.print(' ');
    lcd.setCursor(0, 1);
   
    lcd.print (optionSwitch);
 
  delay (100); 
}

Erstmal erwarte ich, dass int optionSwitch; unsigned wird, oder gibt es einen besonderen Grund für das Vorzeichen?

Zudem:

optionSwitch = SPI.transfer (0);
Klar, dass ein 8 Bit Transfer nur 8 Bit liefert!

Du möchtest sicherlich: optionSwitch = SPI.transfer16 (0);

Zudem solltest du zwingend darauf achten, dass der SS Pin High bleibt, oder ein Ausgang ist.

Hallo,

ein SPI.transfer liest/schreibt immer nur ein Byte (8 Bit).
Wenn du 2 Bytes lesen/schreiben möchtest, musst du 16 Takte machen.
Heißt für dich 2x SPI.transfer ausführen.
Oder 1x SPI.transfer16 ausführen.

Danach beide Werte miteinander verarbeiten wie benötigt.

( mal wieder zeitliche Antwortüberschneidung :wink: )

( mal wieder zeitliche Antwortüberschneidung :wink: )

Ach, das zeigt doch nur, dass ich dich hin zur richtigen Denkweise konditioniert habe!
:smiling_imp: :smiling_imp: :smiling_imp: :smiling_imp: :smiling_imp:

Im Ernst:
Doppelt gemoppelt hält besser!
(oder zeugt von kollektiven Wahnsinn)

Danke für die schnelle Antwort,

gerade SPI.transfer16 gestestet und "unsigned int OptionSwitch" brachte den Erfolg. Das Vorzeichen war nicht beabsichtigt, war aber auch als Ergebnis mit einem Resister nicht aufgetaucht, eben mit dem 2. Register schon.
Jetzt werde ich die Schlatung ein weiteres mal aufbauen und entwirren, die Werte der Anzeige "springen" zeitweise.

Vielen Dank erstmal

:wink: :smiling_imp: :wink:

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.