Prototyp na bastldesce se nakonec povedlo rozchodit.
Je zajímavé, kolik se najde okolo tohoto staršího obvodu problémů. Nakonec jsem sestavu donutil dělat to, co jsem chtěl.

Schéma zapojení
Funkční kód:
/*
arduino nano
1x 74hc165
na vstupech tlačítka s PullUpy 10k
na vstupu od vzdálenějšího hc165 je PullDown 10k
(c)2025 MerkurRobot.cz
*/
const int plPin = 3; // PL (load)
const int clockPin = 4; // CP (clock)
const int dataPin = 2; // Q7 (data)
void setup() {
pinMode(plPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, INPUT);
Serial.begin(115200);
}
// při čtení se objevuje chyba s bitovou rotací o jeden bit - tato funkce posune bity správným směrem
byte rotateLeft(byte val) {
return (val << 1) | (val >> 7);
}
void loop() {
// Spustit paralelní načtení stavu vstupů
digitalWrite(plPin, LOW);
delayMicroseconds(5); // krátká pauza
digitalWrite(plPin, HIGH);
delayMicroseconds(5); // krátká pauza
// Přečíst 2 bajty (16 bitů) – první bajt je z druhého čipu
// byte input2 = shiftIn(dataPin, clockPin, MSBFIRST); // nejvzdálenější
byte input1 = shiftIn(dataPin, clockPin, LSBFIRST); // bližší Arduinu
input1 = rotateLeft(input1); //oprava bitové rotace
// Výpis
Serial.print("Bity: ");
/* for (int i = 7; i >= 0; i--) {
Serial.print(bitRead(input2, i));
}
*/
for (int i = 0; i < 8; i++) {
Serial.print(bitRead(input1, i));
}
Serial.println();
delay(5);
}
Pokud vás překvapuje bitová rotace, tak z neznámého důvodu mi to načte pořadí vstupů BCDEFGHA místo ABCDEFGH . Věřte mi, že jsem překontroloval plošňák několikrát, včetně kódu.

Edit: plošňáky jsou na cestě, brzy bude kód pro verzi se dvěmi čipy.

Myslím, že se to řeší zde: https://forum.arduino.cc/t/74hc165-shift-register-with-shiftin-wraps-last-bit-around-the-beginning/601084/12
Problém je v opačných hranách hodin při kterých čte vestavěná funkce PulseIn výstup z registru 165. Funkce se buď musí opravit, nebo bude lepší si napsat svou. V tom příspěvku je hotová funkční verze.
Pin 15 u 74165 není /CE, ale Clock Inhibit a podle datasheetu by během pulsu /PL měl být v H. Ale pokud v tomto čase „netikají“ hodiny, tak je to jedno a může trvale zůstat na L.
Tak je to úplně jinak. To řešení z odkazu z mého prvního příspěvku je blbost. Zkrátka to chce si udělat čas a pořádně prostudovat datasheet 74165 a napsat si vlastní funkci pro jeho čtení. Vestavěná funkce ShiftIn (prvně jsem ji omylem nazval PulseIn, ale myslel jsem ShiftIn) se bez úpravy pro čtení 74165 použít nedá! Hrany hodin jsou OK (vzestupná), ale fór je v tom, že stav vstupu H je nutné po loadu číst ještě PŘED první hranou hodin, jinak je nenávratně ztracen a žádná korekce nepomůže! Originální funkce ShiftIn nejprve „tikne“ hodinami a pak teprve čte první hodnotu. Čili nejprve přečte stav vstupu G (F,E,D,C,B,A) a nakonec přečte SERIN (NEXT). Vstup H se nenačte vůbec.
Napsal jsem si tedy vlastní funkci, která umí na základě vstupního parametru číst jak 74165 (asynchronní load), tak 74166 (synchronní load). Pochopitelně je zachována volba LSB/MSB FIRST. Vše mám odzkoušené na breadboardu s reálnými obvody 165/166 a vše funguje. Zkoušel jsem i originální ShiftIn a funguje přesně tak blbě, jak se dá očekávat. Pokud bys měl zájem, písni na mail, který vidíš a pošlu hotovou odzkoušenou funkci i s ukázkovým prográmkem.
Tak snad můj poslední komentář k tématu. Odladil jsem loadovací sekvenci, která je použitelná jak pro 74165, tak pro 74166 bez dalších úprav či parametrů. Dokonce jsem zkoušel číst dva obvody zapojené v sérii, z nichž jeden byl typu 165 a druhý 166. Vše plně funkční.
To budu moct vyzkoušet doufám příští týden, až mi přijdou desky.