Tanju Taşçılar, 25 Nisan 2002
doc uC002-250402
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.