Go Down

Topic: matrice led hef4094 arduino mega (Read 1 time) previous topic - next topic

future1980

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?
Code: [Select]
//----------------------------------------------------------
// 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

realmeteo

HAI LETTO QUESTO?
http://www.farnell.com/datasheets/2051421.pdf
"Follia è fare sempre la stessa cosa aspettandosi risultati diversi." Albert Einstein. (Se hai gradito il mio aiuto, grazie per un punto Karma).

brunello22



Code: [Select]
    digitalWrite(sipo_strobe, HIGH) ;
    shiftOut(sipo_data, sipo_clock, MSBFIRST, counter);
    digitalWrite(sipo_strobe, LOW);



future1980

#3
Mar 09, 2018, 07:18 pm Last Edit: Mar 09, 2018, 09:51 pm by future1980
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?  https://ibb.co/bYgga7



Claudio_FF

#4
Mar 10, 2018, 10:16 am Last Edit: Mar 18, 2018, 02:31 pm by Claudio_FF
Quote from: brunello22
Code: [Select]
  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.
* * * *    'if' e 'case' non sono cicli   * * * *
* * * Una domanda ben posta è già mezza risposta. * * *
* La corrente si misura in 'mA', la quantità di carica in 'mAh' *

future1980

#5
Mar 10, 2018, 11:09 am Last Edit: Mar 10, 2018, 11:21 am by future1980 Reason: ho caricato questo in arduino mega
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.


Code: [Select]
//----------------------------------------------------------
// 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);
}
//----------------------------------------------------------

future1980

#6
Mar 10, 2018, 11:50 am Last Edit: Mar 10, 2018, 11:55 am by future1980
sono 5 shift register 4094 7x5 led che formano il carattere  

sescrivo 1 si accendono cosi;





https://ibb.co/d8MA3S

Claudio_FF

#7
Mar 10, 2018, 12:03 pm Last Edit: Mar 10, 2018, 12:03 pm by 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)
* * * *    'if' e 'case' non sono cicli   * * * *
* * * Una domanda ben posta è già mezza risposta. * * *
* La corrente si misura in 'mA', la quantità di carica in 'mAh' *

future1980

//----------------------------------------------------------
// 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?

future1980

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

future1980

#10
Mar 10, 2018, 12:40 pm Last Edit: Mar 10, 2018, 12:49 pm by future1980
allora facendo la prova se trasmetto questo

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



https://ibb.co/kRghHn

scrivo (F) 


Claudio_FF

#11
Mar 10, 2018, 01:12 pm Last Edit: Mar 10, 2018, 01:14 pm by Claudio_FF
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.
* * * *    'if' e 'case' non sono cicli   * * * *
* * * Una domanda ben posta è già mezza risposta. * * *
* La corrente si misura in 'mA', la quantità di carica in 'mAh' *

future1980

#12
Mar 10, 2018, 01:37 pm Last Edit: Mar 10, 2018, 01:43 pm by future1980
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.

future1980


questo è perfetto fa al caso mio, ma non è 4094 ma è il max 7219  e non funziona.  :smiley-confuse:
Code: [Select]
/*
     8x8 LED Matrix MAX7219 Scrolling Text
         Android Control via Bluetooth

 



future1980

buonasera a tutti, sono arrivato a un bel punto :)  sono riuscito a fargli scrivere qualcosa :) 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.

Code: [Select]
//----------------------------------------------------------
// 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);
       
   //-------------------------------------------------------------------   
 
       
}



https://ibb.co/mWL4Xn

Go Up