Un controller per display LED.
MAX7219
di Maxim è stato progettato per controllare display a LED a
segmenti o matrice di punti.
In effetti il foglio dati tratta due componenti: MAX7219, con
interfaccia seriale sincrona e MAX7221, identico, ma con interfaccia
compatibile SPI/QSPI/Microwire e con la limitazione dello slew rate per
minimizzare i disturbi elettromagnetici dovuti alla commutazione delle
uscite..
|
Entrambi possono comandare 8 cifre a 7 segmenti (catodo comune) o 64
LED singoli per realizzare bar-graph o array 5x7 o 8x8 e simili.
Il chip include una codifica BCD code-B programmabile e una memoria
statica 8x8 che conserva ogni digit.
Il controller permette di regolare la corrente nei LED con una sola
resistenza esterna collegata al pin Iset, oltre a disporre della
possibilità di variare la luminosità da programma.
L'interfaccia col microcontroller richiede 3 pin. |
L' ordine fisico dei digit è arbitrario e dipende dai collegamenti.
I dati, raccolti in pacchetti da 16 bit, sono inviati al controller sulla
linea DIN e sono accettati sul fronte di salita del segnale di clock CLK. Per
il MAX7219 lo stato del pin LOAD è indifferente, ma i dati inviati sono
caricati nei registri interni sul fronte di salita del segnale applicato a
LOAD.
Per il MAX7221 il pin LOAD diventa un CS
e l' accesso al chip è possibile solo quando questo pin è a livello basso;
anche per MAX7221 i dati inviati sono caricati nei registri interni sul
fronte di salita del segnale applicato a CS.
I pacchetti di bit sono inviati a partire dal più significativo e
sono composti da un indirizzo a 8 bit e 8 di dato vero e proprio.
Dato che gli indirizzi dei registri interni vanno solo da 0 a Fh, i primi 4 bit
(D15:12) non sono considerati e possono assumere qualsiasi valore.
I registri.
I registri interni sono la chiave del funzionamento del controller. Sono
accessibili 16 registri, di cui due non sono utilizzati:
Registro |
Indirizzo |
hex |
hex
recc. |
Descrizione |
Valore dato |
D15
-12 |
D11 |
D10 |
D9 |
D8 |
Nop |
x |
0 |
0 |
0 |
0 |
x0h |
0h |
nessuna operazione |
- |
Digit 0 |
x |
0 |
0 |
0 |
1 |
x1h |
11h |
Digit 0 |
0h-Fh |
Digit 1 |
x |
0 |
0 |
1 |
0 |
x2h |
12h |
|
0h-Fh |
Digit 2 |
x |
0 |
0 |
1 |
1 |
x3h |
13h |
|
0h-Fh |
Digit 3 |
x |
0 |
1 |
0 |
0 |
x4h |
14h |
|
0h-Fh |
Digit 4 |
x |
0 |
1 |
0 |
1 |
x5h |
15h |
|
0h-Fh |
Digit 5 |
x |
0 |
1 |
1 |
0 |
x6h |
16h |
|
0h-Fh |
Digit 6 |
x |
0 |
1 |
1 |
1 |
x7h |
17h |
|
0h-Fh |
Digit 7 |
x |
1 |
0 |
0 |
0 |
x8h |
18h |
Digit 7 |
0h-Fh |
Decode |
x |
1 |
0 |
0 |
1 |
x9h |
19h |
Per ogni digit:
- 1 attiva il code-B
- 0 disattiva la codifica |
0-FFh |
Intensity |
x |
1 |
0 |
1 |
0 |
xAh |
1Ah |
Intensità luminosa (16 livelli) |
0-Fh |
Scan Limit |
x |
1 |
0 |
1 |
1 |
xBh |
1Bh |
Limite scansione (8 valori). |
0-8 |
Shutdown |
x |
1 |
1 |
0 |
0 |
xCh |
1Ch |
1 - modo normale
0 - modo shutdown |
0-1 |
nd |
x |
|
|
|
|
xDh |
- |
non utilizzato |
- |
nd |
x |
|
|
|
|
xEh |
- |
non utilizzato |
- |
Test |
x |
1 |
1 |
1 |
1 |
xFh |
1Fh |
1 - tutti i LED on
0 - disabilita test |
0-1 |
Gli indirizzi dei registri vanno da 00h a 0Fh, ma, dato che i 4 bit
maggiori dell' indirizzo non sono considerati, 10h, 20h, 30h, ecc. fino a F0h
sono equivalenti, come 24h, 34h, 54h, e così via.
Nell' AN876,
Maxim raccomanda l'uso dei valori indicati nella colonna hex recc.
Per ogni indirizzo, che corrisponde al controllo di una funzione, va
inviato immediatamente il relativo dato.
Registro 0 : NOP
Qualunque dato inviato a questo registro non produce alcuna operazione.
Questo viene utilizzato nel caso in cui siano collegati i cascata più
controller, collegando il pin DOUT con il DIN del successivo chip. I pin LOAD/CS
sono collegati assieme, come pure il clock CLK.
Così, ad esempio, avendo 4 controller in cascata e
volendo scrivere sul quarto, si invieranno i 16 bit voluti e tre NOP. Quando
LOAD/CS passerà da livello baso a livello alto, nei primi tre controller
sarà caricato il NOP e il dato voluto sarà caricato nel quarto.
Qui sotto un esempio di connessione in cascata di due controller
Registro 1-8 : Digit
In modo code-B i LED sono raccolti a gruppi di 8 con la possibilità di
comandare un digit a 7 segmenti + punto decimale.
Ogni registro dati contiene il valore attribuito ai LED. Il valore da inviare
come dato corrisponde al simbolo che si vuole visualizzare.
Il punto decimale è comandato dal bit 7.
|
Anche se si utilizzano LED singoli o altri elementi di
visualizzazione, i dati inviati sono conservati nelle celle di memoria
a gruppi di 8.
Il valore da inviare come dato corrisponde ai LED che si
vogliono accesi (1 = acceso, 0= spento). |
Registro 9 : Decode
Ogni bit a 1 fa si che il digit corrispondente sia codificato. Se il bit è
a 0 la codifica è disabilitata.
Registro 10 : Intensity
Il dato inviato a questo registro modifica il duty cicle e quindi la
luminosità del display. MAX7219 e 7221 hanno un diverso comportamento. La
frequenza di scansione tipica è 800Hz.
Registro 11 : Scan Limit
Il dato inviato al registro limita la scansione dei digit. In questo
modo si può accendere solamente una parte dei LED.
Va notato che la limitazione dei digit influisce sulla luminosità.
La funzione è utile nel caso di controllo di matrici di punti affinché il
controller non mandi inutilmente dati ad una colonna inesistente.
Registro 12 : Shutdown
Caricando 1 in questo registro il modo shutdown è disabilitato e il display
è visibile normalmente.
Caricando 0, si abilita lo shutdown; il display è spento, ma i dati sono
conservati e il controller riceve i comandi inviati sulla linea di
comunicazione seriale.
Il modo shutdown può essere usato per condizioni di basso consumo o anche per
far lampeggiare l'intero display.
Il controller resta nel modo scelto fino a che il registro non è modificato.
Registro 13-14 : non utilizzati
dati inviati a questi indirizzi non hanno effetto.
Registro 16 : Test
Portando a 1 il contenuto del registro, si attiva il modo test: tutti
i LED sono accesi alla massima luminosità, ma i dati conservati nei registri non vengono modificati.
Portando il registro a 0 si ritorna al modo normale.
Il controller resta nel modo scelto fino a che il registro non è modificato.
All'arrivo dell' alimentazione il controller si predispone in modo shutdown,
con la scansione limitata ad 1 digit, modo non decodificato e l'intensità al
valore minimo.
Quindi, dopo il power on, occorre inizializzare il controller per la modalità
desiderata.
Le temporizzazioni dell' interfaccia.
Dal punto di vista delle temporizzazioni dei segnali, abbiamo la seguente
situazione:
I tempi limite (in ns) sono riportati nella seguente tabella:
Segnale |
Simbolo |
min |
CLK pulse low |
tcl |
50 |
CLK pulse high |
tch |
50 |
DIN setup time |
tds |
25 |
DIN hold time |
tdh |
0 |
CLK to LOAD rise hold time |
tcsh |
0 |
LOAD to nesxt CLK |
tldck |
50 |
LOAD pulse high |
tcsw |
50 |
Possiamo osservare che si tratta di tempi molto brevi, che non richiedono
particolare attenzione per microcontroller con clock anche di 40MHz (in cui il
ciclo
istruzione è 100ns).
Il collegamento potrà essere effettuato con 3 qualsiasi pin del
microcontroller, ma anche utilizzando la modalità SPI del modulo MSSP; in
quest'ultima applicazione MAX7221 è più consigliato.
Maggiore è la velocità a cui si intendono inviare dati, minore dovrà essere
la lunghezza del cavo di collegamento tra I/O del micro e il MAX7219. Cavi
troppo lunghi caricano capacitivamente le linee, deformando i fronti di
commutazione dei segnali e richiedono una riduzione della velocità del clock
della comunicazione.
Regolazione della corrente nei LED.
La corrente nei LED è circa 100 volte la corrente nel pin ISET.
Modificando il valore della Rset è possibile cambiare questa corrente.
Si sconsiglia di superare i 40mA per LED; se sono necessarie correnti
maggiore occorrerà inserire buffer esterni. In ogni caso la corrente
complessiva massima (tutti i LED accesi) non dovrà superare 330mA.
La corrente che alimenta i LED transita nel controller e quindi è necessario
considerare anche la massima dissipazione possibile per package del componente
(al massimo circa 1W per la versione DIP e circa 940mW per la versione SO). La
formula per valutare la potenza è:
PD = (V + x8mA) + (V+ - Vled) (DUTY x Iseg x N)
dove V+ è la tensione di alimentazione (da 4 a 5.5V), DUTY
è il duty cycle impostato nel registro di intensità, N è il
numero dei segmenti (caso peggiore 8), Vled è la tensione di
conduzione dei LED e Iseg è la corrente impostata con Rset.
Occorrerà fare si che la potenza dissipata non faccia superare al chip la
temperatura di lavoro prevista.
|
Va considerato anche che la riduzione della scansione a tre digit o
meno porta ad una eccessiva dissipazione.
Quindi occorrerà regolare la Rset in modo da aggiustare la
corrente in funzione del numero di digit. La tabella a lato da una
indicazione delle correnti massime ammesse. |
Il foglio dati riporta i parametri ed i valori limite per la valutazione
della dissipazione.
Note.
MAX7219 non è un componente economico. Il mercato cinese rende disponibili
cloni, costruiti in nelle tante foundries cinesi, e che hanno un costo quanto
mai minore dell' originale. In rete è possibile trovare svariati riferimenti.
Da quanto si rileva, si tratta di integrati diversamente progettati e
realizzati, ma che svolgono le stesse funzioni del MAX7219, del quale
riportano la sigla. Da prove effettuate su alcuni di questi cloni, non sono
risultati mal funzionamenti rispetto all'originale.
Se si sta sperimentando o semplicemente non si hanno molti soldi, l'opzione
più economica è da provare (anche se probabilmente si sta sostenendo un settore che eticamente non dovrebbe
esistere).
Se si tratta di lavoro, è consigliabile verificare a fondo i cloni scelti o, per essere sicuri
del risultato a lungo termine, utilizzare gli originali.
In relazione al costo è utile sapere che AMS
(AustriaMicroSystems) produce l' integrato AS1107
che è direttamente compatibile con MAX7221/7219 ed ha un costo minore di
quello di Maxim.
Documentazione.
|