MSP430′u ASM ile Programlama

| Haziran 10, 2023 Tarihinde güncellendi
MSP430′u ASM ile Programlama

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.

msp430-asm-pxiesx-pxinx-pxifgx

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.

pin-function-msp430-asm-pxiesx-pxinx-pxifgx

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.

msp430-status-register-asm

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.

msp430-asm-Stak-Pointir

Ö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:

msp430-u-asm-ile-programlama

Şifre-Pass: 320volt.com

Yayım tarihi: 2011/09/13 Etiketler: , , ,



Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir