Progetti - PIC

 

Demo board per SIPO '164 

 


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.


 

Copyright © afg. Tutti i diritti riservati.
Aggiornato il 26/04/11.