Tutorials - Elettronica

 
 

TM1637


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 chiaramente 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.

Purtroppo, il dispositivo non ha molto a che fare con I2C; infatti, ci sono altri problemi:  

  • in primo luogo, i bit meno significativi vengono inviati per primi, mentre in I2C è proprio l'opposto.  
  • in secondo luogo, la risposta ACK della periferica segue una diversa temporizzazione.

Tutto questo significa che non è possibile utilizzare TM1637 come un qualsiasi elemento I2C (e tanto più 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. Non dice nulla dei bit non indicati, il che fa supporre che possano assumere un valore qualsiasi.
In ogni caso, 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 si può supporre quanto segue:

  • 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   permette 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 fisso: i dati sono inviati al solo indirizzo selezionato
  • 0x44 con indirizzo di destinazione auto incrementante: ogni dato sarà scritto progressivamente in indirizzi successivi a partire da quello selezionato.

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.

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:

  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.

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

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).
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 hardware in Assembly. Qui trovate una versione per Enhanced Midrange.


Alcune note 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 e influenza i tempi di salita e discesa dei segnali. Se ci sono problemi nell'accesso alla periferica, si potranno sostituire con 33-47pF (o anche abolire).
Anche i pull-up si possono ridurre con vantaggio a 4k7, sopratutto 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.

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, è 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.

 

Copyright © afg. Tutti i diritti riservati.
Aggiornato il 31/08/17.