Tutorials - Elettronica

 
 

TM1638


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.

  1. 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.
  2. 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.

  1. STB basso
  2. 0x40  ; comando per scrittura a indirizzo auto incrementante
  3. STB alto
  4. STB basso
  5. 0xC0  ; indirizzo della prima cifra a sinistra
  6. 0x00  ; tutto spento
  7. ripetere il dato per altre 15 volte
  8. 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:

  1. STB basso
  2. 0x44  ; comando per scrittura a indirizzo singolo
  3. STB alto
  4. STB basso
  5. 0xC0  ; indirizzo della prima cifra a sinistra
  6. 0x06  ; 00000110 che corrisponde ai segmenti b e c accesi
  7. STB alto
  8. STB basso
  9. 0xCE  ; indirizzo dell'ultima cifra a destra
  10. 0x7F  ; 01111111 che corrisponde a tutti segmenti accesi
  11. 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:

  1. STB basso
  2. 0x40  ; comando per scrittura con indirizzo auto incrementante
  3. STB alto
  4. STB basso
  5. 0xC0  ; indirizzo della prima cifra a sinistra
  6. 0x06  ; 00000110 cifra 1 segmenti b,c accesi
  7. 0x01  ; LED rosso
  8. 0xDB  ; 11011011 cifra 2 segmenti a,b,d,g,dp accesi
  9. 0x02  ; LED verde
  10. 0xCF  ; 01001111 cifra 3 segmenti a,b,c,d,e,g accesi
  11. 0x01  ; LED rosso
  12. 0xB6  ; 10110110 cifra 4 segmenti b,c,e,f,dp accesi
  13. 0x02  ; LED verde
  14. 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:

  1. STB basso
  2. 0x40  ; comando per scrittura con indirizzo auto incrementante
  3. STB alto
  4. STB basso
  5. 0xC4  ; indirizzo terzo LED
  6. 0x02  ; LED verde acceso
  7. 0x80  ; dp del display successivo acceso
  8. 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

  1. STB basso
  2. 0x42  ; lettura pulsanti
  3. linea DIO lato Master come ingresso
  4. wait 1us
  5. legge un byte e salva
  6. legge un byte e salva
  7. legge un byte e salva
  8. legge un byte e salva
  9. STB alto
  10. 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.

 

Copyright © afg. Tutti i diritti riservati.
Aggiornato il 18/09/17.