MSP430′u ASM ile Programlama

| Ekim 23, 2019 Tarihinde güncellendi
MSP430′u ASM ile Programlama

msp430-u-asm-ile-programlama

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

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



Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir