matrice led hef4094 arduino mega

ciao a tutti, ho una barra di led 7x60 a bordo è pilotata da hef4094 ed a comandarla aveva un microcontrollore zilog z86e40, ho trovato i pin data,clk,e stb, ma non riesco a scrivere mi si accendono led a caso. qualcuno puo aiutarmi a capire ilperche?

//----------------------------------------------------------
// Test funzione shiftOut su shift register sipo CD4094
//----------------------------------------------------------
#define sipo_strobe  2
#define sipo_data    3
#define sipo_clock   4
//----------------------------------------------------------
byte counter = 0;
//----------------------------------------------------------
void setup()
{
    pinMode(sipo_strobe, OUTPUT);
    pinMode(sipo_data, OUTPUT);
    pinMode(sipo_clock, OUTPUT);
    digitalWrite(sipo_strobe, LOW);  
    digitalWrite(sipo_clock, LOW);  
}
//----------------------------------------------------------
void loop()
{
    shiftOut(sipo_data, sipo_clock, MSBFIRST, counter);
    digitalWrite(sipo_strobe, HIGH);  
    digitalWrite(sipo_strobe, LOW);  
    counter += 1;
    delay(100);
}
//----------------------------------------------------------

grazie

HAI LETTO QUESTO?

    digitalWrite(sipo_strobe, HIGH) ;
    shiftOut(sipo_data, sipo_clock, MSBFIRST, counter);
    digitalWrite(sipo_strobe, LOW);

si lo letto ma non mi aiuta se non conosco bene l'ic. la barra dei led è 7x5 e sono 10 lettere.quindi dovrei concentrarmi solo su un carattere? bty — ImgBB

brunello22:

   digitalWrite(sipo_strobe, HIGH) ;

shiftOut(sipo_data, sipo_clock, MSBFIRST, counter);
   digitalWrite(sipo_strobe, LOW);

L'errore sicuramente non è li. Il 4094 porta i dati sui latch di uscita quando strobe è alto e tiene bloccate le uscite quando è basso. Se si lascia alto tutto il tempo le uscite scorrono assieme ai dati in ingresso ma la configurazione finale raggiunta è la stessa.

Il problema secondo me è scoprire quali bit della sequenza comandano quali LED e in che ordine sono collegati in cascata i vari 4094.

Una volta scoperto, per esempio (non so se è così), che si tratta di 50 shift register in cascata, ciascuno che comanda una colonna di 7 LED, allora sapremmo che ci servono 5 byte per rappresentare i bit delle colonne di una cifra, per un totale di 50 byte da trasmettere con 50 shiftOut.

Come si fa a scoprire?

Si trasmettono un centinaio di bit a zero per pulire gli shift register, si immette solo un 1, e poi si danno lentamente colpi di clock per vedere come/dove si sposta questo 1.

Claudio_FF:
L'errore sicuramente non è li. Il 4094 porta i dati sui latch di uscita quando strobe è alto e tiene bloccate le uscite quando è basso. Se si lascia alto tutto il tempo le uscite scorrono assieme ai dati in ingresso ma la configurazione finale raggiunta è la stessa.

Il problema secondo me è scoprire quali bit della sequenza comandano quali LED e in che ordine sono collegati in cascata i vari 4094.

Una volta scoperto, per esempio (non so se è così), che si tratta di 50 shift register in cascata, ciascuno che comanda una colonna di 7 LED, allora sapremmo che ci servono 5 byte per rappresentare i bit delle colonne di una cifra, per un totale di 50 byte da trasmettere con 50 shiftOut.

Come si fa a scoprire?

Si trasmettono un centinaio di byte a zero per pulire gli shift register, si immette solo un 1, e poi si danno lentamente colpi di clock per vedere come/dove si sposta questo 1.

ho caricato questo in arduino mega e se metto zero si spengono tutti i led, se metto 1 si accendono i 5 led in basso , 2 si accendono 2 strisce in modo binario.

