Problema matrice di 8 display a 7 segmenti

Buongiorno a tutti,

è da ieri che ho un problema al quanto frustante e non riesco a capire.

Ho fatto un circuito con 8 display a 7 segmenti con il comune positivo (negativi quindi i singoli leds).

Prima di spiegare in modo scritto con in più uno schema grafico e il programma parlo subito del problema:

Ho notato casualmente al buio perchè di norma non si nota, quando un display rappresenta una cifra alfanumerica qualsiasi, quello subito dopo a sinistra se spenta con tutti i segmenti a zero
(dipende dal senso della sequenza dei pin d’indirizzo che attivano il comune del display uno alla volta nel mio caso parte dal display più a destra fino a quello più a sinsitra e poi riparte)
s’intravede la stessa cifra a bassissima luminosità e lo fa sempre su tutti i display solo se quello vicino a destra e attivo poi gli altri sono spendi


ESEMPIO:

D, n = Display / n = numero

  • = Display spento
    n* = valore sul display a luce molto debole
  1. Quello che normalmente si dovrebbe vedere è il numero 8 :

D7 - D6 - D5 - D4- D3 - D3 - D2 - D1 - D0

                • 8

2 .Quello che vedo ed intravedo al buio è il numero 8 più lo stesso numero sul display subito a sinsitra :

n* = valore sul display a luce molto debole

D7 - D6 - D5 - D4- D3 - D3 - D2 - D1 - D0

              • 8* 8

In pratica nel programma il display D2 dovrebbe essere spento come gli altri


3 . Se metto più valori il problema si ripete sempre sui display subito a sinistra di quelli accesi :

n* = valore sul display a luce molto debole

D7 - D6 - D5 - D4- D3 - D3 - D2 - D1 - D0

3* 3 + P* P + + 8* 8


Ho provato a caricare altri codici per matrici 8x8 che avevo usato con una matrice a led blu che su tale non ho mai notato il problema che su questo schema c’è sempre.

NOTA IMPORTANTE:

Un’altra cosa che ho notato è che se stacco il conduttore del comune del display con la luce molto debole in automatico il residuo di luce passa nell’altro display sempre più a sinistra e io con questo non so proprio capire se è un problema hardware o software.


SCHEMA DI COLLEGAMENTO

Ho collegato in parallelo i pin di data dei display (pin negativi) ed poi connessi alle uscite dell’integrato ULN2803 comandato a sua volta dalle uscite per il Data da Arduino Nano.

Pin Data > (10, 11, 12, A0, A1, A2, A3)
Segmenti >(A B C D E F G)

//Numerazione Segmenti
// _ A
// || F B
// |
| G
// E C
// D

I comuni di ogni display sono connessi direttamente ai pin (2, 3, 4, 5, 6, 7, 8, 9) che fungono da pin d’indirizzo da destra a sinistra.

Premetto che ho reso il circuito più semplice possibile in quanto quello originale utilizza un buffer 74hc541 per i pin degli indirizzi per questioni di amperaggio e di stabilità che ho omesso poichè il problema presiste comunque.

Se qualcuno ha qualche altro codice diverso per matrici a led o qualche aiuto generale ne sarei grato !

GRAZIE A TUTTI !

Display_7Seg_Program.zip (965 Bytes)

Ti segnalo che, nella sezione in lingua Inglese, si può scrivere SOLO in Inglese ... quindi, per favore, la prossima volta presta più attenzione in quale sezione metti i tuoi post; questa volta è stato spostato nella sezione di lingua Italiana ... la prossima volta potrebbe venire direttamente eliminato ::slight_smile:

Guglielmo

gpb01:
Ti segnalo che, nella sezione in lingua Inglese, si può scrivere SOLO in Inglese ... quindi, per favore, la prossima volta presta più attenzione in quale sezione metti i tuoi post; questa volta è stato spostato nella sezione di lingua Italiana ... la prossima volta potrebbe venire direttamente eliminato ::slight_smile:

Guglielmo

Grazie mille ! Ho la traduzione automatica e mi frega sempre ! Grazie ancora !

Direi che è un'alea prettamente hardware: le 8 linee 'data bus' che collegano i catodi dei display alle uscite dell'ULN2803 si comportano come condensatori spuri. Quando un'uscita dell'ULN si attiva, "scarica" la linea. Quando il successivo anodo comune viene alimentato, i segmenti spenti corrispondenti alle linee del display precedente che erano accesi (linee "scaricate a massa" dall ULN) per un attimo vengono attraversati dalla corrente di carica dei condensatori spuri.

Sul display ancora più a sinistra non si vede niente perché questa corrente non c'è più... a meno di non staccare un anodo comune, e il problema si sposta.

Si dovrebbe risolvere con delle semplici resistenze di pull-up sulle uscite dell'ULN. Partirei con 10k, e se non basta, diminuire il valore.

Evidentemente quel display ha dei segmenti estremamente sensibili/efficienti.

Comunque non ho mai pilotato display con tempi di accensione così brevi (50µs). Avendo 8 cifre farei 2 millisecondi per cifra (62.5Hz di refresh).

MizzardNet:
Buongiorno a tutti,

è da ieri che ho un problema al quanto frustante e non riesco a capire.

Se qualcuno ha....................... qualche aiuto generale ne sarei grato !

GRAZIE A TUTTI !

usare i display 7 segmenti senza un driver (tipo max 7219) lo abbiamo fatto quasi tutti

ma.. alla fine chi vuole fare qualche progetto il driver è necessario

"spedisci" la cifra da visualizzare al driver e fa tutto lui

arduino può occuparsi di fare altro con tutte le risorse e più pin liberi

senza driver è tempo perso

Ciao

Io ho pilotato direttamente due display per fare un timer per la magnetoterapia di Nuova Elettronica.
Anch'io ho avuto il problema dei segmenti che rimanevano leggermente accesi. L'ho risolto molto semplicemente correggendo la scansione, in quanto commutavo il display prima di cambiare la cifra sui segmenti. Invece devi lasciare per un attimo i display spenti: cifra, anodo, aspetti il tempo prefissato, spegni l'anodo, cambi la cifra, altro anodo, tempo prefissato... ... ...

Inoltre sarebbe molto più semplice fare array con tutti i segmenti di ogni carattere: car0, carA, carP, carASTER. In questo modo, per far comparire un carattere devi solo mandare l'array ai catodi. Un grande vantaggio, poi, ottieni con la "manipolazione" delle porte (cerca port manipulation): la porta D dell'ATmega328P ha 8 bit, giusti giusti per pilotare i 7 segmenti e il punto di un display! :slight_smile: Scrivere A, quindi, diventa semplicemente (pilotando i catodi direttamente, quindi a livello 0, cosa che si può fare alimentando i segmenti ad esempio con 5mA; per gli anodi servono due transistor):

//      ABCDEFG.
PORTD=0b00010001;

Puoi anche usare uno switch/case:

switch(n)      // Anodo comune
               // D 76543210
  {            //  dpGFEDCBA (0: segmento acceso)
  case 0: {PORTD=0b11000000;} // Accende i segmenti a 0
  break;
  case 1: {PORTD=0b11111001;}
  break;
  case 2: {PORTD=0b10100100;}
  break;
  }