Jump to content
PLC Forum


Sign in to follow this  
fgiorgio

Big 7-Seg Displays Con Max7219

Recommended Posts

fgiorgio

Buongiorno a tutti,

sto portando avanti un piccolo progetto personale all'interno del quale mi serve pilotare un totale di 5 display a 7 segmenti piuttosto grandi, formati da serie di led alimentati a 12V (nel mio prototipo per semplificare uso un solo led per segmento e una resistenza maggiore per i 12V). Il tutto viene comandato da un Arduino UNO, un MAX7219, e 3 integrati che hanno il compito di gestire i led con una tensione e una corrente che il solo MAX7219 non potrebbe gestire. Il circuito è allegato qui di seguito:

CIRCUITO: http://forum.arduino.cc//index.php?action=dlattach;topic=190157.0;attach=55287;image

Ho testato il tutto senza Arduino e MAX7219 e funziona egregiamente, ma non appena collego l'intero circuito ed effettuo il multipl****g (l'azienda ha richiesto la rimozione di questo marchio su PLC Forum) riscontro un fastidioso problema sui led, ovvero sebbene dovessero risultare spenti, alcuni si accendono lievemente in modo imprevisto. Ho provato a sostituire il CD40106 con un 74HC04 ma il problema persiste senza alcun cambiamento. Ho anche fatto un video in cui è meglio visibile il problema, ve lo allego qui di seguito, per testare il tutto ho usato una libreria per Arduino apposita per il MAX7219, potete trovare tutte le info qui:

LIBRERIA: http://www.icanmakeit.de/category/make/projects/icmi-max7219-arduino-lib/

VIDEO DEL PROBLEMA: http://www.youtube.com/watch?v=x6qTVJJ2dqw

Vi sarei enormemente grato se mi aiutaste a risolvere questo inghippo.

Grazie

Francesco

Share this post


Link to post
Share on other sites

Livio Orsini

Non è possibile vedere lo schema del circuito perchè richiede password.

Senza schema dare una risposta abbastanza significativa non è possibile.

Giusto come impressione. Il problema è dipendente da impulsi che comunque accendono brevemente i LEDs

Share this post


Link to post
Share on other sites
Livio Orsini

Va bene così, lo schema si vede bene.

Secondo me non ci sono problemi sullo Hw, dovresti rivedere come hai fatto il software di gestione dei leds.

Share this post


Link to post
Share on other sites
fgiorgio

