Sostituire uscite con registri shift

Ciao a tutti!
Sto lavorando sul codice di un programmatore di EPROM. Premesso che ho trovato il codice su Internet, vorrei modificarlo per renderlo adatto all'uso di "Registri Shift". Vi chiedo aiuto nel modificare questa porzione di codice, in quanto vorrei sostituire il "digitalWrite" con uno "ShiftOut".
Ho pensato ad immagazzinare i singoli bit che compongono il byte in un vettore e di "shiftarlo" in quel modo. Il problema è: come fare?
Vi lascio la porzione di codice che vorrei modificare.

/*
   IMPOSTAZIONE INDIRIZZO
*/
void setAddress(uint32_t Addr)
{
  for (int i = 0; i < 8; i++)
  {
    digitalWrite(adrPins[i], Addr & (1 << i));
  }
  Addr = Addr >> 8;
  for (int i = 0; i < 8; i++)
  {
    digitalWrite(adrPins[i + 8], Addr & (1 << i));
  }
  Addr = Addr >> 8;
  for (int i = 0; i < 4; i++)
  {
    digitalWrite(adrPins[i + 16], Addr & (1 << i));
  }
}

Grazie in anticipo

Ma sai come si programmano gli EPROM?
Ciao Uwe

Non molto. Sto cercando di imparare, finora è questo l'ostacolo maggiore. Vorrei riuscire a utilizzare il codice su Arduino UNO, senza avere bisogno di 20 pin liberi.

Qua trovi un mio grezzissimo dumper di ROM, che usa proprio 2 595 per pilotare il bus indirizzi:

A questo punto mi viene il dubbio se intendi con EPROM quei ROM con la finestrella trasparente cancellabili con luce UV.
A secondo del modello Ti serve una tensione tra 25V e 12,5V per la programmazione. Forse é meglio che ti leggi bene il Datasheet Del Tuo Eprom

Ciao Uwe

Mattia9914:
vorrei sostituire il "digitalWrite" con uno "ShiftOut".
Ho pensato ad immagazzinare i singoli bit che compongono il byte in un vettore e di "shiftarlo" in quel modo

La funzione shiftOut trasmette già i singoli bit di un byte, non serve trattarli singolarmente. Per un valore multibyte si effettuano più shiftOut in sequenza passando alle funzioni di volta in volta il byte voluto.

C'è un esempio a 16 bit anche nella pagina del reference, basta estenderlo a 24, 32, o quelli che servono (la serie di shift register può essere lunga a piacere ma servono circa 160µs di tempo per ciascuno ad ogni scrittura).

Poi magari posta il codice della "EPROM" così si capisce meglio di cosa si sta parlando.

Grazie per i consigli Claudio_FF e grazie per il codice SukkoPera.
Il codice l'ho un pò incasinato nel tentativo di capirci qualcosa, quindi vi lascio il link di github del progetto.

Quale EPROM vuoi usare?
un 2708 o un 27C080 ?
Ciao Uwe

Quella funzione setAddress è inutilmente complicata:

void setAddress(uint32_t Addr){
    for(int i=0; i<20; i++){
      digitalWrite(adrPins[i], Addr & 1);
      Addr >>= 1;       
    }
}

Comunque, anche per capire i tempi in gioco... usando le shiftOut standard della libreria di Arduino con una catena di tre shift register, si andrebbero ad impegnare 400µs per ogni indirizzo scritto, il che vuol dire che per spazzolare tutto il megabyte di indirizzamento sarebbero richiesti come minimo 419 secondi (sette minuti!!!!) contro il minuto e mezzo della soluzione "simil parallela" del progetto originale.

Con il controllo diretto delle porte si potrebbero abbattere di quasi quaranta volte questi tempi...

Un'altra soluzione vista spesso per generare gli indirizzi, è usare una catena di contatori binari (con due CD4040 si ottengono 24 bit di indirizzi), basta un impulso di reset e uno di avanzamento, anche così abbiamo ridotto il tempo di spazzolata degli indirizzi di quaranta volte (tanto l'accesso ad una *ROM tramite un lettore/programmatore è intrinsecamente sequenziale).

Rimangono ovviamente invariati i tempi dovuti alla trasmissione seriale e alla scrittura nella singola cella.