Programmare cubo led 4x4x4 con due 74HC595

Oggi mi ero messo a giocare con un paio di 595 ed un pò di led... appena montato tutto, scrivo uno sketch velocissimo per fare accendere tutti i led... Risultato: tutti SPENTI :stuck_out_tongue_closed_eyes:
Ricontrollo, ed avevo invertito i segnali dati ai pin MR e OE ]:smiley:
Metto tutto a posto, riprovo.... led impazziti, che si accendono a caso. Addirittura, sfilando il cavo del segnale di clock, lampeggiano tutti i led.... :sweat_smile:
Ricontrollo tutto altre 10 volte e poi? Avevo sbagliato il programma: dichiaravo i pin 5/6/7 per latch, clock e dati mentre avevo collegato i fili sui pin 6/7/8 :stuck_out_tongue_closed_eyes: :stuck_out_tongue_closed_eyes:

Questo per dirti che anche riguardando spesso sembra tutto fatto bene ma poi l'erroruccio è dietro l'angolo. Ah, ti confesso che avevo pensato a te, non so però se più come ad uno iettatore o ad un compagno di sventura :wink:

hahahahahahahahaha spero come compagno di sventura ahahahaha XD
Ora controllo per la 100sima volta :slight_smile:

Prova cosi, per curiosita' (ho fatto copia incolla dal tuo, ho solo cambiato un paio di linee) ... in teoria dovrebbe (se funziona :P) accenderti i 4 led sulle colonne esterne , passandoli di strato in strato (mettici tu dei delay della durata che vuoi per rallentarlo se vuoi controllare)

void cubo()
{
  
  shiftOut(data, clock, MSBFIRST, 0b10010000); 
  shiftOut(data, clock, MSBFIRST, 0b00001001);
  digitalWrite(npn[0], LOW);
  digitalWrite(npn[1], LOW);
  digitalWrite(npn[2], LOW);
  digitalWrite(npn[3], LOW);
  digitalWrite(latch, HIGH);
  digitalWrite(latch, LOW); 
  digitalWrite(npn[0], HIGH);
  digitalWrite(canc, LOW);
  digitalWrite(canc, HIGH);

  shiftOut(data, clock, MSBFIRST, 0b10010000); 
  shiftOut(data, clock, MSBFIRST, 0b00001001);
  digitalWrite(npn[0], LOW);
  digitalWrite(npn[1], LOW);
  digitalWrite(npn[2], LOW);
  digitalWrite(npn[3], LOW);
  digitalWrite(latch, HIGH);
  digitalWrite(latch, LOW); 
  digitalWrite(npn[1], HIGH);
  digitalWrite(canc, LOW);
  digitalWrite(canc, HIGH);
  
  shiftOut(data, clock, MSBFIRST, 0b10010000); 
  shiftOut(data, clock, MSBFIRST, 0b00001001);
  digitalWrite(npn[0], LOW);
  digitalWrite(npn[1], LOW);
  digitalWrite(npn[2], LOW);
  digitalWrite(npn[3], LOW);
  digitalWrite(latch, HIGH);
  digitalWrite(latch, LOW); 
  digitalWrite(npn[2], HIGH);
  digitalWrite(canc, LOW);
  digitalWrite(canc, HIGH);
  
  shiftOut(data, clock, MSBFIRST, 0b10010000); 
  shiftOut(data, clock, MSBFIRST, 0b00001001);
  digitalWrite(npn[0], LOW);
  digitalWrite(npn[1], LOW);
  digitalWrite(npn[2], LOW);
  digitalWrite(npn[3], LOW);
  digitalWrite(latch, HIGH);
  digitalWrite(latch, LOW); 
  digitalWrite(npn[3], HIGH);
  digitalWrite(canc, LOW);
  digitalWrite(canc, HIGH);

}

Bada che anch'io sto imparando ora, quindi non mi ritengo responsabile se i miei tentativi causano risultati imprevedibili, fumo e/o fuoco, la zombificazione del vicinato, o il lancio di una testata nucleare dalla nazione vicina come rappresaglia, ok ? :wink: XD