Il software che ho usato non è altro che la libreria Arduino per il MAX7219, ho inserito nel primo post anche il link per tutte le sue informazioni (c'è su quella pagina anche un video del funzionamento originale).

Ovviamente ho testato anche il solo MAX7219 con un solo led per uscita e funziona.

Share this post


Link to post
Share on other sites
Livio Orsini

Forse la libreria ha qualche inconveniente o non l'hai usata correttamente.

Lo Hw per causare il difetto visibile nel filmato necessita di un pilotaggio non corretto. Il MAX non fa altro che trasformare una sequenza seriale in una parallela.

Puoi fare una verifica rapida; scolleghi il secondo 2003 dal 40106; i due ingressi li commuti manualmente da 0 v a +5. Poi fai la medesima prova comandando manualmente il 40106.

Se il difetto scompare è un problema di pilotaggio da parte di arduino.

Share this post


Link to post
Share on other sites
fgiorgio

Pilotando manualmente ULN2003 e CD40106 non sono in grado di riscontrare il problema poichè su tutti i digit si accendono i medesimi led contemporaneamente, quindi non posso valutare se quelli che dovrebbero restare spenti lo sono effettivamente.

Per quanto riguarda il pilotaggio da parte di arduino, è vero che ho usato una libreria fatta apposta per il MAX7219, è anche vero però che per effettuare queste prove ho usato un codice di test allegato alla libreria stessa, funzionante alla perfezione con il solo MAX7219.

Allego nuovamente il sito a cui fa riferimento sia la libreria che il codice di test:
http://www.icanmakeit.de/category/make/projects/icmi-max7219-arduino-lib/

Su un altro forum mi hanno chiesto di provare con un diodo all'uscita dell'UDN2981, o una resistenza di pulldown da 1K sulle uscite digit del max7219, ma in entrambi i casi nessun miglioramento.

Share this post


Link to post
Share on other sites
Livio Orsini
Su un altro forum mi hanno chiesto di provare con un diodo all'uscita dell'UDN2981, o una resistenza di pulldown da 1K sulle uscite digit del max7219, ma in entrambi i casi nessun miglioramento.

Te lo ripeto: non è un problema Hw!

L'unico modo di venirne a capo è farti un bel debugging sul tuo codice. Dovrai pur scrivere il software per scrivere i dati su display, quindi scrivilo e verifica passo-passo quello che succede.

Io quando ho problemi di Swmi comporto in questo modo.

Share this post


Link to post
Share on other sites
fgiorgio

Ok, provo a scrivere una parte del codice che mi serve e faccio una prova. Farò sapere. Grazie intanto.

Share this post


Link to post
Share on other sites
fgiorgio

Ok, dunque, ho creato un codice semplicissimo che mi fa accendere uno alla volta in sequenza tutti i led, ogni led per un secondo.

Ho due serie (digit) da 7 led ciascuno (segmenti), ciò che accade è che all'accensione del led X di un digit qualsiasi, si accende in modo leggero lo stesso led X di tutti gli altri digit.
A niente è servito mettere un pullup a 12V sugli anodi dei led.

Share this post


Link to post
Share on other sites
Livio Orsini
A niente è servito mettere un pullup a 12V sugli anodi dei led.

Te lo sto ripetendo sin dall'inizio, è inutile che smanetti lo Hw.

A parte il fatto il 40106 serve a nulla perchè bastava dare le uscite invertite, devi verificare con un oscilloscopio se arrivano, come presumo, impulsi brevissimi in ingresso allo ULN2003.

Il test che stai facendo è solo macroscopico, per vedere come stanno esattamente le cose devi entrare nelle librerie che hai usato.

Edited by Livio Orsini

Share this post


Link to post
Share on other sites
fgiorgio

Ho esaminato a fondo la libreria, che non è molto complessa. Ho verificato che i valori scritti nei registri fossero corretti.
Forse l'unica incognita è il delay di 5microsecondi messo all'inizio e alla fine di ogni fase, ma se i led si accendono vuol dire che i registri sono scritti correttamente.

Avendo a disposizione un oscilloscopio avrei verificato sia i dati in entrata al max7219 sui 3 bus, sia il segnale in uscita sui digit e sui segmenti, in modo da identificare cosa succedesse quando il led rimane debolmente acceso.
Però, non ho a disposizione un oscilloscopio :(

Share this post


Link to post
Share on other sites
Livio Orsini
Però, non ho a disposizione un oscilloscopio

Questo serve a togliere ogni dubbio, però il sintomo è più che evidente.

Anzi a ben vedere l'errore non è che si illuminano debolmente anche i LEDS dell'altra cifra, il vero errore è che non s'illuminano con la medesima intensità.

Dipende da come è stato fatto il software di pilotaggio.

Solitamente quando si pilotano i display in multiplexing totale, come nel tuo caso, si devono scrivere sempre tutte le cifre.

A mio parere dovresti, affinche la cosa funzioni bene, dovresti avere illuminati 6 LEDs, corrispondenti allo "0" in entrambe le cifre.

Se così non fosse quando vai a vedere il visulaizzatore avresti le cifre che si accendono in sequenza come i LEDs del filmato.

Share this post


Link to post
Share on other sites
fgiorgio

Questo è il codice di test sul quale sto effettuando le prove:

#include "Max7219.h"

//(dataPin,clockPin,loadPin,digitCount)
Max7219 max7219(5, 6, 7, 2);

void setup()
{
  max7219.enable(true);
  max7219.setIntensity(16);
}

void loop()
{
  max7219.clearDisplay();
  max7219.setRow(0, B0000001); //(digit, segment)
  delay(1000);
  max7219.setRow(0, B0000010);
  delay(1000);
  max7219.setRow(0, B0000100);
  delay(1000);
  max7219.setRow(0, B0001000);
  delay(1000);
  max7219.setRow(0, B0010000);
  delay(1000);
  max7219.setRow(0, B0100000);
  delay(1000);
  max7219.setRow(0, B1000000);
  delay(1000);
  max7219.clearDisplay();
  max7219.setRow(1, B0000001);
  delay(1000);
  max7219.setRow(1, B0000010);
  delay(1000);
  max7219.setRow(1, B0000100);
  delay(1000);
  max7219.setRow(1, B0001000);
  delay(1000);
  max7219.setRow(1, B0010000);
  delay(1000);
  max7219.setRow(1, B0100000);
  delay(1000);
  max7219.setRow(1, B1000000);
  delay(1000);
}

deve proprio accendersi un solo led alla volta, in sequenza, in questo modo ho visibile il problema in modo chiaro e tento di risolverlo.
Ho anche provato a settare tutti i digit contemporaneamente a ogni step, spegnendo quelli che non uso, ma niente.

Share this post


Link to post
Share on other sites
Livio Orsini

Immagina di dover scrivere "80".

  1. Comando per scrivere 7 LEDS
  2. Comando per strobe delle decine portando a 0V gli anodi corrispondenti ovvero metti a 0 l'uscita DIG0
  3. Togli lo strobe mettendo ad 1 DIG0
  4. Comando per scrivere 6 leds corrispondenti a 0.
  5. Comando per strobe delle decine portando a 0V gli anodi corrispondenti ovvero metti a 0 l'uscita DIG1
  6. Togli lo strobe mettendo ad 1 DIG1

Questa sequenza la devi ripetere all'infinito, magari cambiando i codici se cambiano le cifre.

I tempi hanno un'importanza fondamentale perchè determinano la luminosità delle cifre del display. Visto che la CPU dovrà fare altri lavori, bisogna, per prima cosa richiamare la funzione a tempo, mettiamo ogni 5 ms. Esegui solo il passo 1 e 2, poi esci; al prossimo giro eseguirai i passi 3, 4 e 5, poi al giro successivo 6, 1 e 2 e così via all'infinito.

Per 2 cifre è facile perchè praticamente hai il duty cycle pari a 50%, quindi la luminosità è buona; mano a mano che le cifre aumentoano la luminosità decade anche se puoi aumentare la corrente dei LEDS.

Per questa ragione il multiplexing senza memoria è molto povero.

PS ho spostato la discussionie nella sezione microprocessori che è più adatta all'argomento.

Share this post


Link to post
Share on other sites
fgiorgio

forse, uso il condizionale, non è chiaro un passaggio. Non è l'arduino che nel mio circuito effettua il multiplexing. L'arduino invia dei comandi al MAX7219 che immagazzina nei suoi registri i valori di questi comandi, ed è lui stesso a seconda di ciò che è memorizzato nei registri a gestire il multiplexing.

Faccio un esempio, poichè ho studiato tutta la libreria e i registri del MAX7219 ieri:

max7219.clearDisplay();

questo comando invia al MAX7219 una stringa di 16bit indicando di salvare nel registro SHUTDOWN il valore 0. Questo significa che da quel momento in poi (anche se tra l'arduino e il max7219 non dovessero esserci comunicazioni), il MAX7219 sarà spento, finchè un nuovo comando da parte dell'arduino non scriverà nel registro SHUTDOWN del MAX7219 il valore 1 che significa acceso.

Altro esempio:

max7219.setRow(0, B0000001); //(digit, segment)

Questo comando invia al MAX7219 sempre una stringa di 16bit, questa volta indicando di scrivere nel registro del DIGIT0 il valore B0000001 che significa l'accensione del solo segmento G. Nel momento in cui viene scritto il registro, Può anche non esserci piu nessuna comunicazione da parte dell'Arduino, il MAX7219 gestirà da quel momento in poi il multipl****g (l'azienda ha richiesto la rimozione di questo marchio su PLC Forum) accendendo (fino ad ulteriori comandi) il segmento G del digit 0.

Altro piccolo esempio, se scrivessi una cosa del genere:

max7219.setRow(0, B1111111); //(digit, segment)
max7219.setRow(1, B1111110);

questi due comandi inviano in totale una sequenza di 16+16 bit ....che scrivono i registri del digit 0 e 1. Da questo momento in poi, senza che l'Arduino faccia altro, il MAX7219 accenderà i due digit mostrando il numero "8" sul primo e "0" sul secondo.

Il MAX7219 dovrebbe gestire il multipl****g (l'azienda ha richiesto la rimozione di questo marchio su PLC Forum) a una velocità di circa 800Hz.

Non so se questo era ovvio.

Edited by Livio Orsini

Share this post


Link to post
Share on other sites
Livio Orsini

Quello che ti ho scritto prima serve solo a farti capire come funziona un multiplexing. Avendo in mezzo una periferifarica semi intelligiente come il MAX7219 se hai quuei difetti di visualizzazione ci sono solo 2 possiiblità:

  1. Stai usando in modo non conforme il MAX7219
  2. Stai pilotando il MAX7219 in modo non corretto.

Personalmente non ho mai usato questo componente perchè preferisco altre soluzioni.

Comunque osservandolo schema applicativo del datasheet e comparandolo con quello che usi tu non vedo differenze tali da pregiudicare il buon funzionamente. Anche i resistori di pull up, che hai provato senza alcun effetto, non sono necessare con il CD40106 che è un inverter Schmit trigger.

Quindi per esclusione non può che essere un problema di pilotaggio o di comandi al MAX7219

Edited by Livio Orsini

Share this post


Link to post
Share on other sites
fgiorgio

Da ignorante, mi viene un dubbio, che non significa continuare a insistere sul discorso hardware in quanto sto approfondendo le tue ipotesi (che prendo assolutamente in considerazione):

ammesso che sia un problema software, è possibile che nonostante questo il disguido sull'accensione dei led avvenga solo in presenza dell'intero circuito mostrato in precedenza, e al contrario NON si verifichi nel caso di utilizzo del singolo MAX7219 con annessi direttamente i singoli led?

in breve, se collego i singoli led direttamente al MAX7219, tutto funziona alla perfezione.

Share this post


Link to post
Share on other sites
gabri-z

Buona sera a tutti !

Che frequenza hai sul pin 13 (CLK) del MAX7219 ? Se tropo alta può avere questo effetto .

Non conosco l'Arduino , per qui non posso dire se è da impostare dal programma o agire diversamente . All'uscita del MAX hai il 40106 , il 2003 , ed i tempi di risposta si sommano...

Share this post


Link to post
Share on other sites
fgiorgio

Buona sera a tutti !

Che frequenza hai sul pin 13 (CLK) del MAX7219 ? Se tropo alta può avere questo effetto .

Non conosco l'Arduino , per qui non posso dire se è da impostare dal programma o agire diversamente . All'uscita del MAX hai il 40106 , il 2003 , ed i tempi di risposta si sommano...

Buonasera a te

La frequenza del CLK non la conosco, ma penso sia irrilevante in quanto dovendo scrivere dei registri sul MAX7219 è un'operazione del tutto indipendente al multiplexing svolto da quest'ultimo.

Avendo esaminato la libreria il passaggio dei dati tra Arduino e MAX7219 avviene attraverso il comando ShiftOut di Arduino, che si occupa da solo di inviare una serie di bit per ogni colpo di clock (stabilito dall'Arduino stesso).

Considerato che il circuito composto da solo arduino, max7219 e led funziona correttamente, e che anche in caso di disguidi sul circuito completo proposto in questo topic, la sequenza di led avviene correttamente, io credo che i registri del MAX7219 siano scritti correttamente, in caso contrario non avrei dovuto vedere nessun led acceso o almeno non la sequenza completa.

Share this post


Link to post
Share on other sites
gabri-z

Considerato che il circuito composto da solo arduino, max7219 e led funziona correttamente, e che anche in caso di disguidi sul circuito completo proposto in questo topic, la sequenza di led avviene correttamente, io credo che i registri del MAX7219 siano scritti correttamente, in caso contrario non avrei dovuto vedere nessun led acceso o almeno non la sequenza completa.

Cosi risulta che Livio Ti ha già risposto :

A parte il fatto il 40106 serve a nulla perchè bastava dare le uscite invertite,

Stai raddoppiando il tempo di risposta sulla selezione digit ed è probabile che il tempo dedicato al primo , per esempio , si estenda sopra quello dedicato al secondo digit , cosi vedi i dati caricati per il primo , sul secondo , con una intensità proporzionale col tempo di sovraposizione .

Share this post


Link to post
Share on other sites
fgiorgio

Ipotizzando una cosa del genere tempo fa provai a porre due CD40106 prima dell'UDN2981 per ritardare il segnale, ricordo che la prova si rivelò un nulla di fatto, ma fui costretto a mettere due CD40106 quindi potrei aver ritardato troppo.

Poche ore fa ho fatto un'altra prova, ho inserito un solo CD40106 prima dell'UDN2981, il risultato è stato avere la mia sequenza in modo complementare, ovvero tutti i led accesi con uno solo spento che "camminava" tra i vari segmenti. Ebbene, il led che doveva essere totalmente spento, era leggermente acceso proprio come il mio problema originale.

A parte queste considerazioni, non credo di poter dare le uscite DIGIT invertite al MAX7219, poichè è una caratteristica del chip stesso. Non le comando io dall'Arduino.

Share this post


Link to post
Share on other sites
Livio Orsini

Hai solo una prova Hw che ti manca, non disponendo dell'oscilloscopio.

Monta un circuito esattamente identico, con i medesimo componenti, a quello indicato sul data sheet del MAX7219.

Li è usato un MAX394 che è uno switch quadruplo, molto più veloce dell'invertitore CD40106. Anche gli ULN2803 sono un po' lenti. La somma di tutti questi ritardi può portare al risultato che hai osservato.

Certo che potendo disporre di un oscilloscopio in un attimo vedi se c'è quell'effetto che ti ho descritto.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

×
×
  • Create New...