//----------------------------------------------------------
// Test funzione shiftOut su shift register sipo CD4094
//----------------------------------------------------------
#define sipo_strobe  2
#define sipo_data    3
#define sipo_clock   4
//----------------------------------------------------------
byte counter = 0;
//----------------------------------------------------------
void setup()
{
    pinMode(sipo_strobe, OUTPUT);
    pinMode(sipo_data, OUTPUT);
    pinMode(sipo_clock, OUTPUT);
    digitalWrite(sipo_strobe, LOW);  
    digitalWrite(sipo_clock, LOW);  
}
//----------------------------------------------------------
void loop()
{
    shiftOut(sipo_data, sipo_clock, MSBFIRST, counter);
    digitalWrite(sipo_strobe, HIGH);  
    digitalWrite(sipo_strobe, LOW);  
    counter = 1;   
    delay(100);
}
//----------------------------------------------------------

sono 5 shift register 4094 7x5 led che formano il carattere

sescrivo 1 si accendono cosi;

Confermi che con il valore 2 si accende invece la striscia successiva verso l'alto?

Se si allora si è trovata la corrispondenza dei bit in verticale, il bit 0 dei byte trasmessi è il LED in basso.
Adesso bisogna stabilire se le varie colonne vengono scritte da destra a sinistra o al contrario, per vedere questo basta aumentare il delay.

Confermi che la striscia in basso si accende piano piano da sinistra verso destra?

Se si allora per visualizzare una 'F' dovrebbe essere sufficiente inviare in sequenza i byte:

0b00000000
0b01000000
0b01001000
0b01001000
0b01111111

(si nota la F sdraiata formata dai bit 1)

//----------------------------------------------------------
// Test funzione shiftOut su shift register sipo CD4094
//----------------------------------------------------------
#define sipo_strobe 2
#define sipo_data 3
#define sipo_clock 4
//----------------------------------------------------------
byte counter1 = (0b00000000,0b01000000,0b01001000,0b01001000,0b01111111);

//----------------------------------------------------------

come li invio?

Claudio_FF:
Confermi che con il valore 2 si accende invece la striscia successiva verso l'alto?

Se si allora si è trovata la corrispondenza dei bit in verticale, il bit 0 dei byte trasmessi è il LED in basso.
Adesso bisogna stabilire se le varie colonne vengono scritte da destra a sinistra o al contrario, per vedere questo basta aumentare il delay.

Confermi che la striscia in basso si accende piano piano da sinistra verso destra?

Se si allora per visualizzare una 'F' dovrebbe essere sufficiente inviare in sequenza i byte:

0b00000000

0b01000000
0b01001000
0b01001000
0b01111111




(si nota la F sdraiata formata dai bit 1)

si confermo, iled si accendono da sinistra a destra

allora facendo la prova se trasmetto questo

byte counter1 = 0b01001000;
byte counter2 = 0b01001000;
byte counter3 = 0b01001000;
byte counter4 = 0b01000000;
byte counter5 = 0b01111111;

scrivo (F)

Quindi è risolto.

Ogni lettera sono 5 shiftOut con i valori opportuni come per la 'F'.

L'ultimo gruppo di 5 shiftOut è sempre la lettera a sinistra che sposta a destra tutte le altre.

Se non si vogliono vedere aloni durante la scrittura, l'impulso di strobe va dato solo una volta alla fine della scrittura di tutte le lettere.

abbiamo capito come sono configurati i shift register, e ti ringrazio ma come posso implementare un areatore con tutte le lettere e scrivere solo la frase che mi interessa e stamparla? Oppure ogni volta che premo un pulsante cambia frase da me creata dentro il loop.

questo è perfetto fa al caso mio, ma non è 4094 ma è il max 7219 e non funziona. :confused:

