GESTIONE DEL MODULO TRAMITE ST6x10
Girando per le varie fiere/mercato che si tengono tutto l'anno nelle varie citta'
italiane, mi sono imbattuto su questo modulino vizualizzatore.
E' prodotto dalla THREE FIVE Semiconductor
costa solo 10.000 lire, ma sostituisce a tutti gli effetti 4 shift register tipo CD4094
, + 4 driver tipo ULN 2003 + 4 digit a 7 segmenti + 2 led + 1 circuito stampato
di discrete dimensioni e di notevole difficolta' realizzative. Veramente un'ottimo aggeggio !!
Date le sue minuscole dimensioni, (vedere immagini a lato)
e la richiesta di soli 3 bit (Clock,Data e Chip Enable) e' l'ideale in congiunzione
ad un micro controllore. Io lo utilizzo pilotato da un ST62T10 in varie applicazioni.
Nell'immagine sottostante potete vedere un contagiri/minuto (RPM meter) .
Data la sua duttilita' ho pensato di mettere a disposizione il software di gestione
per chi dovesse imbattersi in questo sito e se lo trovasse tra le mani senza sapere che farne.
Per lo schema di collegamento tra NMS 4202 e ST6 cliccate su -----[
Schema. Poiche' i led del modulo non sono codificati, e' possibile ottenere anche diverse
lettere dell'alfabeto,predisponendo le variabili e inviando il codice idoneo. Ma questo lo lascio fare a voi.
; -----------------------------------------
; sezione variabili (084H ..0BFH)
; -----------------------------------------
FLAGS .DEF 084H ; flags di programma
; ----------- Bit 0
; ----------- Bit 1
; ----------- Bit 2
; ----------- Bit 3
; ----------- Bit 4
; ----------- Bit 5
; ----------- Bit 6
; ----------- Bit 7
DISPLAY .DEF 0B0H ;( B0h )= unit… da inviare al display
;( B1h )= decine
;( B2h )= centinaia
;( B3h )= migliaia
TX_BYTE .DEF 0B4H ; byte da inviare serialmente al modulo
MASCHERE .DEF 0B5H ; le seguenti 10 locazioni fino a ( 0BEh )
; sono occupate da variabili che
; contengono le maschere per formare
; i 10 numeri ( 0..9 ) nel modulo
; -----------------------------------------
; sezione costanti (0880H USER ROM
; -----------------------------------------
CSEL .EQU 0 ; (Out) bit 0 porta ( A )= Chip enable del Modulo
DATA .EQU 1 ; (Out) bit 1 porta ( A )= Data del Modulo
CLK_DIS .EQU 2 ; (Out) bit 2 porta ( A )= Clock del Modulo
;----------------------------------------------------------------
BEGIN:
CALL INIT_MASK ; inizializzo le variabili
; per i 7 segmenti del modulo
CALL NSM4202 ; invio i 4 byte al modulo
JP BEGIN ;
; ---------------------------------------------------
; questa routine invia il valore decimale in 4 byte
; che parte dalla label ( DISPLAY) in forma seriale
; per il modulo a 4 digit tipo ( NSM4202 )
; ---------------------------------------------------
NSM4202:
CALL START_BIT ; --------------------------------------
LDI V,4 ;
LDI A,DISPLAY ;
ADDI A,3 ; questa parte invia il bit di start
LD X,A ; quindi preleva l'indirizzo contenuto
FB1: LD A,(X) ; nella variabile display a partire
CPI A,0 ; da questo indirizzo e per i 4 byte
JRNZ FB2 ; successivi preleva il dato contenuto
CALL SEND_BYTE ; e lo invia al modulo per la
DEC X ; visualizzazione.
DEC V ; poichŠ il modulo richiede la sequenza
LD A,V ; migliaia/centinaia/decine/unit…
CPI A,1 ; parte dal quarto byte e retrocede
JRNZ FB1 ;
FB2: LDI Y,MASCHERE ;
LD A,(X) ; questa parte converte il numero
ADD A,Y ; prelevato nella corrispondente
LD Y,A ; maschera necessaria al modulo per
LD A,(Y) ; ricreare nei sette segmenti la cifra
CALL SEND_BYTE ;
DEC X ;
DEC V ;
LD A,V ;
CPI A,0 ;
JRNZ FB2 ;
JP STOP_BIT ; --------------------------------------
SEND_BYTE:
LDI W,8 ; --------------------------------------
FC1: SLA A ;
LD TX_BYTE,A ; il byte e' inviato serialmente
LD A,DRA ; all'uscita tramite 8 shift
RES DATA,A ; successivi a partire dal bit 7
JRNC FC2 ;
SET DATA,A ;
FC2: CALL SEND_BIT ;
DEC W ;
LD A,W ;
CPI A,0 ;
JRZ FC3 ;
LD A,TX_BYTE ;
JP FC1 ; --------------------------------------
FC3: RET
STOP_BIT:
LD A,DRA ; --------------------------------------
RES DATA,A ;
JRR 6,FLAGS,FD1 ; se il bit 6 dei flag Š a 0 salta
SET DATA,A ; altrimenti accendi il led
FD1: CALL SEND_BIT ;
RES DATA,A ;
JRR 7,FLAGS,FD2 ; se il bit 7 dei flag Š a 0 salta
SET DATA,A ; altrimenti accendi il led
FD2: CALL SEND_BIT ;
SET DATA,A ; metti a 1 il bit di stop
CALL SEND_BIT ; --------------------------------------
RET
START_BIT:
LD A,DRA ; --------------------------------------
RES CSEL,A ; questa parte abilita
SET DATA,A ; il chip select del modulo
SEND_BIT:
LD DRA,A ; --------------------------------------
LDI WDOG,0FEH ;
SET CLK_DIS,A ;
LD DRA,A ; questa routine invia l'impulso
NOP ; di clock per l'accettazione del
LDI WDOG,0FEH ; dato da parte del modulo
RES CLK_DIS,A ;
LD DRA,A ; --------------------------------------
RET
; -----------------------------------------
; inizializzazione variabili maschere
; -----------------------------------------
INIT_MASK:
LDI WDOG,0FEH ; --------------------------------------
LDI X,MASCHERE ;
LDI A,11111100B ; ( 0 ) questa parte provvede ad inserire
LD (X),A ; nella ram delle maschere
INC X ; riconosciute dal modulo per creare
LDI A,01100000B ; ( 1 ) nei sette segmenti le cifre
LD (X),A ; corrispondenti.
INC X ;
LDI A,11011010B ; ( 2 ) come avviene la conversione: la
LD (X),A ; label maschere punta all'indirizzo
INC X ; (B5H) esadecimale pertanto
LDI A,11110010B ; ( 3 )
LD (X),A ; > B5h contiene la maschera dello 0
INC X ; > B6h " " " 1
LDI A,01100110B ; ( 4 ) > B7h " " " 2
LD (X),A ; > B8h " " " 3
INC X ; > B9h " " " 4
LDI WDOG,0FEH ; > BAh " " " 5
LDI A,10110110B ; ( 5 ) > BBh " " " 6
LD (X),A ; > BCh " " " 7
INC X ; > BDh " " " 8
LDI A,10111110B ; ( 6 ) > BEh " " " 9
LD (X),A ;
INC X ; supponendo di voler convertire il
LDI A,11100000B ; ( 7 ) numero 7 si preleva l'indirizzo
LD (X),A ; di partenza della tabella (B5H)
INC X ; si aggiunge la cifra da convertire
LDI A,11111110B ; ( 8 ) (B5H + 7 =BCH)
LD (X),A ; quindi l'indirizzo bch contiene
INC X ; la maschera del numero 7 da inviare
LDI A,11110110B ; ( 9 ) al display
LD (X),A ; --------------------------------------
RET
|