Merhaba Arkadaşlar. Bu yazımda sizlere asm kodlarıyla MSP430 LaunhPad nasıl programlanıcağından bahsedeceğim örnek MSP430 ASM uygulamaları ve MSP430 ASM komutları paylaşılacak.
İlk uygulamamız p1 portunun 3. pinine bağlı buton yardımıyla LaunhPad üzernideki kırmızı ve yeşil ledleri sırayla yakıp söndüren (flip-flop) örnek asm uygulaması yapacağız.
MSP430 ASM – Buton ile led kontrolü
Kodları açıklamaya başlamadan önce yeni proje dosyası nasıl oluşturulucağına dair kısa bilgi vereceğim.
Kaynak kod;
#include "msp430g2231.h" ; #kullanıcamız entegreyi tanımlıyoruz NAME Mainloop ; module name PUBLIC Mainloop ; make the main label vissible ; outside this module ORG 0FFFEh DC16 init ; set reset vector to 'init' label RSEG CSTACK ; pre-declaration of segment RSEG CODE ; place program in 'CODE' segment init: MOV #SFE(CSTACK), SP ; set up stack mov.w #WDTPW+WDTHOLD,&WDTCTL ; watchdog timer iptal mov.b #01000001b,P1DIR ; P1 portunun 0 ve 6 bitleri çıkış gerisi giriş olarak ayarlandı mov.b #00000001b,P1OUT ;P1.0 bitini set et Mainloop bit.b #00001000b,&P1IN ; P1.3 P1 portunun 3. bitini değerini kontrol eder jc Mainloop ;status reg. C biti değeri 1 ise etikete dallanırburda bu biti pinin surumunu kontrol etmek için kullanılmıştır. ;***************Bit terseleme prosödürü************************* ;P1 portuna bağlı ledleri her butona bastığınızda sırayla yakıp söndüren kod bit_tersle bit.b #00001000b,&P1IN ; P1.3 pinin değerini kontrol eder jnc bit_tersle ; jc komutuna benzer ama C biti 0 ise etikete dallanır (buton ark'ını önlemek için oluşturuldu) mov.w #01000001b,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) jmp Mainloop END
İkinci uygulama WDT kesmesini kullanarak msp430 p1.0 ve p1.6 pinlerine bağlı bulunan kırmızı ve yeşil ledlerin 1000 ms aralıklarla yakıp söndürme uygulaması. Amacımız WDT kesmesi oluşturabilmek için gerekli regestirilerin kurulması ve kontrolünün asm komutlarıyla nasıl yapıldığını öğrenmek.
MSP430 ASM – WDT Kesmesi
Kaynak kod;
#include "msp430g2231.h" ; #kulanılan mcu yu tanımlıyoruz NAME Mainloop ; module name PUBLIC Mainloop ; ana program tanımlaması RSEG CSTACK ; pre-declaration of segment RSEG CODE ; 'CODE' segment başlangıcı 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 #00000001b,P1OUT ;P1.0 bitini set et EINT Mainloop jmp Mainloop ; WDT_KES mov.w #01000001b,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 END
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
MSP430 mcu ları için kullanılan asm kodlarını açıklamaya çalışacağım. sitede C dili ile ilgili güzel örnek kodlar var fakat asm ile ilgili bir kaynak bulmak zor. Kaynak teşkil etmesi açısından kodları açıklamaya çalıştım ilerleyen bölümlerde kısa örnekler ile pekiştirmeye çalışacağım.
MSP430 Asm Komutları
Regestiriler Ve Görevleri
SR (Status Regestirisi) : Durum Regestirisi artimatik, mantık ve karşılaştıma oparatörleri bu regestirinin bazı bitlerini etkiler. Bu bitlerin durumu kontrol edilerek programımızın ilgili yerlere dallanmasını sağlayabliriz. Bu regestirilerin nasıl kullanılacağı komutlarla birlikte açıklanacaktır.
SP (Stak Pointır) : 64K stal pointer mevcuttur. Bu regestiri kesme veya Call komutu ile kullanılır. Kesme/call komutu bulunduğu satırın adresini (PC Pogram sayıcıdaki adresi)
Stak pointerin en üst byte ne yerleştirir. Altprogramın işi bitince ret/reti komutlarından biriyle karşılaştığında kesme/call komutunu ilk karşılaşıldığı PC adresinin olduğu yerin bir altından kot çalışmaya devam eder.
Örnek
Satır – komut
15 Mov #ffh;r15
16 Dec r15
17 Call alt_program_1;alt programa dallan işin bitice bir alt satırdan devam et
18 mov r15,&P1OUT
19 ………………………..
End
45 alt_program_1
46 clr r15
47 ret
Yukarıdaki koddan da anlaşılacağı gibi program 17 satırda alt_program_1 etiketindeki programı çağırır. Call komutu alt_program_1 programını çağırdığında satır(PC) daki 17 değerini SP adresinin en üst saklayıcısına kaydeder. Altp program ret komutuyla karşılaştığında SP regestirindeki En üst kaydedicisindeki adresi satır(PC) kaydedicisine bir artırarak geri yükler sonuç olarak ret komutundansonra program 18. satırdan devam eder.
SP regestirisinde adresler enalttan üste doğru sıralanır. Yani ilk gelen adres bilgis en alta enson gelen adres bilgisi en üste doğru sıralanır. Geri dönüşlerde ise bu ilem tersten işlem görmeye başlar yani en üstteki adres verisi PC kaydedicisine ilk olarak gönderilir. SP regestirisine ilk yüklene adres son olarak PC yüklenir.
PC (Program Cointer) : Program çalımaya başladığında 00 adresinden başlar ve her bir komut satır indeksi 1 artırılarak takip edilir PC programın hangi satırda oldğunu kontrol etmeye yarayan regestirisidir. Call komutu once bu regestirinin değerini SP regestirisine yerleştirir ve Ret komutuyla karşılaşıldığında SP regestirisini içeriği PC regestirisine geri yüklenir ve program kaldığı yerden devam etmesi sağlanır. Ayrıca atlam komutları ve interruplarda program adresini bu regestiriye yazarak istenilen satırlara kodların dallanması sağlanır.
Diğer örnek ve açıklamalı komut listesi:
Şifre-Pass: 320volt.com
Yayım tarihi: 2011/09/13 Etiketler: asm örnekleri, msp430 asm, msp430 programlama, msp430 projeleri