EDIT: per trasformare il blocco di 4 righe che scrive tutti 0 sulle uscite, c'e' un modo per mandare lo stesso comando contemporaneamente a tutte e 4 le uscite ? (sul reference non ho trovato nulla a proposito di questo) ... oppure bisogna per forza definire una subroutine esterna e richiamarla ogni volta ? ...

per trasformare il blocco di 4 righe che scrive tutti 0 sulle uscite, c'e' un modo per mandare lo stesso comando contemporaneamente a tutte e 4 le uscite ? (sul reference non ho trovato nulla a proposito di questo) ... oppure bisogna per forza definire una subroutine esterna e richiamarla ogni volta ? .

Non ho capito di quale blocco parli :\

Comunque il tuo sketch funziona a dovere XD mi accende le 4 colonne agli angoli.
Quindi l'errore è nei miei sketch xD

Però modificando la prima serie e l'ultima serie di bit viene tutto scombinato >_>
Inoltre volevo chiedere, in questo sketch ho usato male la funzione bitset?

void colonne(int pausa)
{
  byte address_1= B00000000;
  byte address_2= B00000000;
  
  for(i=0;i<16;i++)
  {
    if(i<8)
    bitSet(i, address_1);
    else
    bitSet(i, address_2);
    
    digitalWrite(canc, HIGH);
    digitalWrite(latch, LOW);
    shiftOut(data, clock, MSBFIRST, address_1); 
    shiftOut(data, clock, MSBFIRST, address_2);
    digitalWrite(latch, HIGH);
    digitalWrite(latch, LOW); 
    digitalWrite(npn[0], HIGH);
    digitalWrite(npn[1], HIGH);
    digitalWrite(npn[2], HIGH);
    digitalWrite(npn[3], HIGH);
    digitalWrite(canc, LOW);
    digitalWrite(canc, HIGH);
    delay(pausa);
  }
}

toti94:
in questo sketch ho usato male la funzione bitset?

L'hai usata in modo strano... :sweat_smile:
bitSet accetta 2 parametri: la variabile su cui lavorare e la posizione del bit da impostare ad 1. Esempio:

bitSet(miaVar, 2);

Tu non ho capito invece come la stai usando :*

byte address_1= B00000000;
bitSet(i, address_1);

In pratica prima dichiaro il byte, poi setto su 1 il bit corrispondente al contatore del ciclo, da 0 a 7 sulla prima serie e da 7 a 15 sulla seconda serie :\

Allora hai invertito i parametri.

toti94:

per trasformare il blocco di 4 righe che scrive tutti 0 sulle uscite, c'e' un modo per mandare lo stesso comando contemporaneamente a tutte e 4 le uscite ? (sul reference non ho trovato nulla a proposito di questo) ... oppure bisogna per forza definire una subroutine esterna e richiamarla ogni volta ? .

Non ho capito di quale blocco parli :\

Mi riferivo a:

digitalWrite(npn[0], LOW);
digitalWrite(npn[1], LOW);
digitalWrite(npn[2], LOW);
digitalWrite(npn[3], LOW);

Per spegnere tutti gli strati ... mi chiedevo se fosse possibile con una digitalwrite sola passare lo stesso parametro a 4 o piu pin diversi (sul reference non ho trovato nulla a proposito di questo), o se fosse meglio creare una subroutine e richiamarla ogni volta ...

o fai ogni volta un ciclo così:

for(i=0;i<4;i++)
{
 digitalWrite(npn[i], LOW);
}

oppure questo ciclo lo inserisci in una funzione che chiami spegni_livelli() e ogni volta te la richiami, altri modi non li conosco :\

Si, era quello che intendevo ... una funzione esterna o un ciclo, non c'e' apparentemente modo di passare lo stesso comando a piu pin contemporaneamente con una sola digitalwrite ... grazie.