/*
     8x8 LED Matrix MAX7219 Scrolling Text
         Android Control via Bluetooth

Scroll8x8LED-MAX7219-BT-Arduino.ino (9.16 KB)

buonasera a tutti, sono arrivato a un bel punto :slight_smile: sono riuscito a fargli scrivere qualcosa :slight_smile: vi posto il codice, vi voglio chiedere ma ce un modo da farlo piu semplice? io vorrei semplicemente scrivere una frase ti msg ("hello word ") senza creare tutte quelle variabili.

//----------------------------------------------------------
// Test funzione shiftOut su shift register sipo CD4094
//----------------------------------------------------------
#define sipo_strobe  2
#define sipo_data    3
#define sipo_clock   4
//----------------------------------------------------------
word counter = 0b0000000;
word counter1= 0b1000001; 
byte counter2 =0b1000001; //C
byte counter3 =0b1000001;
byte counter4 =0b1111111;
//---------------------------------------
word counter5= 0b0000000;
word counter6= 0b0000000; 
byte counter7 =0b1111111;  //I
byte counter8 =0b0000000;
byte counter9 =0b0000000;
//--------------------------------------------------
word counter10= 0b0011111;
word counter11= 0b0101000; 
byte counter12 =0b1001000;  //A
byte counter13= 0b0101000;
byte counter14= 0b0011111;
//--------------------------------------------------
word counter15= 0b1111111;
word counter16= 0b1000001; 
byte counter17 =0b1000001;  //O
byte counter18= 0b1000001;
byte counter19= 0b1111111;
//--------------------------------------------------
word counter20= 0b0001000;
word counter21= 0b0001000; 
byte counter22 =0b0001000;  //-
byte counter23= 0b0001000;
byte counter24= 0b0001000;
//----------------------------------------------------------
void setup()
{
    pinMode(sipo_strobe, OUTPUT);
    pinMode(sipo_data, OUTPUT);
    pinMode(sipo_clock, OUTPUT);
    digitalWrite(sipo_strobe, LOW);  
    digitalWrite(sipo_clock, LOW); 
    
}
//----------------------------------------------------------
void loop()
{
    shiftOut(sipo_data, sipo_clock, MSBFIRST,counter20);
    shiftOut(sipo_data, sipo_clock, MSBFIRST, counter21);
    shiftOut(sipo_data, sipo_clock, MSBFIRST, counter22);
    shiftOut(sipo_data, sipo_clock, MSBFIRST, counter23);
    shiftOut(sipo_data, sipo_clock, MSBFIRST, counter24); 




    shiftOut(sipo_data, sipo_clock, MSBFIRST,counter15);
    shiftOut(sipo_data, sipo_clock, MSBFIRST, counter16);
    shiftOut(sipo_data, sipo_clock, MSBFIRST, counter17);
    shiftOut(sipo_data, sipo_clock, MSBFIRST, counter18);
    shiftOut(sipo_data, sipo_clock, MSBFIRST, counter19); 



       shiftOut(sipo_data, sipo_clock, MSBFIRST,counter10);
    shiftOut(sipo_data, sipo_clock, MSBFIRST, counter11);
    shiftOut(sipo_data, sipo_clock, MSBFIRST, counter12);
    shiftOut(sipo_data, sipo_clock, MSBFIRST, counter13);
    shiftOut(sipo_data, sipo_clock, MSBFIRST, counter14);  

       shiftOut(sipo_data, sipo_clock, MSBFIRST,counter5);
    shiftOut(sipo_data, sipo_clock, MSBFIRST, counter6);
    shiftOut(sipo_data, sipo_clock, MSBFIRST, counter7);
    shiftOut(sipo_data, sipo_clock, MSBFIRST, counter8);
    shiftOut(sipo_data, sipo_clock, MSBFIRST, counter9);  
      
    shiftOut(sipo_data, sipo_clock, MSBFIRST,counter );
    shiftOut(sipo_data, sipo_clock, MSBFIRST, counter1);
    shiftOut(sipo_data, sipo_clock, MSBFIRST, counter2);
    shiftOut(sipo_data, sipo_clock, MSBFIRST, counter3);
    shiftOut(sipo_data, sipo_clock, MSBFIRST, counter4);  
 digitalWrite(sipo_strobe, HIGH);
       digitalWrite(sipo_strobe, LOW); 
       delay(100);
       
   //-------------------------------------------------------------------    
  
       
}

future1980:
io vorrei semplicemente scrivere una frase ti msg ("hello word ") senza creare tutte quelle variabili.

Non c'è alcun motivo di creare quelle variabili (se proprio vuoi usare una variabile per il dato da passare a shiftOut ne basta una a cui assegni i vari valori), e neppure chiamarle counter, visto che non servono come contatori.

Una soluzione è un array di byte (5 byte per carattere), e poi puntare l'inizio del carattere voluto (indice chr*5) ed estrarre i 5 byte passandoli uno ad uno a shiftOut tramite un ciclo for di cinque iterazioni.