problema shift

Salve a tutti , sono bloccato nella comprensione di una funzione che non va come penso dovrebbe, volendo ampliare gli ingressi di arduino sono andato alla ricerca di qualche schema e sono finito qui http://www.mcmajan.com/mcmajanwpr/?p=1376 , realizzato il cablaggio allo shift register ho copiato lo sketch uguale a quello presente su questo sito . Dopo la compilazione mi succede che non tutti gli otto tasti rispondono , se non ho capito male la pressione dei tasti viene memorizzato all'interno delle celle di memoria per poi essere copiato all'interno della variabile "lettura" e quindi il tasto n° 1 varrà 1 decimale il tasto 2 varrà 2 decimale il tre varrà 4 decimale e cos'ì via fino al valore 128 decimale che poi sarà equivalente all'ultimo tasto premuto cioè l'ottavo. Il problema è che premendo il primo tasto a monitor visualizzo il valore decimale 2 e andando avanti il settimo mi darà valore 128 di conseguenza premendo l'ottavo tasto non avrò nessun valore. Spero che qualcuno mi riesca a spiegare dove è l'errore , da premettere che ho controllato decine di volte sia lo sketch che il cablaggio , addirittura dato che si utilizza un 74hc165 ho provato ad usare anche un cd4021be ma è la stessa cosa , ho visto che sul sito esiste un esempio con quest'ultimo ma ho anche visto che lo sketch è anche più articolato del precedente e sinceramente per me che ora mi avvio in questo mondo vorrei approfondire prima con quello in causa .

Se ogni tasto è un bit di un byte (8 bit) allora la corrispodenza è:

numero del bit 01234567
valore         12481361
                   6242
                      8

Perciò primo tasto, che dovrebbe essere bit 0, valore 1, ultimo tasto che dovrebbe essere bit 7, valore 128
0->1
1->2
2->4
3->8
4->16
5->32
6->64
7->128

Si in effetti è così che ho interpetrato la cosa ma non è quello che ricevo a monitor , ripeto premendo il tasto n°1 collegato all'ingresso del 74hc165 pin 11 ho come risposta 2 e non 1, premendo il tasto 2 dello shift register avrò come risposta 4 e non 2 e così via , è come se mi saltasse un bit , non è mai capitato a nessuno di eseguire questo sketch ed avere lo stesso problema ??

posta lo sketch che diamo una occhiata

const int IN_PL = 9;
const int IN_Data=10;
const int IN_Clock=8;

int attuale=0;
int lettura=0;
void setup()

{
  pinMode(IN_PL,OUTPUT);
  pinMode(IN_Data,INPUT);
  pinMode(IN_Clock,OUTPUT);
  Serial.begin(9600);

}

void loop()

{

  delay(50);
  digitalWrite(IN_PL, LOW);
  digitalWrite(IN_PL, HIGH);
  lettura=shiftIn(IN_Data, IN_Clock, MSBFIRST );
  if(attuale!=lettura)
  {
    attuale=lettura;
    Serial.println (lettura);

  }
}

ho lavorato con i cd4021, ma nel tuo non trovo niente di rilevante, aspettiamo persone più capaci, hai ricontrollato per bene i collegamenti?

Si , ormai decine di volte .

Faccelo vedere anche a noi, dai... Non si sa mai... Una foto chiara se è possibile.

ok , lo schema lo allego come primo file ed è quello con cui tramite eagle poi l'ho trasformato in pcb,le foto del pcb penso siano poco facili da interpretare per quanto riguarda i collegamenti ma vi assicuro che
ho confrontato con lo schema più volte e coincide , da premettere che ho utilizzato anche il 74hc165 ma da lo stesso problema.

gli allegati :slight_smile:

?

20150129_221718.jpg

20150129_221641.jpg

nello schema di eagle niente da dire, nelle mie prime esperienze con gli shift, utilizzando delle stripboard avevo spesso dei contatti impropri tra le piste, che ho eliminato solo dopo avere ricontrollato con una lente di ingrandimento e avere pulito per bene dai residui di saldatura, altro non saprei che dirti.

...
The clock input is a gated-OR structure which allows one input to be used as an active
LOW clock enable (CE) input. The pin assignment for the CP and CE inputs is arbitrary
and can be reversed for layout convenience. The LOW-to-HIGH transition of input CE
should only take place while CP HIGH for predictable operation. Either the CP or the CE
should be HIGH before the LOW-to-HIGH transition of PL to prevent shifting the data
when PL is activated.

leggevo questo da un datasheet del 74hc165
http://www.wvshare.com/datasheet/NXP_PDF/74HC165.PDF

Dopo diverse ricerche e tentativi ho contattato l'autore dello sketch che mi ha confermato l'esistenza di un errore riguardo appunto lo stesso , dicendomi che avrebbe provveduto nella correzione .
A titolo informativo vi terrò aggiornati a riguardo , grazie per le attenzioni ed i consigli.

Ciao, ci sono passato prima io, sto lavorando ad una interfaccia da 96 ingressi utilizzando il 74c165 e mi sta dando una mano la persona del sito che hai citato dove io ho preso schema e scketch. Grazie ai miei test hardware, gli ho fatto notare l' anomalia. comunque Stefano ha detto che provvederà al' aggiornamento del suo articolo. tu le hai messe le resistenze da 1k tra il pin 9 e gnd e tra il pin 10 e gnd? i condensatori di disaccoppiamento? io le ho dovute mettere perché mi arrivavano linee seriali a tempesta. con quelle resistenze tutto scorre liscio

giusto per informare chi passa da queste parti, l'articolo originale http://www.mcmajan.com/mcmajanwpr/?p=1376 è stato aggiornato. Il problema stava nel fatto che prima di portale IN_PL prima a LOW e poi ad HIGH, occorre inserire digitalWrite(IN_Clock, HIGH); altrimenti otteniamo gli errori descritti sopra.