elektronist kitaplık

Tanju Taşçılar, 25 Nisan 2002
doc uC002-250402

SPI ve 74HC595...

Bir mikroişlemcili sistemde seri iletişim en önemli unsurlardan biridir. Seri iletişim içinde de SPI en basit fakat en önemli elemandır. Mikroişlemcili sistemlerde genellikle port çoğullamada kullanılır. Bunun için de en uygun entegrelerden biri 47HC595'dir. Hem piyasada bol bulunur, hem ucuzdur, hem de çıkışlarından led sürebilecek kadar akım verebilir.

Bu iletişim sistemi senkron tiptedir. Yani ayrı bir saat işareti kullanır. Bu özellik onu kesilebilir bir işlem yapar. Tam bir SPI sisteminde, Data Girişi, Data Çıkışı, Saat ve Kilit kontrolları bulunur. Konumuz olan sistemde data girişi bulunmamaktadır.

Böyle bir sistemin yazılımı da çok kısa ve kolaydır. Aşağıdaki program modülü 47HC595 ve benzeri entegreler için kullanılabilir.

;*****************************************************
; SPI
;*****************************************************
SPI_Out
	MOVWF   S_Reg       ;Put into work register
	MOVLW   .8
	MOVWF   S_Counter   ;Set bit counter
	BCF     S_Ltc
		
SPI_Out_Loop
	BTFSC   S_Reg,7
	BSF     S_Dta
	BTFSS   S_Reg,7
	BCF     S_Dta
	RLF     S_Reg,F
	BSF     S_Clk
	BCF     S_Clk
	DECFSZ  S_Counter,F
	GOTO    SPI_Out_Loop
	
	BSF     S_Ltc
	
	RETURN		

Burada S_Reg; üzerinde seri işlemlerin yapılacağı yazmaç, S_Counter işlenecek bitlerin sayısını belirleyen sayıcı, S_Dta; data çıkış port biti, S_Clk; clock - saat port biti, S_Ltc; lock-kilit port bitidir.

Bu alt programı çıkışa vereceğimiz bilgiyi w yazmacına yükleyerek çağırırız. Alt programa gelindiğinde öncelikle w yazmacındaki değer S_Reg kayan yazmacına aktarılır. Ardından bit sayısını belirleyen sayıcıya .8 yüklenir. İlk olarak S_Ltc - kilit port biti sıfır yapılır. 74HC595 için bu bitin sıfırdan bire geçtiği köşe seri yazmaçtaki bilgilerin çıkışlara kaydedilmesi için kullanılır. Daha sonra bit sayısı kadar işlenecek olan çevrime geçilir.

Önce yüksek değerli bit işlenir ve bu şekilde 74HC595'in 0 çıkışı bizim yazmacımızdaki 0 bitine karşılık gelir. Bunun için S_Reg yazmacının 7. biti S_Data port bitine yerleştirilir. Bu işlem çevrimdeki ilk dört satırda gerçekleştirilir. Daha sonra bir sonraki çevrimde kullanılmak üzere S_Reg yazmacı sağa doğru, yani bir sonraki bit 7. bit olacak şekilde kaydırılır ve bu işlem S_Counter sayıcısı sıfırlanıncaya kadar devam eder. Sayıcı sıfırlandığında, S_Ltc kilit biti lojik 1 yapılarak seri olarak gönderilen bilginin 74HC595'de paralel hale gelmesi sağlanır.

74HC595 entegresi sıralanabilir bir endegredir. Bu şekilde birden fazla entegrenin kullanıldığı durumlarda S_Ltc ile ilgili satırlar alt programın çağrılmasından önce ve sonra kullanılmalıdır.

Aşağıda verilen program çok basit bir işlemci olan 12C508/509 kullanılarak SPI yöntemini anlatmak için yazılmıştır. 12C508 iç osilatörü kullanıldığında 6 bitlik GPIO portu olduğu gibi kullanıma kalır. Bu uygulamada iki adet 74HC595 üç adet bağlantı ile sisteme eklenmiştir. Program çok besit bir şekilde bir yazmacı her seferinde bir arttırarak bunun kendisini ve evriğini SPI ile 74HC595 entegrelerine yollamaktadır. Bu programı kullanarak MPLab ile bir proje oluşturup program akışını izleyebilirsiniz.

  Title "Mikrosis Elektronik Tutorial - SPI"
  Subtitle "Revision 1.0 - May 2002"
;**********************************************************
; By Tanju TAŞÇILAR
; (c)Mikrosis Elektronik
;**********************************************************
  Processor 12C509
  Include "P12C509.INC"
  Errorlevel 1,-207

  __CONFIG _IntRC_OSC&_WDT_ON&_CP_OFF&_MCLRE_OFF ; Set config bits

; I/O pin naming

  #Define D_Ltc     GPIO,0  ;Latch for SPI
  #Define D_Clk     GPIO,1  ;Clock for SPI
  #Define D_Dta     GPIO,2  ;Data Out for SPI

;RAM Area *************************************************
;Bank 0
  CBlock        0C
    S_Reg       ;Serial work register
    S_Counter   ;Counter
    A_Reg       ;Test register
  EndC

  #Define Out_Bit  S_Reg,MSB

; DDR values **********************************************
  GPIO_DDR       EQU B'00101000'

; Port reset values ***************************************
  GPIO_RST       EQU B'00010001'    ;GPIO reset value

; Control words *******************************************
  Option_RST     EQU B'01000000'	;OPTION reset value

MSB     EQU     .7

;**********************************************************
; Main
;**********************************************************
        MOVWF   OSCCAL      ;Optional
        CALL    Init_All
        GOTO    Main_Loop

;**********************************************************
; Send Serial
;**********************************************************
Send_Serial
        MOVWF   S_Reg
        MOVLW   .8
        MOVWF   S_Counter
S_Serial
        BTFSS   Out_Bit
        BCF     D_Dta
        BTFSC   Out_Bit
        BSF     D_Dta
        RLF     S_Reg,F
        BSF     D_Clk
        BCF     D_Clk
        DECFSZ  S_Counter,F
        GOTO    S_Serial
        RETURN
;**********************************************************
; Init All
;**********************************************************
Init_All
        MOVLW   GPIO_RST
        MOVWF   GPIO
        MOVLW   GPIO_DDR
        TRIS    GPIO
        MOVLW   Option_RST
        OPTION
        CLRF    A_Reg
        RETURN

        ORG     040        ;To hide visible code after protection
;**********************************************************
; Main Loop
;**********************************************************
Main_Loop
        INCF    A_Reg,F

        BCF     D_Ltc

        MOVF    A_Reg,W
        CALL    Send_Serial
        COMF    A_Reg,W
        CALL    Send_Serial

        BSF     D_Ltc

        GOTO    Main_Loop

        END

spi.asm kaynak kodu.

Copyright © Mikrosis Elektronik 2002 - info@elektronist.com