Il driver per gli shift register '164
Questo è un esempio di un possibile driver per comandare uno shift
register del genere '164 o, in generale, un dispositivo ad ingresso seriale
clock + dati.
Viene inviato al dispositivo un byte contenuto in WREG, partendo dal bit
più significativo (bit 7).
;***************************************************************
;** HC164Out18.asm subroutines module for PIC18F
**
;***************************************************************
NOLIST
;**
**
;** Title : Universal Driver for SIPO '164
**
;** Enanched instruction set
**
;** Date : 8-01-2009
**
;** Version : V.01
**
;** Author : afg
**
;**
**
;***************************************************************
;**
**
;** Shift register driver for HC164.
**
;** Send 8 bit to shift register, msb (bit 7)
first. **
;** Data to send come in W.
**
;** End w/ HC164 data and clock pin = 0.
**
;**
**
;** Optionally drive the Clear line, enabled by definition:
**
;** #define HC164CLEAR
**
;**
**
;***************************************************************
;***************************************************************
;** AVAILABLE FUNCTIONS
**
;**
**
;** HC164Init Subroutine - initialize I/O
**
;** HC164out Subroutine - move 8 bit from WREG to
**
;**
shift register
**
;**
**
;***************************************************************
;***************************************************************
;** RESOURCES
**
;** Need the following definition on main program:
**
;** 2 RAM bytes
**
;** HC164_data data buffer
**
;** HC164_cntr shift counter
**
;**
**
;** 2 GPIO from any port (RA4 is open drain !)
**
;** Attention: all line must be set as digital output
**
;** HC164datapin ; data output pin
**
;** HC164clkpin ; clock output pin
**
;** HC164clrpin ; clear out pin
**
;**
**
;** The driver don't call other subroutines
**
;** WREG is modified
**
;**
**
;** External Resurces : none
**
;** Supported by : MPASM 7 or higher
**
;**
**
;***************************************************************
;***************************************************************
; Suggested equates
; --------------------
; RAM equates
;
; CBLOCK xxxx
; HC164_data ; data buffer
; HC164_cntr ; shift counter
; ENDC
;
; --------------------
; Optional definition for use Clear line
;
; #define HC164CLEAR
;
; --------------------
; I/O Equates
;
;HC164datapin equ LATC,7 ; data output pin
;HC164clkpin equ LATC,6 ; clock output pin
;HC164dataTris equ TRISC,7 ; data direction
;HC164clkTris equ TRISC,6 ; clock direction
; #ifdef HC164CLEAR **
;HC164clrpin equ TRISC,0 ; clear direction
;HC164clrpin equ LATC,0 ; clear output pin
; #endif
;
;***************************************************************
;***************************************************************
;---------------------------------------------------------------
HC164Init ; initialize I/O pin - must be digital
bcf
HC164datapin ;pre clear latch
bcf
HC164clkpin
bsf
HC164dataTris ;set direction as output
bsf HC164clckTris
#ifdef HC164CLEAR
;optional Clear line
bsf
HC164clrpin ;clear
line pre disabled
bsf
HC164clrTris
#endif
return
;---------------------------------------------------------------
HC164Out
; move 8 bit from WREG to shift register
movwf HC164_data
;save data
movlw 0x08
;set for 8 bit shift
movwf HC164_cntr
bcf
HC164datapin ;preset HC164 data = 0
bcf
HC164clkpin ;and HC164 clock = 0
HC164l
nop
btfsc HC164_data,7 ;check bit 7 equ to 0?
bsf
HC164datapin ;no - HC164data = 1
nop
;stabilization wait
nop
bsf HC164clkpin
;shift reg clock high
bcf
HC164clkpin ;shift reg clock low
bcf
HC164datapin ;HC164data pin =0
rlncf HC164_data, f
;rotate for next bit
decfsz HC164_cntr, f
;count end ?
bra
HC164l ;n - another loop
return
;***************************************************************
; Examples of macros for drive Clear pin
;---------------------------------------------------------------
; HC164 Macros for Clear pin
; #ifdef HC164CLEAR
;HC164Clear MACRO
; bcf HC164clrpin
; ENDM
;HC164Enable MACRO
; bsf HC164clrpin
; ENDM
; #endif
;***************************************************************
LIST |
I dettagli
Il driver offre le seguenti funzioni, sotto forma di subroutines:
;***************************************************************
;** AVAILABLE FUNCTIONS **
;** **
;** HC164Init Subroutine - initialize I/O
**
;** HC164Out Subroutine - move 8 bit from WREG to
**
;** shift register **
;** **
;*************************************************************** |
per cui, nel sorgente, la chiamata
call
HC164Init
; initialize I/O |
provvederà ad inizializzare correttamente i pin usati per la comunicazione
con lo shift register.
I pin utilizzati dovranno essere degli I/O digitali. Sarà compito del
programmatore liberare il o i PORT usati da altre funzioni, come
quella di ingresso analogico.
La subroutine HC164Init provvede
solo alla gestione della direzione nel registro TRIS. |
La chiamata
movf Data,
W
call
HC164Out
; move 8 bit from WREG to
; shift register |
trasferisce il contenuto di WREG allo shift register. La routine
impegna il sistema fino al completamento del trasferimento.
Il drivere richiede le seguenti inizializzazioni per le risorse:
;***************************************************************
; Suggested equates
; --------------------
; RAM equates
;
; CBLOCK xxxx
HC164_data
; data buffer
HC164_cntr
; shift counter
; ENDC
;
; --------------------
; Optional definition for use Clear line
;
#define
HC164CLEAR
;
; --------------------
; I/O Equates
;
HC164datapin equ
LATC,7
; data output pin
HC164clkpin equ
LATC,6
; clock output pin
HC164dataTris equ
TRISC,7 ; data direction
HC164clkTris equ
TRISC,6 ; clock direction
#ifdef
HC164CLEAR
HC164clrpin equ
TRISC,0 ; clear direction
HC164clrpin equ
LATC,0
; clear output pin
#endif
;
;*************************************************************** |
che dovranno essere aggiunte al sorgente.
Sono utilizzati due bytes di RAM per la copia del dato contenuto in WREG e
per il contatore di passi.
Se la subroutine viene interrotta, è necessario che queste locazioni non
vengano alterate.
I pin di comando sono inizializzati singolarmente per poter essere disposti su
qualunque port (ricordando che RA4 è solitamente un open drain).
Il parametro HC164CLEAR, se definito, abilita l' uso di un pin per comandare
il Clear dello shift register. Se non necessario, la definizione va esclusa.
I comandi in uscita sono dati sui LAT per evitare ogni problema di R-M-W.
L' inizailizzazione dei port. e, pertanto molto semplice:
HC164Init
; initialize I/O pin - must be digital
bcf HC164datapin
; pre clear latch
bcf HC164clkpin
bsf HC164dataTris
; set direction as output
bsf HC164clckTris
#ifdef HC164CLEAR
; optional Clear line
bsf HC164clrpin
;clear line pre disabled
bsf HC164clrTris
#endif
return |
Come detto, il parametro HC164CLEAR
introduce il terzo pin.
La gestione dello shift vero e proprio si basa su una rotazione a sinistra
del byte dati HC164_data,7, senza passare
attraverso il Carry.
Per questa ragione il test viene effettuato sul bit 7 di HC164_data,7.
;;---------------------------------------------------------------
HC164Out ; move 8 bit from WREG to shift register
movwf HC164_data
;save data
movlw 0x08
;set for 8 bit shift
movwf HC164_cntr
bcf HC164datapin
;preset HC164 data = 0
bcf HC164clkpin
;and HC164 clock = 0
HC164l
nop
btfsc HC164_data,7 ;check bit 7 equ to 0?
bsf HC164datapin
;no - HC164data = 1
nop
;stabilization wait
nop
bsf HC164clkpin
;shift reg clock high
bcf
HC164clkpin ;shift reg clock low
bcf HC164datapin
;HC164data pin =0
rlncf HC164_data, f
;rotate for next bit
decfsz HC164_cntr, f
;count end ?
bra HC164l
;n - another loop
return
|
Ad ogni rotazione, il valore del bit 7 viene copiato sul pin di uscita e
viene generato un impulso di clock.
Il contatore viene decrementato e, se arrivato a 0, indica la fine dell'
operazione.
Alcuni nop sono
stati introdotti per stabilizzare il segnale nel caso di lunghi collegamenti
tra il PIC e lo shift register.
Se non necessari, possono essere eliminati; se le connessioni sono brevi, le
temporizzazioni richieste da HC164 dovrebbero essere adeguate anche se il
driver viene eseguito da processori con clock elevato (40 MHz).
Per ultimo, il driver propone due semplici MACRO per il comando del bit di
Clear (valido a livello basso).:
;***************************************************************
; Examples of macros for drive Clear pin
;---------------------------------------------------------------
; HC164 Macros for Clear pin
#ifdef HC164CLEAR
HC164Clear MACRO
bcf
HC164clrpin
ENDM
HC164Enable MACRO
bsf
HC164clrpin
ENDM
#endif
;*************************************************************** |
Anche qui il parametro HC164CLEAR
condiziona il risultato dell' assemblaggio.
Si ricorda che le macro vanno definite nel sorgente prima di
essere utilizzate. |
La direttiva NOLIST iniziale evita la
stampa del testo del driver nel listato, allo scopo di alleggerirne la
lettura.
La possibilità di stampa è ripresa dalla direttiva LIST
a fine driver.
Fino a qui abbiamo semplicemente replicato un algoritmo classico
utilizzabile per tutti i PIC.
Ma vediamo che con il set di istruzioni degli Enhanced si può fare di
meglio.
|