LED/Key controller.
TM1637 è un controller per LED e tastiera, con le seguenti caratteristiche:
- controlla fino a 8 segmenti x 6 digit
- luminosità aggiustabile
- auto blanking
- scansione di 2 x 8 contatti in ingresso
- interfaccia sincrona a due fili, dati + clock
Lo schema applicativo tipico è il seguente:
Il chip è disponibile in package DIP o SOP a 20 pin. La piedinatura è la
seguente:
|
Label |
Nome |
Pin |
Descrizione |
|
DIO |
Data I/O |
17 |
Ingresso/uscita dati.
In scrittura il dato è trasferito con CLK a livello alto
Ogni trasferimento genera un ACK all'ottavo clock |
CLK |
Ingresso clock |
18 |
Clock della comunicazione (rising edge) |
K1-K2 |
Input scan tastiera |
19-20 |
Ingresso dei pin dati dalla tastiera. Pull-down interni da 10k |
SG1-SG8 |
Uscite (segmenti) |
2-9 |
Uscita di comando dei segmenti (open drain) |
GRID6-GRID1 |
Uscite (digit) |
10-15 |
Uscite anodo comune digit (P channel open drain) |
VDD |
alimentazione |
16 |
alimentazione + |
GND |
comune |
1 |
massa comune |
Il foglio dati dichiara che TM1637 è alimentabile fino a 5V (anche se non
specifica la tensione minima) e può fornire fino
a 50mA di sink current ai segmenti del display.
Il foglio dati, in coda, riporta alcune tabelle di parametri elettrici, ma,
non essendoci diagramma di riferimento, il senso di molte indicazioni di
temporizzazione non è comprensibile.
Pare comunque di capire che la massima frequenza del clock sia 500kHz, con un
tempo minimo di on di 400ns, mentre i dati devo essere presenti almeno 100ns
prima del clock e rimanere stabili 100ns dopo il fronte di discesa dello
stesso.
Non c'è una frequenza minima.
L'interfaccia di comunicazione.
L'assai scarno foglio
dati in chinglish non è molto esplicito, ma è comunque possibile
tratteggiare il funzionamento del dispositivo.
L'interfaccia verso il microcontroller è seriale a due fili, dato e clock
(chiamati DIO e CLK).
I
dati provenienti dal microprocessore devono essere invariati fino a che il
clock è a livello alto. Se il clock è a livello basso, la linea dati può
variare.
La
condizione di avvio della comunicazione è l'applicazione di uno START,
ottenuto con la linea dati che passa da livello alto a livello basso mentre il
clock è a livello alto.
La comunicazione è chiusa inviando la condizione di STOP: la linea dati passa
da livello basso a livello alto con il clock a livello alto.
Se
il trasferimento dati è stato corretto, la periferica risponde con un "ACK",
mandando bassa la linea dati sul fronte di discesa dell'ottavo colpo di clock.
La linea viene rilasciata alla fine del successivo nono colpo di clock.
Lo schema proposto dal costruttore (vedi sopra) include pull-up da 10k
sulle linee di comunicazione e anche condensatori da 100pF vero massa; questi
ultimi sono caratterizzati come "connected to the DIO,
CLK communication port pull-up and pull-down
(sic!) can reduce interference to radio
communications port".
Un effetto, però, è quello di caricare le linee con una capacità
abbastanza sensibile che rende piuttosto curvi i fronti di salita dei segnali.
I2C?
Il foglio dati segnala che la comunicazione "not
equal to 12C bus protocol totally (sic!) because there is no slave address". La ragione esposta indica
che il costruttore non fa parte del
consorzio I2C (dove occorre pagare una quota per disporre di indirizzi
validi). E,
in effetti, i pin di comunicazione sono definiti DIO e CLK e non SDA e SCL.
La mancanza di un indirizzo slave impedisce di inserire il
controller su un bus I2C assieme ad altre periferiche, anche si potrebbe
pensare che da solo
possa essere usato, visto che il protocollo si potrebbe intendere come solo
"non completamente" compatibile.
In particolare, la risposta ACK della periferica segue una diversa
temporizzazione.
Tutto questo significa che
non è possibile utilizzare TM1637 come un qualsiasi elemento I2C
in un bus comune ad altri dispositivi ed occorre
utilizzare un driver adeguato.
A questo riguardo, c'è da dire che, grazie ai
costi ultra bassi di moduli cinesi a 4 o sei cifre, questa interfaccia è diffusa e sono state realizzate librerie ad hoc per Arduino e simili.
La struttura dei registri dati.
TM1637 può ricevere comandi e dati.
La comunicazione comporta una semplice struttura comando/dato.
I comandi vengono processati direttamente, mentre i dati sono inviati ai
registri interni.
Esistono 6 registri, che corrispondono alle sei cifre
comandabili. Ogni bit corrisponde ad un segmento del display. Per quanto
bizzarra, viene replicata la tabella proposta sul foglio dati:
seg1 |
seg2 |
seg3 |
seg4 |
seg5 |
seg6 |
seg7 |
seg8 |
|
b0 |
b1 |
b2 |
b3 |
b4 |
b5 |
b6 |
b7 |
|
xxHL 4 bit bassi |
xxHU 4 bit alti |
|
C0HL |
C0HU |
GRID1 |
C1HL |
C1HU |
GRID2 |
C2HL |
C2HU |
GRID3 |
C3HL |
C3HU |
GRID4 |
C4HL |
C4HU |
GRID5 |
C5HL |
C5HU |
GRID6 |
Quanto inviato ai registri sarà presentato sul relativo display: TM1637
non dispone di una decodifica tra dato e segmenti, per cui i bit inviati a 1
corrispondono a segmenti accesi, a 0 corrispondono a segmenti spenti.
La scrittura di uno o più registri avviene a seguito di uno specifico
comando che ha i bit7:6=10.
I comandi
Nel primo byte inviato dopo il fronte di
discesa del clock nello START iniziale 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 uno STOP sia inviato dal MASTER 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 possono contenere 01 o 11.
Il foglio dati specifica che 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 due 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.
Gli indirizzi dei registri corrispondono alle cifre del display, con
i bit7:6 a 1:
b7 |
b6 |
b5 |
b4 |
b3 |
b2 |
b1 |
b0 |
Indirizzo display |
1 |
1 |
0 0 |
0 |
0 |
0 |
0 |
C0H |
1 |
1 |
0 |
0 |
0 |
1 |
C1H |
1 |
1 |
0 |
0 |
1 |
0 |
C2H |
1 |
1 |
0 |
0 |
1 |
1 |
C3H |
1 |
1 |
0 |
1 |
0 |
0 |
C4H |
1 |
1 |
0 |
1 |
0 |
1 |
C5H |
Di default al reset (arrivo dell'alimentazione) l'indirizzo selezionato è
C0H, ovvero la prima cifra a sinistra.
Se viene inviato un valore superiore a 5, esso viene ignorato e non ci sono
effetti fino a che un indirizzo valido non viene inviato.
In modo auto incremento deve essere inviato l'indirizzo di partenza per i
dati.
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, purtroppo, non è per nulla 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 step di regolazione della
luminosità
La gestione dei registri.
La gestione dei registri comporta una semplice struttura comando/dato.
0 |
|
Le linee di comunicazione CLK e DIO sono mantenute alte con pull-up |
1 |
|
Una condizione di START, simile a quella classica di I2C, è usata per
avviare la comunicazione: DIO (SDA) va a livello basso con CLK (SCL) a
livello alto.
Il fronte di discesa di DIO avvia la comunicazione. |
2 |
|
Segue l'emissione di un comando di 8 bit, sincronizzati con il clock,
che il foglio dati specifica debba essere minore di 250kHz. |
3 |
|
La periferica risponde portando bassa la line DIO (SDA) con un "ACK"
.
La condizione viene
viene cancellata dal fronte di discesa del nono colpo di clock. |
4 |
|
Se il comando non comporta l'emissione di dati, il Master chiude la
comunicazione con una condizione di STOP (CLK va alto con DIO basso).
La comunicazione è chiusa dal fronte di salita di DIO. |
5 |
|
Una successiva comunicazione è riavviata con uno START. Se il comando
richiede uno più dati, questi sono inviati in sequenza, mentre la
periferica risponde "ACK" come visto sopra.
Uno STOP e un successivo START permettono di inviare altri dati/comandi. |
Vediamo nel diagramma successivo un esempio di trasmissione ad indirizzo auto
incrementante:
Il primo dato va all'indirizzo indicato dal
comando; i dati successivi vanno ad indirizzi successivi, incrementati di 1 ad
ogni scrittura. Questo semplifica la trasmissione di più dati, come ad
esempio nella presentazione sul display di più cifre.
Ovviamente non possono essere inviate sequenze di dati in numero superiore ai
display disponibili.
Se si sceglie l'indirizzo fisso, la sequenza può essere questa:
I dati che seguono i comandi sono inviati allo stesso indirizzo. Questo
permette di aggiornare una sola cifra del display.
Lettura della tastiera.
TM1637 può supportare 2 blocchi da 8 contatti ciascuno.
I tasti sono collegati in due blocchi da 8 ciascuno, con in
comune le line K1 o K2. L'altro capo dei tasti viene collegato alle linee di
comando dei segmenti (SG8:1).
Attenzione: TM1637 non supporta la condizione in cui è premuto più di
un tasto.
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).
Se non ci sono tasti premuti, il dato reso è FFh
(11111111).
Se è premuto un tasto, il dato reso è indicato nella tabella seguente,
così come riportata sul foglio dati (bit0 è il primo a sinistra...):
|
SG1 |
SG2 |
SG3 |
SG4 |
SG5 |
SG6 |
SG7 |
SG8 |
K1 |
1110_1111 |
0110_1111 |
1010_1111 |
0010_1111 |
1100_1111 |
0100_1111 |
1000_1111 |
0000_1111 |
K2 |
1111_0111 |
0111_0111 |
1011_0111 |
0011_0111 |
1101_0111 |
0101_0111 |
1001_0111 |
0001_0111 |
In pratica, il byte letto ha questo significato:
K1 |
|
K2 |
b7 |
b6 |
b5 |
b4 |
b3 |
b2 |
b1 |
b0 |
Tasto |
|
b7 |
b6 |
b5 |
b4 |
b3 |
b2 |
b1 |
b0 |
Tasto |
1 1 1 |
1 |
0 |
1 |
1 |
1 |
S1 |
1 1 1 |
0 |
1 |
1 |
1 |
1 |
S2 |
1 |
0 |
1 |
1 |
0 |
S5 |
0 |
1 |
1 |
1 |
0 |
S6 |
1 |
0 |
1 |
0 |
1 |
S9 |
0 |
1 |
1 |
0 |
1 |
S10 |
1 |
0 |
1 |
0 |
0 |
S13 |
0 |
1 |
1 |
0 |
0 |
S14 |
1 |
0 |
0 |
1 |
1 |
S4 |
0 |
1 |
0 |
1 |
1 |
S3 |
1 |
0 |
0 |
1 |
0 |
S8 |
0 |
1 |
0 |
1 |
0 |
S7 |
1 |
0 |
0 |
0 |
1 |
S12 |
0 |
1 |
0 |
0 |
1 |
S11 |
1 |
0 |
0 |
0 |
0 |
S16 |
0 |
1 |
0 |
0 |
0 |
S15 |
In sostanza, sono significativi i primi 5 bit più bassi
(b4:b0); b4:b3 distinguono i tasti sulla linea comune K1 o K2, mentre b2:b0
codificano il tasto. La tabella seguente presenta il valore del
dato reso a seconda del tasto premuto (mantenendo la bizzarra numerazione dei
pulsanti nello schema precedente):
Tasto |
S16 |
S15 |
S14 |
S13 |
S12 |
S11 |
S10 |
S9 |
S8 |
S7 |
S6 |
S5 |
S4 |
S3 |
S2 |
S1 |
Matrice |
SG8
K1 |
SG8
K2 |
SG4
K2 |
SG4
K1 |
SG7
K1 |
SG7
K2 |
SG3
K2 |
SG3
K1 |
SG6
K1 |
SG6
K2 |
SG2
K2 |
SG2
K1 |
SG5
K1 |
SG5
K2 |
SG1
K2 |
SG1
K1 |
hex |
F0 |
E8 |
EC |
F4 |
F1 |
E9 |
ED |
F5 |
F2 |
EA |
EE |
F6 |
F3 |
EB |
EF |
F7 |
Il clock in lettura deve essere inferiore a 250kHz. Il foglio
dati riporta un diagramma relativo alla scansione dei tasti: Secondo
il costruttore, il sistema di acquisizione dei tasti è particolarmente protetto
da disturbi EMC, dato che il TM1637 è usato in elettrodomestici di potenza,
come piani di cottura a induzione.
Driver. Occorre
disporre di un driver specifico.
Il
costruttore fornisce un esempio di driver in C, che viene riportato
integralmente senza modifiche:
Reference Program
/ *
* Copyright: Shenzhen Tian Microelectronics
* File name: TM1637
* Current Version: 1.0
* SCM Model: AT89S52
* Development Environment: Keil uVision3
* Crystal earthquake frequency: 11.0592M
* Program features: the TM1637 all filled with all the display data register
address
0xff, and open the display, and then read the key value.
* /
# include <reg52.h>
# include <intrins.h>
// Define port
sbit clk = P1 ^ 2;
sbit dio = P1 ^ 1;
/ / / =======================================
void Delay_us (unsigned int i) // n us delay
{
for (; i> 0; i--)
_ nop_ ();
}
/ / / ======================================
void I2CStart (void) // 1637 start
{
clk = 1;
dio = 1;
Delay_us (2);
dio = 0;
}
/ / / =============================================
void I2Cask (void) // 1637 Answer
{
clk = 0;
Delay_us (5); // After the falling edge of the eighth clock delay
5us, ACK signals the beginning of judgment
while (dio);
clk = 1;
Delay_us (2);
clk = 0;
}
/ / / ========================================
void I2CStop (void) // 1637 Stop
{
clk = 0;
Delay_us (2);
dio = 0;
Delay_us (2);
clk = 1;
Delay_us (2);
dio = 1;
}
/ / / =========================================
void I2CWrByte (unsigned char oneByte) // write a byte
{
unsigned char i;
for (i = 0; i <8; i + +)
{
Clk = 0;
if (oneByte & 0x01) // low front
{dio = 1;}
else {dio = 0;}
Delay_us (3);
oneByte = oneByte >> 1;
clk = 1;
Delay_us (3);
}
}
/ / / ----------------------------------------------- -
unsigned char ScanKey (void) // read buttons \
{
unsigned char rekey, rkey, i;
I2CStart ();
I2CWrByte (0x42); // read command buttons
I2Cask ();
dio = 1; // read keys before data lines pulled
for (i = 0; i <8; i + +) // start reading from the low
{
Clk = 0;
rekey = rekey >> 1;
Delay_us(30);
clk=1;
if(dio)
{
rekey=rekey|0x80;
}
else
{
rekey=rekey|0x00;
}
Delay_us(30);
}
I2Cask();
I2CStop();
return (rekey);
}
void SmgDisplay(void) // Write display register
{
unsigned char i;
I2CStart();
I2CWrByte(0x40); //40H address is automatically incremented by 1
mode, 44H fixed address mode
I2Cask();
I2CStop();
I2CStart();
I2CWrByte(0xc0); // Set the first address
I2Cask();
for(i=0;i<6;i++) // Addresses from Canada, do not always write
address
{
I2CWrByte(0xff); // Send data
I2Cask();
}
I2CStop();
I2CStart();
I2CWrByte(0x8f); // Open display, maximum brightness
I2Cask();
I2CStop();
}
///==============================================
void init() // Initialization routine
{
// Initialization slightly
}
///==============================================
void main(void)
{
unsigned char keydate;
init(); //
Initialization
SmgDisplay(); // Write register and open display
while(1)
{
keydate=Scankey(); // Read key value, the
key value is not read out for treatment.
}
}
//===========end==================================
E' stato realizzato un driver in Assembly. Qui trovate una versione
per Enhanced Midrange.
Alcune note sull'hardware. 1. - RC
all'ingresso Su tutte le schedine cinesi con 4 cifre e TM1637 risultano
installati i pull-up da 10k e i condensatori da 100pF sulle linee di ingresso.
Questo valore non è una capacità trascurabile (anche se il massimo ammissibile
in una I2C è 400pF) e influenza i tempi di salita e
discesa dei segnali. Se ci sono problemi nell'accesso alla periferica, si
potranno ridurre a 33-47pF (o anche abolire, a seconda della situazione).
I pull-up si possono ridurre con vantaggio a 4k7 se il cavetto
di collegamento tra micro e display non minimale. 2. - Punti decimali dei
display
Sono disponibili sul mercato, a prezzi molto bassi, moduli con 4 cifre e TM1637.
Come per gran parte dei prodotti cinesi di questa classe, le documentazioni
tecniche di questi moduli sono inesistenti e anche per i display si può avere
seria difficoltà a trovare un foglio dati anche solo indicativo.
Si tratta in tutti i casi di blocchi singoli che comprendo le cifre 4 cifre e alcuni punti
addizionali (punti decimali, semicolon centrale, punto in alto sulla prima
cifra).
Il problema riguarda proprio questi punti: le fotografie possono trarre in
inganno, in quanto i display possono sembrare disporre di vari punti decimali,
ma questi in pratica possono risultare inattivi. In generale, questi blocchi
di 4 cifre possono avere 12 o 14 pin, cosa da cui dipende il numero dei punti
accessibili.
In generale, nei blocchi a 4 cifre dei moduli cinesi, i punti centrali sono
prevalenti rispetto agli altri per un uso come orologio.
Moduli con display a 12 pin, come CL5642Bx-30, hanno i punti centrali che
dipendono dal
bit 7 della seconda cifra (al posto del relativo punto decimale), mentre gli
altri punti decimali, anche se sembrano esistere, in pratica non sono presenti.
Altri display a 12 pin, come CL3641 o ZS3641, non dispongono dei punti centrali, ma hanno il
punto decimale per ogni cifra.
Display del genere LD3462BS hanno solo i punti centrali. In alcuni
moduli con display a 14 pin,
come JYB5643, si ha un accesso separato
per i punti centrali e il punto addizionale in alto, che possono essere azionati
come segmenti di una quinta cifra.
Altri moduli
hanno con figurazioni diverse.
Se è necessario uno specifico impiego dei punti, sarà necessario verificare se il modulo scelto
sia adatto all'applicazione voluta. 3. - L'alimentazione Una nota finale riguarda la tensione di
alimentazione: se TM1637 può essere alimentato da 3 a 5V (cosa non chiarita nel
foglio dati), è 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.
|