LED/Key controller.
La cinese Titan produce numerosi circuiti integrati per comandare display e tastiere, tra cui
il TM1638.
Questo controller è la base di alcune schede adatte per
la sperimentazione con i microcontroller e facilmente reperibili nel WEB con
costi veramente interessanti.
TM1638 ha le seguenti caratteristiche:
- controlla una matrice di LED 8 x 10
- pilota display ad anodo o catodo comune
- luminosità aggiustabile - 8 livelli
- scansione di 3 x 8 contatti in ingresso
- interfaccia sincrona a 3 fili, dati / clock / strobe
E' analogo a TM1640, che consente di controllare un numero maggiore di
display e tasti.
Lo schema applicativo tipico per display anodo comune è il seguente:
Il chip è disponibile in package SOP a 28 pin. La piedinatura è la
seguente:
|
Label |
Nome |
Pin |
Descrizione |
|
DIO |
Data I/O |
26 |
Ingresso/uscita dati.
In scrittura il dato è trasferito sul fronte di salita del CLK.
In uscita, sul fronte di discesa.
In trasmissione, è un open drain e richiede un pull-up. |
CLK |
Ingresso clock |
27 |
Clock della comunicazione |
STB |
Strobe |
28 |
Inizializza l'interfaccia sul fronte di discesa per ricevere
istruzioni. Il primo byte dopo
STB che diventa basso è considerato una
istruzione. Quando una istruzione è processata
gli altri processi vengono bloccati.
Con STB a livello alto, il CLK viene ignorato. |
K1-K3 |
Input scan tastiera |
1-2-3 |
Ingresso dei pin dati dalla tastiera. Pull-down interni da 10k |
SG1-KS1
SG8-KS8 |
Uscite (segmenti) |
5-12 |
Uscita di comando dei segmenti (P channel open drain) e scansione
tasti |
GRID1-GRID8 |
Uscite (digit) |
24-19 |
Uscite anodo comune digit (N channel open drain) |
VDD |
alimentazione |
15
|
alimentazione + |
GND |
comune |
18
|
massa comune |
Il foglio dati dichiara che TM1638 è alimentabile fino a 5V e può fornire fino
a 50mA di sink current ai segmenti del display.
Il foglio dati, in coda, riporta anche alcune tabelle di parametri elettrici.
L'interfaccia di comunicazione.
La comunicazione avviene su tre fili:
- CLK : clock, fornito dal master
- STB : strobe, fornito dal master
- DIO : data i/o bi direzionale
Si tratta di una comunicazione sincrona:
i dati provenienti dal microprocessore possono essere variati fino a che il
clock è basso e sono letti sul fronte di salita.
La
condizione di avvio della comunicazione è l'applicazione di un livello basso
sulla linea
STB.
Quando
STB
è a livello alto, TM1638 non risponde ad alcuna
trasmissione di dati o comandi. Questo consente di collegare più TM1638 sulle
stesse linee di clock e dati, dedicando ad ognuno una linea di strobe
separata, analogamente al segnale SS/CS delle comunicazione SPI.
Lo schema proposto dal costruttore (vedi sopra) include pull-up da 10k
sulle linee di comunicazione e condensatori da 100pF vero massa,
inseriti, questi, per ridurre i disturbi in ambienti applicativi critici.
In effetti, il costruttore indica TM1638 come adatto ad impieghi in
ambienti con disturbi EMC, come elettrodomestici e simili.
SPI?
L'interfaccia parrebbe adattarsi alle specifiche di una comunicazione SPI, gestibile attraverso il modulo MSSP presente in molti microcontroller.
Il pin STB ha funzione analoga al SS/CS di SPI: quando si comunica
con il TM1638, STB deve essere a livello basso. Se la linea è a livello
alto, il chip non accetta alcun dato.
Per la trasmissione o ricezione di dati, si
imposta il pin CLK a livello basso, quindi si imposta il pin DIO col valore
voluto e si riporta il pin CLK a livello alto. La transizione consente al chip
di acquisire il dato.
Però, in pratica esistono alcune grosse differenze:
- Una interfaccia SPI standard ha due linee per i dati,
ingresso e uscita (MOSI/MISO o SDO/SDI), mentre TM1638 dispone di una sola
linea dati bidirezionale (DIO).
La cosa potrebbe essere corretta unendo SDO/SDI con DIO, ma interponendo un diodo Schottky
oppure una resistenza tra la
linea DIO e SDO, per isolare la condizione a livello alto.
- In uscita, il pin DIO del TM1638 è un open drain e
quindi richiede un pull-up
-
I bit meno significativi vengono inviati per primi, mentre nell'interfaccia
SPI standard è proprio l'opposto.
Occorre disporre di una periferica SPI che possa invertire l'ordine di
emissione.
Ad esempio, in C per Arduino e simili:
shiftOut(data,
clock,
LSBFIRST,
address)
In mancanza di questa possibilità, si dovranno 8 volte i bytes da inviare e quelli
ricevuti.
La struttura dei registri.
TM1638 può ricevere comandi e dati e la comunicazione comporta una semplice struttura comando/dato.
Quanto inviato al TM1638 segue la regola per cui il primo byte
dopo che STB è stato mandato basso è inteso come un comando. Questo può
essere singolo, oppure seguito da uno o più bytes di dati a seconda della
funzione selezionata.
Un blocco trasmesso è terminato dalla linea STB che torna a livello alto.
Sono possibili le seguenti funzioni:
- Attivare/disattivare il display e regolarne la luminosità
- Selezionare il modo di ingresso dati, se a singolo in dirizzo o ad
indirizzo auto incrementante
- Scrivere un byte ad un indirizzo specifico
- Scrivere più bytes a partire da un indirizzo
- Leggere i tasti
I comandi vengono processati direttamente, mentre i dati sono inviati ai
registri interni:
- Esistono 8 registri doppi (quindi un totale di 16 indirizzi, da 00h 0Fh), che corrispondono ai segnali dei pin
GRD8:1
- Ogni array controllabile è composto da 10 bit corrispondenti alle
combinazioni GRID-SEG, agli incroci delle quali si trovano collegati i LED comandabili.
E' possibile scrivere un solo registro (con il modo a registro singolo) o
anche più registri successivamente (con il modo auto incrementate). Per quanto
bizzarra, viene replicata la tabella proposta sul foglio dati:
seg1 |
seg2 |
seg3 |
seg4 |
seg5 |
seg6 |
seg7 |
seg8 |
seg9 |
seg10 |
x |
x |
x |
x |
x |
x |
|
b0 |
b1 |
b2 |
b3 |
b4 |
b5 |
b6 |
b7 |
b0 |
b1 |
b2 |
b3 |
b4 |
b5 |
b6 |
b7 |
xxhL 4 bit bassi |
xxhU 4 bit alti |
xxhL 4 bit bassi |
xxhU 4 bit alti |
00hL |
00hU |
01hL |
01hU |
GRID1 |
02hL |
02hU |
03hL |
03hU |
GRID2 |
04hL |
04hU |
05hL |
05hU |
GRID3 |
06hL |
06hU |
07hL |
07hU |
GRID4 |
08hL |
08hU |
09hL |
09hU |
GRID5 |
0AhL |
0AhU |
0BhL |
0BhU |
GRID6 |
0ChL |
0ChU |
0DhL |
0DhU |
GRID7 |
0EhL |
0EhU |
0FhL |
0FhU |
GRID8 |
La tabella va intesa in questo senso:
- sono controllabili 80 LED o segmenti
- questi sono organizzati in 8 array da 10, dipendenti ognuno da una linea GRIDn
- ogni array fa capo a due bytes, corrispondenti ognuno ad un
indirizzo interno al chip
- i bytes agli indirizzi pari (0, 2, 4, ecc.) hanno gli 8 bit
corrispondenti ognuno alla possibilità di controllare un LED (o segmento)
-
i bytes agli indirizzi dispari (1,3,5, ecc.) hanno solamente i primi due
bit (b1:0) che corrispondono a LED/segmenti; gli altri bit non sono usati.
I dati contenuti nei registri sono scanditi dal clock interno e comandano
LED e display collegati.
I registri di indirizzo pari corrispondono alle linee SEG8:1.
I registri con indirizzo dispari corrispondono alle linee SEG10:9 (i
rimanenti non sono implementati e sono a 0).
Dove si hanno cifre a sette segmenti è sensato utilizzare gli 8 bit del primo byte per i 7
segmenti più il punto decimale e usare i due bit del secondo byte per
comandare altri LED.
Questa è la disposizione comune sui moduli cinesi, che contengono
generalmente 8 display a 7 segmenti e 8 LED. Più avanti sono presentati
alcuni di questi moduli di facile reperibilità.
Ovviamente, TM1638 potrà essere usato per comandare una qualsiasi altra
configurazione di LED o segmenti, ad esempio display a matrice di punti o
display custom. In tali casi si determinerà la corrispondenza tra elementi
del display e bit dei registri.
Il contenuto dei registri sarà presentato sul relativo display con un
multiplex che utilizza il clock interno (450kHz circa) e un duty cycle
variabile e programmabile per regolare la luminosità.
Note.
- TM1638
non dispone di una decodifica tra dato e segmenti, per cui i bit inviati a 1
corrispondono a segmenti accesi, quelli a 0 corrispondono a segmenti spenti.
Occorre utilizzare una semplice lookup table esterna per convertire i simboli
che si intendono presentare nella
corrispondente maschera di bit da visualizzare.
- All'accensione il display è spento (condizione a basso consumo), ma i
registri non sono azzerati e possono contenere valori casuali.
I comandi.
Nel primo byte inviato dopo il fronte di
discesa del clock con STB= 0, va inserito un comando.
I comandi sono gruppi di 8 bit di cui i bit 6 e
7 indicano il tipo:
b7 |
b6 |
Comando |
0 |
1 |
Comandi relativi al trattamento dei dati |
1 |
0 |
Controllo del display |
1 |
1 |
Settaggio indirizzo del registro |
Nel caso in cui STB vada alto durante la trasmissione di
un comando, questo viene invalidato (restano validi i comandi e dati inviati
prima).
I comandi relativi al trattamento dei dati sono:
b7 |
b6 |
b5 |
b4 |
b3 |
b2 |
b1 |
b0 |
Funzione |
Descrizione |
0 |
1 |
0 0 |
|
|
0 |
0 |
Lettura/scrittura
dati |
Scrive dato al display |
0 |
1 |
|
|
1 |
0 |
Legge scansione ingressi |
0 |
1 |
|
0 |
|
|
Modalità
indirizzamento |
Incremento automatico |
0 |
1 |
|
1 |
|
|
Indirizzo fisso |
0 |
1 |
0 |
|
|
|
Test mode |
Modo normale |
0 |
1 |
1 |
|
|
|
Modo test |
I bit b0 e b1 non devono contenere 01 o 11.
I bit7:6 sono l'identificatore del comando.
I bit5:4 possono essere a 0. Quanto ai
bit che non sono indicati, si deve intendere che anche questi vanno posti a 0.
Però, riempiendo gli spazi vuoti con 0, abbiamo che il comando
"Modo normale" ha lo stesso valore del comando "Scrive dato sul
display" e "Incremento automatico", per cui la
tabella è da interpretare così:
- 01000000 0x40 è il modo operativo
normale: fa si che il byte inviato di seguito sia un dato verso il
display, con l'incremento automatico degli indirizzi di destinazione
- 01000010 0x42 avvia la lettura degli
ingressi
- 01000100 0x44 impone un indirizzo fisso
- 01001000 0x48 modo test (per uso interno)
Non esiste alcuna descrizione del "Modo test", ma, dato che è
indicato cripticamente come "(for internal)" si deve supporre
che si tratti di ausilio per i test di funzionamento del chip prima del
rilascio dalla foundry.
Sono possibili tre modi operativi (comando 0x40 e 0x44):
- 0x40 con indirizzo di destinazione auto incrementante: se al
comando facciamo seguire l'indirizzo di un registro, i dati successivi
saranno inviati progressivamente a indirizzi successivi a partire da quello
selezionato.
- 0x44 con indirizzo di destinazione fisso: se al comando facciamo
seguire l'indirizzo di un registro, i dati successivi saranno
inviati solo a questo indirizzo.
- 0x42 con la successiva lettura di 4 bytes che codificano lo stato
dei pulsanti
Gli indirizzi dei registri, con
i bit7:6 a 1, corrispondono ai LED comandabili.
In generale, sulle schede come quelle presentate di seguito, gli indirizzi
pari corrispondono ai display a 7 segmenti, mentre gli indirizzi pari ai LED:
b7 |
b6 |
b5 |
b4 |
b3 |
b2 |
b1 |
b0 |
Indirizzo |
Bit utili |
1 |
1 |
0 0 |
0 |
0 |
0 |
0 |
C0h |
8 |
1 |
1 |
0 |
0 |
0 |
1 |
C1h |
2 |
1 |
1 |
0 |
0 |
1 |
0 |
C2h |
8 |
1 |
1 |
0 |
0 |
1 |
1 |
C3h |
2 |
1 |
1 |
0 |
1 |
0 |
0 |
C4h |
8 |
1 |
1 |
0 |
1 |
0 |
1 |
C5h |
2 |
1 |
1 |
0 |
1 |
1 |
0 |
C6h |
8 |
1 |
1 |
0 |
1 |
1 |
1 |
C7h |
2 |
1 |
1 |
1 |
0 |
0 |
0 |
C8h |
8 |
1 |
1 |
1 |
0 |
0 |
1 |
C9h |
2 |
1 |
1 |
1 |
0 |
1 |
0 |
CAh |
8 |
1 |
1 |
1 |
0 |
1 |
1 |
CBh |
2 |
1 |
1 |
1 |
1 |
0 |
0 |
CCh |
8 |
1 |
1 |
1 |
1 |
0 |
1 |
CDh |
2 |
1 |
1 |
1 |
1 |
1 |
0 |
CEh |
8 |
1 |
1 |
1 |
1 |
1 |
1 |
CFh |
2 |
Da notare che, in effetti, il Master dovrà inviare l'indirizzo più i bit7:6 a
1; di conseguenza il valore da inviare, ad esempio, per l'indirizzo 0 sarà
C0h, quello per l'ultimo indirizzo, 0Fh, sarà CFh.
In modo a incremento singolo, dopo il comando si dovrà inviare l'indirizzo a
cui scrivere e il relativo dato.
In modo auto incremento deve essere inviato l'indirizzo di partenza e i dati
in successione; può essere scritta una quantità qualunque di dati fino al
riempimento dei registri.
Di default al reset (arrivo dell'alimentazione) l'indirizzo selezionato è 00h, ovvero la prima cifra a sinistra.
E' possibile scrivere un numero qualunque di registri.
Se viene inviato un indirizzo superiore a 0Fh, esso viene ignorato e non ci sono
effetti fino a che un indirizzo valido non viene inviato.
Dopo l'applicazione della tensione di alimentazione il contenuto dei
registri non è azzerato, per cui ci saranno segmenti/LED accesi in combinazioni
casuali; si può azzerarne il contenuto
scrivendo 0 in tutti e sedici i registri.
I comandi relativi al controllo del display riguardano lo stato
on/off dello stesso e la variazione della luminosità, ottenuta con un PWM.
b7 |
b6 |
b5 |
b4 |
b3 |
b2 |
b1 |
b0 |
Funzione |
Descrizione |
1 |
0 |
0 0 |
|
0 |
0 |
0 |
Luminosità |
PWM 1/16 |
1 |
0 |
|
0 |
0 |
1 |
PWM 2/16 |
1 |
0 |
|
0 |
1 |
0 |
PWM 4/16 |
1 |
0 |
|
0 |
1 |
1 |
PWM 10/16 |
1 |
0 |
|
1 |
0 |
0 |
PWM 11/16 |
1 |
0 |
|
1 |
0 |
1 |
PWM 12/16 |
1 |
0 |
|
1 |
1 |
0 |
PWM 13/16 |
1 |
0 |
|
1 |
1 |
1 |
PWM 14/16 |
1 |
0 |
0 |
|
|
|
Display
on/off |
Display OFF |
1 |
0 |
1 |
|
|
|
Display ON |
La tabella non è molto chiara. In effetti risulta che il
bit3 on/off deve essere sommato al valore della luminosità. Così si ha che:
- 10000000
0x80
spegne il
display
- 10001000
0x88
accende il
display con PWM 1/16
- 10001001-100001111 0x89-0x8F 7 ulteriori step di regolazione della
luminosità
Dopo l'applicazione della tensione, il display è spento, che è la
condizione a minor consumo.
Per illuminare i segmenti attivi occorre inviare un comando di on con la
luminosità voluta.
Una volta programmata una modalità di indirizzamento o un valore di
luminosità, questi restano impostati fino a quando non sono cambiati da un
diverso comando oppure viene a mancare l'alimentazione.
Lettura della tastiera.
TM1638 può supportare 3 blocchi da 8 contatti ciascuno.
I tasti sono collegati
a tre comuni (K3:1) e a 8 linee (KS8:1), comuni con il comando dei segmenti
(SEG8:1).
La condizione dei tasti è richiedibile
inviando uno specifico
comando (0x42), seguito da un loop di lettura di 8 bit. Viene trasmesso per
primo il bit più basso (bit0). Nella emissione di dati, il
pin DIO del TM1638 risulta configurato come open drain e quindi richiede un
pull-up esterno.
I bytes letti codificano il pulsanti in questo modo:
b0 |
b1 |
b2 |
b3 |
b4 |
b5 |
b6 |
b7 |
|
K3 |
K2 |
K1 |
- |
K3 |
K2 |
K1 |
- |
KS1 |
KS2 |
Byte 1 |
KS3 |
KS4 |
Byte 2 |
KS5 |
KS6 |
Byte 3 |
KS7 |
KS8 |
Byte 4 |
In sostanza, sono significativi i bit b2:0 e b6:4 di ogni
byte.
La scansione della tastiera viene eseguita
automaticamente dal TM1638 senza il controllo dell'utente. Gli utenti
devono solo leggere i codici chiave in base alla sequenza temporale. Ci vuole
un ciclo di visualizzazione per la scansione di
tastiera e un ciclo di visualizzazione dura circa 4.7ms. Durante questo
tempo, se vengono premuti due tasti diversi, il codice chiave
letto in entrambe le volte è quella del tasto premuto
per primo.
Possono essere premuti più tasti appartenenti alla stessa riga (KSn): ad
esempio, per K1 e KS8, K2 e KS8, K3 e KS8 nello stesso momento, i bit 6:4 del
quarto byte sono a 1. Non sono ammessi premuti pulsanti con lo stesso K, ma su
KS diversi.
Esistono diverse possibilità di collegare i tasti.
|
Questa è la situazione più semplice, da usare dove non è richiesta
la pressione di più tasti contemporaneamente.
Premendo S1, il bit b0 del primo byte letto sarà a 1.
Premendo più pulsanti contemporaneamente, si metteranno in contatto
le relative linee SEGn, col risultato di avere i segmenti relativi
accesi.
Se, ad esempio ,abbiamo premuto S1 e S2, ci ritroveremo con D1 e d2
accesi |
|
Una soluzione consiste nell'inserire i pulsanti che devono essere
premuti contemporaneamente su due linee Kn diverse. |
|
Un'altra soluzione è quella di inserire delle resistenze in serie ai
tasti. |
|
Oppure utilizzare dei diodi per separare i pulsanti, soluzione,
questa, che è la più comune nei moduli commerciali. |
Il foglio
dati riporta un diagramma relativo alla scansione dei tasti:
La scansione tra i KS richiede un tempo di circa 500us,
dipendente dal clock del chip.
Nella lettura
dello stato dei pulsanti, occorre introdurre un wait di almeno 1us tra il
comando 0x42 (lettura dei tasti) e i successivi
bytes letti.
La gestione dei registri.
La gestione dei registri comporta una semplice struttura comando/dato.
Vediamo nel diagramma successivo un esempio di trasmissione di comando
semplice e ad indirizzo auto
incrementante:
Il primo invio comprende un comando singolo di settaggio del modo di
indirizzamento (in questo caso auto incrementante).
STB viene portato basso all'inizio della trasmissione e riportato alto alla fine
della trasmissione.
Command2 contiene l'indirizzo di partenza ed è seguito dalla trasmissione del
numero voluto di dati. STB a livello alto
chiude la trasmissione.
Command3 è un comando semplice, come la regolazione
della luminosità.
- Command1 set display mode
- Command2 invio indirizzo partenza e n Data
- Command3 set luminosità
Vedere anche gli esempi operativi più avanti.
Se scriviamo ad indirizzi singoli, ogni gruppo comando/dato è separato dal
successivo dallo strobe.
- Command1
set display mode
- Command2-Data1 invio indirizzo e dato
- Command3-Data2 invio indirizzo e dato
- ....
- Command4 set luminosità
Vedere anche gli esempi operativi più avanti.
Nella scrittura di un byte vanno rispettate queste
temporizzazioni: I
dati sono acquisiti sul fronte di salita del clock. Per la lettura
dello stato dei pulsanti:
- Command1 set key
read mode
- wait 1us min.
- Data1
lettura primo byte
- Data2
lettura secondo byte
- Data3
lettura terzo byte
- Data4
lettura quarto byte
Da notare che non si deve alzare e ri-abbassare lo strobe dopo
in comando di lettura tasti, ma occorre inserire un wait di almeno 1us prima
della lettura dei 4 bytes.
Timing.
Parametro |
min. |
max. |
Descrizione |
TPLZ |
|
300ns |
transmit delay time |
TPZL |
|
100ns |
|
PWCLK |
400ns |
|
clock pulse width |
PWSTB |
1us |
|
gate pulse width |
Tsetup |
100ns |
|
data building time |
Thold |
100ns |
|
data hold time |
TIHZ |
|
120ns |
STB falling time |
TTZH |
|
500ns |
STB rising time |
Fmax |
|
1MHz |
clock frequency |
Display
e LED. Si possono pilotare display a catodo comune:
Così, per accendere la cifra 0 sarà necessario scrivere
00111111 (3Fh) nel registro voluto. Il punto decimale (dp) corrisponde al bit7.
Scrivendo 0 tutti i segmenti saranno spenti. E' possibile anche
usare display ad anodo comune:
Hardware tipico.
TM1638 può comandare fino a 80 LED o segmenti, che
possono essere configurati nei modi più diversi.
In commercio si trovano alcuni moduli di produzione cinese con un certo numero
di LED, display e tasti, riconducibii ai tre esempi riportati di seguito. Come
comune per questa classe di prodotti, essi non sono accompagnati da alcuna
documentazione e occorre fare ricerche sul WEB per avere qualche informazione in
più.
Una scheda tipica con TM1638, in vendita su molti siti, è dotata di 8 cifre a
sette segmenti, 8 LED bicolore e 8 pulsanti.
|
Da notare il connettore DIL a 10 pin che consente di collegare in
cascata più moduli: DIO e CLK sono connessi a tutti, mentre ogni modulo
dipende da una linea STB propria.
La catena si realizza con cavi piatti da dieci poli.
Qui
lo schema elettrico.
|
Funzione |
pin |
pin |
Funzione |
Vcc |
1 |
2 |
GND |
CLK |
3 |
4 |
DIO |
STB0 |
5 |
6 |
STB1 |
STB2 |
7 |
8 |
STB3 |
STB4 |
9 |
10 |
n.c. |
|
I segnali necessaria alla scheda locale sono ai pin 1/2/3/4/5.
I pin 6/7/8/9 sono gli strobe per le schede successive |
Ognuno dei display a 7 segmenti è accessibile ad un
indirizzo pari, dove gli 8 bit corrispondono ai segmenti + il dp.
Da notare che TM1638 non dispone di decodificatore e il valore di ogni bit
trasmesso come dato viene riportato al segmento corrispondente.
b7 |
b6 |
b5 |
b4 |
b3 |
b2 |
b1 |
b0 |
|
dp |
seg g |
seg f |
seg e |
seg d |
seg c |
seg b |
seg a |
Così, ad esempio, per avere la cifra 9 occorrerà
accendere i segmenti a, b, c, d, f, g, ovvero inviare il valore 00011111.
Inviando 11111111 si accenderanno tutti i segmenti (cifra 8) più il punto
decimale.
I due bit utili degli indirizzi dispari sono collegati
ai LED bicolori.
La tabella seguente riporta le assegnazioni per questo tipo di scheda.
Registro |
Comando
di
indirizzo |
Funzione |
LED |
00 |
0xC0 |
display 1 |
|
01 |
0xC1 |
LED 1 |
0x01 rosso
0x02 verde |
02 |
0xC2 |
display 2 |
|
03 |
0xC3 |
LED 2 |
0x01 rosso
0x02 verde |
04 |
0xC4 |
display 3 |
|
05 |
0xC5 |
LED 3 |
0x01 rosso
0x02 verde |
06 |
0xC6 |
display 4 |
|
07 |
0xC7 |
LED 4 |
0x01 rosso
0x02 verde |
08 |
0xC8 |
display 5 |
|
09 |
0xC9 |
LED 5 |
0x01 rosso
0x02 verde |
0A |
0xCA |
display 6 |
|
0B |
0xCB |
LED 6 |
0x01 rosso
0x02 verde |
0C |
0xCC |
display 7 |
|
0D |
0xCD |
LED 7 |
0x01 rosso
0x02 verde |
0E |
0xCE |
display 8 |
|
0F |
0xCF |
LED 8 |
0x01 rosso
0x02 verde |
I LED sono collegati alle linee SEG10:9 e, di conseguenza, dipendono
dai registri dispari, con i bit b1:0.
In questo caso (LED bicolore), il bit b0 comanda il colore rosso e il bi b1
comanda il colore verde.
Il bit posto a 0 spegne il LED, mentre a 1 lo
accende.
|
I pulsanti sono collegati tra il comune K3 e SEG8:1, come nella figura a
lato.
I diodi in serie impediscono di disturbare il display se più tasti sono
premuti contemporaneamente.
Dai collegamenti deriva che la codifica è quella visibile nella tabella
seguente:
b7 |
b6 |
b5 |
b4 |
b3 |
b2 |
b1 |
b0 |
|
|
|
|
S5 |
|
|
|
S1 |
byte 1 |
|
|
|
S6 |
|
|
|
S2 |
byte 2 |
|
|
|
S7 |
|
|
|
S3 |
byte 3 |
|
|
|
S8 |
|
|
|
S4 |
byte 4 |
|
Quindi, se S1 è chiuso, la lettura renderà 00000001 nel primo byte e 0 in
tutti gli altri.
Se è chiuso S8, la lettura renderà 00010000 nel quarto byte e così via.
|
Esistono anche schede con LED mono colore.
In questo caso, i LED sono collegati ai GR8:1 ed hanno in comune il SEG9.
Quindi sono comandati dal bit b0 degli indirizzi dispari (b0=1 LED acceso, b0=0
LED spento).
Anche qui i pulsanti hanno in comune K3 e i collegamenti visti sopra.
|
Qui
lo schema elettrico.
|
Si trovano, poi, anche moduli con quantità diverse di display e pulsanti,
come questo, con 8 digit e 16 pulsanti, ma senza LED aggiuntivi. |
Queste schede consentono di aggiungere segnalazioni e pulsanti a qualsiasi
progetto con spesa trascurabile, dato che hanno costi incredibilmente bassi,
sopratutto se con invio diretto dalla Cina.
Esempio operativi.
Come operazione iniziale dopo l'applicazione della tensione, può
rendersi necessario cancellare tutte le locazioni di memoria del TM1638, che
inizialmente possono contenere valori casuali.
Questo si ottiene facilmente impostando la modalità di incremento automatico
dell' indirizzo (0x40), selezionando 0 come indirizzo di partenza (0xC0) e
inviando il dato 0 sedici volte.
- STB basso
- 0x40 ; comando per scrittura a
indirizzo auto incrementante
- STB alto
- STB basso
- 0xC0 ; indirizzo della prima
cifra a sinistra
- 0x00 ; tutto spento
- ripetere il dato per altre 15 volte
- STB alto
Osservare che STB apre e chiude la comunicazione, sia per
l'emissione del comando di modo, sia per la sequenza indirizzo-dati.
Ora che la scheda è pronta a lavorare si potranno inviare dati da
visualizzare.
Per esempio, scriviamo 8 nell'ultima cifra a destra e 1 nella prima a sinistra.
Trattandosi di due indirizzi non consecutivi, usiamo la modalità a indirizzo
singolo.
La sequenza da inviare sarà questa:
- STB basso
- 0x44 ; comando per scrittura a
indirizzo singolo
- STB alto
- STB basso
- 0xC0 ; indirizzo della prima
cifra a sinistra
- 0x06 ; 00000110 che corrisponde
ai segmenti b e c accesi
- STB alto
- STB basso
- 0xCE ; indirizzo dell'ultima
cifra a destra
- 0x7F ; 01111111 che corrisponde a
tutti segmenti accesi
- STB alto
Osservare che STB apre e chiude la comunicazione, sia per
l'emissione del comando di modo, sia per la sequenza delle coppie indirizzo-dati.
Oppure, scriviamo i numeri da 1 a 4 nei primi display, accendendo
i punti decimali e i LED alternativamente di colore diverso:
- STB basso
- 0x40 ; comando per scrittura con
indirizzo auto incrementante
- STB alto
- STB basso
- 0xC0 ; indirizzo della prima
cifra a sinistra
- 0x06 ; 00000110 cifra 1 segmenti b,c
accesi
- 0x01 ; LED rosso
- 0xDB ; 11011011
cifra 2 segmenti a,b,d,g,dp accesi
- 0x02 ; LED verde
- 0xCF ; 01001111 cifra 3 segmenti
a,b,c,d,e,g accesi
- 0x01 ; LED rosso
- 0xB6 ; 10110110
cifra 4 segmenti b,c,e,f,dp
accesi
- 0x02 ; LED verde
- STB alto
Da osservare che, non disponendo il TM1638 di un codificatore, occorre
inviare non le cifre da visualizzare, ma la corrispondente maschera 7 segmenti,
ottenibile da una tabella retlw.
Se vogliamo accendere il terzo LED ed il quarto punto decimale:
- STB basso
- 0x40 ; comando per scrittura con
indirizzo auto incrementante
- STB alto
- STB basso
- 0xC4 ; indirizzo terzo LED
- 0x02 ; LED verde acceso
- 0x80 ; dp del display successivo acceso
- STB alto
Per leggere la situazione dei pulsanti, occorre inviare il comando opportuno
(0x42) e di seguito leggere 4 bytes.
Il primo byte contiene lo stato dei pulsanti S1 (bit 1) e S5 (bit 4),
il secondo byte contiene lo stato dei pulsanti S2 (bit 2) e S6 (bit 5) e così
via. Se un bit è impostato su 1 significa che il pulsante corrispondente è
premuto.
Va inserito un ritardo di almeno 1us tra la lettura di un byte e quella
successiva
- STB basso
- 0x42 ; lettura
pulsanti
- linea DIO lato Master come ingresso
- wait 1us
- legge un byte e salva
- legge un byte e salva
- legge un byte e salva
- legge un byte e salva
- STB alto
- linea DIO lato Master riconfigurata
come uscita
Durante la lettura dello stato dei pulsanti, la linea DIO diventa
una uscita pilotata dal TM1638 e il corrispondente pin del Master deve essere un
ingresso. Il clock è sempre fornito dal Master.
DRIVER.
Sul WEB sono disponibili vari esempi di librerie in C.
Per quanto riguarda l'Assembly, è stato realizzato un driver. Qui trovate una versione
per Enhanced Midrange.
Alcune note sull'hardware. 1. - RC
all'ingresso Su tutte le schedine cinesi con 4 cifre e TM1638 risultano
installati i pull-up da 10k e i condensatori da 100pF sulle linee di ingresso.
Da osservare che DIO, in uscita, non pilota la line a livello alto, ma è
configurato come open drain e richiede il pull-up.
Il valore della capacità non è trascurabile e influenza i tempi di salita e
discesa dei segnali.
2. - Hardware
dei moduli cinesi
Sono disponibili sul mercato, a prezzi molto bassi, moduli con display, LED,
pulsanti e TM1638.
I costi sono quanto mai bassi, ma, come per gran parte dei prodotti cinesi di questa classe, le documentazioni
tecniche di questi moduli non esistono: non c'è neppure un misero foglietto ad
accompagnare l'oggetto, nè si trovano informazioni in tal senso sulla maggior
parte dei siti dei venditori, anche se alcuni, rari, riporta schemi o
addirittura ampie documentazioni (ma solo in cinese...)
Anche per i display si può avere difficoltà a trovare un foglio dati, anche solo indicativo.
Quindi,
salvo ricerche sul WEB, non c'è alcuna informazione di come siano collegati i
componenti e quindi dei registri corrispondenti. Nel caso di moduli
comuni, come quelli tratteggiati prima, è possibile risalire alle connessioni
analizzando i driver esistenti. Nei moduli può non esserci alcuna
indicazione del fatto che i LED siano mono colore; una differenziazione generica
si può fare osservando le foto dei moduli: LED rossi sono solo di questo
colore, LED con il corpo bianco sono bicolori. 3. - L'alimentazione Una nota finale riguarda la tensione di
alimentazione: se TM1638 può essere alimentato da 3 a 5V, è la tensione
minima di conduzione dei LED a determinare il valore minimo di alimentazione.
Così, LED di colore blu
non potranno essere alimentati a meno di 5V.
Documentazione.
|