Deney 2 Seri İletişim Uygulamaları Deneyin Amacı Seri iletişimin anlaşılması Seri iletişimin ayarlarının ve yazmaçlarının anlaşılması Program beklemeli seri iletişim kavramının anlaşılması Kesme tabanlı seri iletişim kavramının anlaşılması Deney Öncesi Yapılması Gerekenler 1. Seri iletişim kavramının araştırılması. 2. MC9S12 ailesi mikrodenetleyicilerde seri iletişim ve yazmaçların araştırılması. MC9S12C ailesi veri dökümanı (Ninova üzerinde bulunmaktadır) 13ncü kısmının (shf 385-413) okunması. Gereken Malzemeler 1. CSM-12C32 Deney Kiti Referans Belgeler [R1] MC9S12C Family Datasheet Son Değişiklik : 21.11.2007, Hazırlayan: MK Sayfa 1
Deney İçeriği Bir mikrodenetleyinin çevre birimleri ile haberleşebilmesi için paralel ve seri iletişim arayüzleri bulunmaktadır. Paralel iletişimde gönderilecek kelime boyu büyüdükçe kullanılması gereken kablo miktarı ve maliyet artmaktadır. Bu sebeple yüksek bant genişliği ile haberleşme gerektirmeyen çevre birimleri ile iletişim için seri iletişim arayüzü kullanılır. Seri iletişim arayüzünün kullanımında Kontrol yazmacı: İletişim hızı, alıcı ve vericinin etkinleştirilmesi, alıcı ve verici kesme hizmetlerinin etkinleştirilmesi gibi ayarlar için kullanılır. Durum yazmacı: Alıcının okunmaya veya vericinin yeni veriye hazır olduğu gibi seri iletişim arayüzünün durumu hakkında bilgi veren yazmaçlardır. Veri yazmacı: Alıcıdan verinin okunduğu ve vericiye verinin yazıldığı yazmaçtır. Bu yazmaçlardaki herbir bitin ne için kullanıldığı MC9S12C ailesi veri dokümanında bulunmaktadır. Seri iletişim arayüzü bir program içerisinde iki farklı şekilde kullanılabilir: 1. Program beklemeli: Program akışı veri aktarmak için vericinin hazır olmasını veya veri almak için bekler. Bu bekleme sırasında ilgili yazmaçlar sürekli kontrol edilir (polling). Veri gönderildikten veya alındıktan sonra program akışına devam eder. Saat hızı 8 Mhz olan bir mikrodenetleyiciyi bu şekilde bekletmek verimli değildir. Fakat bazı durumlarda programın akışını durdurup beklemesi gerekebilir. 2. Kesme tabalı: Kontrol yazmacında gerekli kesmeler etkinleştirildikten sonra program akışı durdurulmaz. Veri gönderimi için verici hazır olduğunda veya veri alımı için alıcı hazır olduğunda kesme sinyali üretilir. Program içerisindeki kesme hizmet programı gerekli işlemleri yerine getirir. Böylece mikrodenetleyici veri göndermek veya almak için beklemek ve durum yazmaçlarını kontrol etmek zorunda kalmaz. Son Değişiklik : 21.11.2007, Hazırlayan: MK Sayfa 2
Deneyde Yapılacaklar Bölüm 1 Seri iletişim arayüzü kullanarak karakter dizinin gönderilmesi Bu kısımda mikrodenetleyici üzerindeki seri iletişim arayüzü kullanarak, bilgisayar ile iletişim sağlanacaktır. Amaç seri iletişim arayüzünde sadece verici kısmı kullanarak bilgisayara karakter dizisinin gönderilmesidir. Bilgisayar tarafında hyperterminal programı kullanılacaktır. Bunun için öncelikle bilgisayarınızdaki hyperterminal programını başlatınız. Yeni bağlantıya bir isim verdikten sonra bağlantı noktası olarak COM1 portunu seçiniz. Daha sonra bağlantı ayarları olarak aşağıdaki şekilde görüldüğü gibi seçiniz. Şekil 1 - Hyperterminal bağlantı ayarları Daha sonra Code Warrior üzerinden bir assembly projesi başlatarak main.asm dosyasını aşağıdaki değiştirip, init_sci ve sendtext altprogramlarini tamamlayınız. init_sci altprogramında bağlantı ayarlarını 9600 bps (baud) olacak şekilde sci hız yazmaçlarına yazınız. Alıcıyı etkinleştirmek ve bağlantının 8 veri biti, paritesiz ve 1 dur biti olması için ise sci kontrol yazmacını kullanınız. Yazmaç bitlerinin ne manaya geldiği ekte anlatılmıştır. Son Değişiklik : 21.11.2007, Hazırlayan: MK Sayfa 3
sendtext altprogramı X yazmacında gönderilen adresten başlayarak karakterleri hafızadan okuyup, sci durum yazmacından vericinin gönderime hazır olduğunu kontrol ederek NULL (sıfır) karakteri gelene kadar gönderecektir. ;***************************************************************** ;* This stationery serves as the framework for a * ;* user application (single file, absolute assembly application) * ;* For a more comprehensive program that * ;* demonstrates the more advanced functionality of this * ;* processor, please see the demonstration applications * ;* located in the examples subdirectory of the * ;* Freescale CodeWarrior for the HC12 Program directory * ;***************************************************************** ; export symbols XDEF Entry ABSENTRY Entry this as application entry point ; export 'Entry' symbol ; for absolute assembly: mark ; include derivative specific macros INCLUDE 'mc9s12c32.inc' ROMStart EQU $4000 ; absolute address to place my code/constant data ; variable/data section ifdef _HCS12_SERIALMON ORG $3FFF - (RAMEnd - RAMStart) else ORG RAMStart endif ; Insert here your data definition. Message DC.B "Sacma ey goz eskden gonlumdeki odlara su, kim bu denlu tutusan odlara kilmaz care su",0 ; code section ORG ROMStart Entry: ; remap the RAM & EEPROM here. See EB386.pdf ifdef _HCS12_SERIALMON ; set registers at $0000 CLR $11 ; INITRG= $0 ; set ram to end at $3FFF LDAB #$39 STAB $10 ; INITRM= $39 ; set eeprom to end at $0FFF LDAA #$9 STAA $12 ; INITEE= $9 LDS #$3FFF+1 ; See EB386.pdf, initialize the Son Değişiklik : 21.11.2007, Hazırlayan: MK Sayfa 4
stack pointer else LDS #RAMEnd+1 ; initialize the stack pointer endif CLI ; enable interrupts mainloop: l1: JSR initsci LDX #Message JSR sendtext BRA l1 initsci: sendtext: ; SCI hız yazmacının ayarlarını 9600 baud ; SCI kontrol yazmacının ayarlarını yapın ; SCI vericisini aktif hale getirin RTS ; SCI durum yazmacı degerlerinden vericinin yeni veri ; icin hazır olup olmadığını kontrol ederek ; NULL (0) karakterine kadar olan karakterleri tek tek ; gönderin RTS ;************************************************************** ;* Interrupt Vectors * ;************************************************************** ORG $FFFE DC.W Entry ; Reset Vector Programı yazıp derledikten sonra CSM12C32 kartına yükleyip Real-time debugger programını sonlandırın. Hyperterminal programını yukarıda anlatıldığı şekilde ayarladıktan sonra kartın reset düğmesine basarak yüklediğiniz programı çalıştırın. Program çalıştığında hyperterminal ekranında gönderilen karakter dizisi görünecektir. Son Değişiklik : 21.11.2007, Hazırlayan: MK Sayfa 5
Bölüm 2 Bilgisayarın seri iletişim arayüzünden gönderdiği karakterlerin programbeklemeli olarak okunup belleğe yazılması Bu kısımda seri iletişim arayüzünün vericisi ile birlikte alıcısı da kullanılacaktır. Hyperterminal programına girilen karakter dizisi ENTER tuşuna basılıncaya veya hafıza ayırılan yer doluncaya kadar okunacak ve hafızaya yazılacaktır. ;**************************************************************** ;* This stationery serves as the framework for a * ;* user application (single file, absolute assembly application) * ;* For a more comprehensive program that * ;* demonstrates the more advanced functionality of this * ;* processor, please see the demonstration applications * ;* located in the examples subdirectory of the * ;* Freescale CodeWarrior for the HC12 Program directory * ;***************************************************************** ; export symbols XDEF Entry ABSENTRY Entry ; export 'Entry' symbol ; include derivative specific macros INCLUDE 'mc9s12c32.inc' ROMStart EQU $4000 ; absolute address to place my code/constant data ; variable/data section ifdef _HCS12_SERIALMON ORG $3FFF - (RAMEnd - RAMStart) else ORG RAMStart endif ; Insert here your data definition. Buffer DS.B 16 Message DC.B "Karakter dizisi giriniz: ",0 ; code section ORG ROMStart Entry: ; remap the RAM & EEPROM here. See EB386.pdf ifdef _HCS12_SERIALMON ; set registers at $0000 CLR $11 ; INITRG= $0 ; set ram to end at $3FFF LDAB #$39 STAB $10 ; INITRM= $39 Son Değişiklik : 21.11.2007, Hazırlayan: MK Sayfa 6
; set eeprom to end at $0FFF LDAA #$9 STAA $12 ; INITEE= $9 endif mainloop: l1: LDS LDS CLI #$3FFF+1 #RAMEnd+1 JSR initsci LDX #Message JSR sendtext LDX #Buffer JSR waittext LDX #Buffer JSR sendtext BRA l1 ; enable interrupts initsci: ; SCI hız yazmacının ayarlarını 9600 baud ; SCI kontrol yazmacının ayarlarını yapın ; SCI vericisini ve alıcısını aktif hale getirin RTS sendtext: ; SCI durum yazmacı degerlerinden vericinin yeni veri ; icin hazır olup olmadığını kontrol ederek ; NULL (0) karakterine kadar olan karakterleri tek tek ; gönderin RTS waittext: ; Durum yazmacından gelen verinin hazır olup ; olmadığını kontrol edip, hazırsa okuyun ; Alınan karakter sayısı bellek_boyu-1 den küçük ; ise belleke yaz ; Okunan karakter ENTER tuşu ise veya alınan karakter ; sayısı bellek_boyu-1 olmuş ise son karakter olarak ; NULL yazılıp programa geri dön ;************************************************************** ;* Interrupt Vectors * ;************************************************************** ORG $FFFE DC.W Entry ; Reset Vector Son Değişiklik : 21.11.2007, Hazırlayan: MK Sayfa 7
Raporda İstenenler Herbir bölümde kullanılan yazılımın dökümünü veriniz. Son Değişiklik : 21.11.2007, Hazırlayan: MK Sayfa 8
Son Değişiklik : 21.11.2007, Hazırlayan: MK Sayfa 9
Son Değişiklik : 21.11.2007, Hazırlayan: MK Sayfa 10
Son Değişiklik : 21.11.2007, Hazırlayan: MK Sayfa 11
Son Değişiklik : 21.11.2007, Hazırlayan: MK Sayfa 12
Son Değişiklik : 21.11.2007, Hazırlayan: MK Sayfa 13
Son Değişiklik : 21.11.2007, Hazırlayan: MK Sayfa 14