
ASM ile kod yazmaya devam ediyoruz. bu sefer buton ile kesme oluşturmaktan bahsedeceğim bu işlemi yapabilmek için bazı regestirilerin kurulması gerekli bunların nasıl yapılacağını anlatmaya çalışacağım.
MSP430 ASM – Buton ile Kesme oluşturma
Öncelikle bazı regestiriler ve ne işe yaradıklarını anlamaya çalışalım. ilgili regestirilerin önlerinde bulunan “x” işareti port numarası gelmelir. burda x port numarasını temsil eder örneğin mcu nun 1. portuna veri göndermek için P1OUT şeklinde yazılması gerekli.
PxDIR: port yönlendirme regestirisi. Bu regestirir sayesinde mcu nun istenen pinleri giriş veya çıkış olarak ayarlanır. Hangi Pinin ne iş yapacağu bu regestiriden ayarlanır. Bir pini giriş yamak için o pine karşılık gelen bitin değerini “0″ olarak ayarlamak gerekir Çıkış olarak ayarlamak istenitse ilgili bitin değeri “1″ olarak ayarlanmalıdır.
örneğin p1 portunun 0. ve 6. pinleri çıkı diğerleri giriş olarak ayarlamak için P1DIR regestirisine #01000001b değerini atamak yeterlidir.
PxREN: Giriş olarak ayarlanan pinlerin bull-up dirençlerini devreye sokmaya yarar.
PxIFG: Kesmenin hangi butondan kaynaklandığı bu regestiriden okunur. buton basıldığında bilgili pinin olduğu bit değeri set(1) olur. Kesmenin Hangi Butondan kaynaklandığı bu regestirinin bileri kontrol edilerek bulunabilir.
PxIE : Kesmenin hangi pin/pinlerden oluşabileceği bu regestiri sayesinde ayarlanır Pic lerdeki GIO regestirisine benzer. Hangi butona basıldığında Kesme oluşşun isteniyorsa ilgili pinin bulunduğu bit 1Set olarak ayarlanmalıdır. 0 olarak ayarlanan pinlerde kesme oluşmaz.
PxIES: Kesme nin düşenkenarmı yoksa yükselen kenar la tetikleneceğini belirler.
P1SEL : P1 Portunun herhangi bir pinini birkaç amaç için kullanabileceğininden başta bahsetmiştik. P1SEL saklayıcısı seçtiğimiz pinin hangi amaç için kullanılacağını seçmemizi sağlar.
Herhangi bir pine ait fonksiyonları belirlemek için P1SEL saklayıcısına yazılması gereken değerler
Burada PxSEL2 saklayıcısı şimdilik bizim işimize yaramayacak çünkü kullanacak çok fazla modül yok. Şimdilik g/ç veya diğer modüllere ait pinleri seçmek için P1SEL ve P1DIR saklayıcılarını yeterli.
Port Ayarlarıyla ilgili daha detaylı bilgiyi Fatih İNANÇ’ın fatihinanc.com/msp430_dersleri/1-msp430-port-giriscikis-islemleri-ve-harici-kesmeler yazısından alabilrisniz.
#include "msp430g2231.h" ; #define controlled include file NAME Mainloop ; module name PUBLIC Mainloop ; make the main label vissible ORG RESET_VECTOR;0FFFEh; DC16 init RSEG CSTACK ; pre-declaration of segment RSEG CODE ; mcu kod segmentinden çalışmaya ;başlıyacağı bildirilir. init: MOV #SFE(CSTACK), SP ;stak regestirisinin adresini belirler. MOV.W #WDTPW + WDTHOLD,&WDTCTL;WDT kesmesi oluşmasını engelle mov.b #01000001b,P1DIR ; P1 portunun 0 ve 6 bitleri ;çıkış gerisi giriş olarak ayarlandı mov.b #00001000b,P1REN ; PUL UP AKTİF mov.b #00001000b,P1IFG ;KESMENİN HANGİ BİTTE ;OLDUGU BU REGESTİRİDEN OKUNUR mov.b #00001000b,P1IE ;P1 PORTUNUN HANGİ PİNİNDEN KESME ;OLUŞACAĞINI BLİERLER mov.b #00001000b,P1IES ; KESMENİN DÜŞEN KENARMI YOKSA ;YÜKSELEN KENARMI OLDUGUNU BELİRLER. mov.b #00000001b,P1OUT ;P1.0 bitini set et EINT Mainloop jmp Mainloop ;kesme oluşanakadar kısır döngüde kalır. BTN_KESME mov.w #01000001b,r15 ; sabit(ledlerin adresleri) ;değeri R15 regestirisine yükler xor.b R15,&P1OUT ; R15 regestiriisinin içeriğini ;xor işlemine tabi tutAR ve P1 portuna yazdırır(P1 için değerlerini tersler) BIC.B #00001000b,P1IFG EINT ;GIE genel interput bitini etkinleştirir. RETI ;kesmeden dönme komutu. ;program kesme olmadan önceki adresinden çalışmaya devam eder. ;***********************kesme vektörü tanımlama bölümü************************ COMMON INTVEC;herhangibi bir kesme olştuğunda program buraya dallanır. ; oluşan kesmenin bulunduğu vektörden kodları çalıştırırhttp://www.mcu-turkey.com/wp-admin/index.php. DINT ;GIE genel kesme bayrağını pasif yapar. ;(aynı anda başka bir kesme olmasını engeller) ORG PORT1_VECTOR;0xFFE4;buton kesmesinin bulunduğu vektör. ;buton kesmesi oluştuğunda mcu bu adrese dallanır. DW BTN_KESME; END
MSP430 ASM – Buton ve WDT Kesmeleri
Daha önce yaptığımız uygulamları birleştirerek aynı anda hem WDT kesmesi Hemde Buton kesmesini kullanarak LoanchPed üzerinde ledleri belirli sürelerle ve buton tetiklemesiyle sıryala yakıp söndürme konusunda örenekler yapacağız.
Kaynak kod;
#include "msp430g2231.h" ; #kulanılan mcu yu tanımlıyoruz NAME Mainloop ; module name PUBLIC Mainloop ; make the main label vissible RSEG CSTACK ; pre-declaration of segment RSEG CODE ; place program in 'CODE' segment init: MOV #SFE(CSTACK), SP ; set up stack ; MOV.W #5A00H+0011000B,&WDTCTL ; watchdog timer 1000ms ayarla MOV.W #WDT_ADLY_1000,&WDTCTL;WDT Yİ KULLANARAK 1000MS GECİKME YARATIR BIS.B #10001B,IE1 ;IE1 REGESTİRİSİ GENEL KESME KAYNAKLARINI KONTROL EDN REGESTİRİ ; BURDAN NMIIE VE WDTIE BAYRAKLARINI KURUYORUZ WDT KESMESİ OLUŞMASI İÇİN mov.b #01000001b,P1DIR ; P1 portunun 0 ve 6 bitleri çıkış gerisi giriş olarak ayarlandı mov.b #00001000b,P1IE ;P1 PORTUNUN HANGİ PİNİNDEN KESME OLUŞACAĞINI BLİERLER mov.b #00001000b,P1IES ; KESMENİN DÜŞEN KENARMI YOKSA YÜKSELEN KENARMI OLDUGUNU BELİRLER. mov.b #00000001b,P1OUT mov.b #01000001b,P1DIR ; P1 portunun 0 ve 6 bitleri çıkış gerisi giriş olarak ayarlandı mov.b #00000000b,P1OUT ;P1.0 bitini set et EINT Mainloop jmp Mainloop ; BTN_KESME mov.b #01000000b,r15 ; sabit değeri R15 regestirisine yükler xor.b R15,&P1OUT ; R15 regestiriisinin içeriğini xor işlemine tabi tutAR ve P1 portuna yazdırır(P1 için değerlerini tersler) BIC.B #00001000b,P1IFG EINT RETI WDT_KES mov.b #00000001b,r15 ; sabit değeri R15 regestirisine yükler xor.b R15,&P1OUT ; R15 regestiriisinin içeriğini xor işlemine tabi tutAR ve P1 portuna yazdırır(P1 için değerlerini tersler) BIC.B #1H,IFG1 ;IFG1 REGESTİRİSİ OLUŞAN KESMENİNİ KAYNAĞINI GÖSTEREN EGESTİRİDİR. ;WDTIFG (0 BİTİ) WDT KESME KAYNAĞINI GÖSTERİR. KESME OLUŞTUĞUNDA BU BAYRAK 1 OLUR YENİDEN WDT KURMAK İÇİN BU BAYRAĞIN SIFIRLANMASI GERKLİDİR. EINT ; (GIE) GENEL KESME BAYRAĞINI AKTİFLEŞTİRİR RETI COMMON INTVEC DINT ;GIE KESME BAYRAĞINI TEMİZLE (0 YAPAR) ORG WDT_VECTOR;0FFFEh WDT KESME VEKTÖRÜ DW WDT_KES ; KESME OLUŞUNCA BU ETİKETE DALLAN ORG RESET_VECTOR;0FFFEh; İLK ENERCİ GELDİĞİNDE VEYA RESET EDİLDİĞİNDE BU ETİKETE DALLAN DC16 init ORG PORT1_VECTOR;0xFFE4;buton kesme vektörü DW BTN_KESME;kesme butondan oluştuğunda gidilecek kesme etiketi END
Yayım tarihi: 2011/09/13 Etiketler: asm örnekleri, msp430 asm, msp430 programlama, msp430 projeleri