MSP430 LaunchPad ile Assembly Programalaya Giriş - Led İşlemleri




 Bu ilk programda derleyicinin işlemci içerisindeki Flash Memory'e kodumuzu yazması için ihtiyaç duyduğu komutlardan ve MSP 430 Programlama Kiti üzerindeki ledleri yakıp södürecek Assembly programını verip her bir komutun ne için kullanıldığını anlatacağım.






Programlama aracı olara IAR Embedded Workbench kullanacağız. Elinizin altında olması gereken dökümanlar
MSP430x2xx Family User's Guide (Bundan sonra pdf-1 olarak bahsedilecek)
MSP430 G2231 datasheet (pdf-2) olacaktır.

Syntax  Programlam yapılırken uyulan düzendir, aşağıdaki gibidir

etiket       komut       komut_ayrıntıları

Etiket: Program içerisinde ihtiyacımız olduğunda "jmp" (jump) tarzındaki atlama kodları ile program içerisinde istediğimiz bölüme erişmek amaçlı kullanacağımız mihenk taşları olarak düşünebilir.

Komut: Bunlar assembly komutlarıdır. Bunların bizim işlemcimizde kullanılabilecek olanlarını komut_ayrıntıları ile birlikte pdf-1'den (3.4 Instruction Set) öğrenebilirsiniz. 

Program kodlarının açıklanması: 

include "msp430g2231.h"
  Bu kod işlemcinin içerisindeki vektörlerin, adreslerin vb. tanımlamaları içerir. İlk başta buna kafa yormaya gerek yoktur. Ancak bilinmesi gereken msp430g2231.h bölümünün her işlemci için değiştirilmesi gerektiğidir. Burada 2231 dikkatli baktığınızda sizinde kit üzerinde takılı gelen (rev 1.4 boardların üzerindeki) işlemcidir. Bu bölümü işlemcinize göre ayarlamanız gereklidir. 

ORG 0F800h

Hafıza Organizasyonu

  Yukarıdaki tabloda mavi ile işaretlenen alan kullandığımız işlemcinin flash belleğinin hangi adresler arasında oldğunu göstermektedir, kodumuzu ise code memory olarak belirtilen kod belleğine yazarız.  Bu bellek F800h adresiyle başlayıp FFFF adresi ile bitmektedir. Bu durumda kodumuzu F800h (0xF800) adresinden itibaren flash belleğe yazabiliriz.

  Derleyici (IAR) ORG komutunu ile belirtilen bellek adresinden itibaren (bizim durumumuzda 0F800h) yazdığımız bütün kodları derleyerek kod belleğine yazar.

  Aynı zamanda 0xFFFF den 0xFFC0 adresine kadar olan kısım daha sonra bahsedeceğimiz interrupt vector table (kesme vektör tablosu) verisini saklar. Bu bilgileri daha ayrıntılı olarak pdf-2 içerisinde bulabilirsiniz.

RESET mov.w #0280h,SP 
  Burada reset kit üzerindeki RESET tuşuna basıldığında programın atlama yapacağı etikettir.
mov kaynak,hedef
  Bu komut kaynaktaki veriyi hedefdeki bir bellek adresine yazar. Kaynak bellek adresi veya sayı biçiminde olabilir ve bu kodda bir sayıdır. Kaynağın bir sayı olduğunu belirtmek için başına # işareti koyulur. Bu işaretin koyulmadığı her sayı, bir bellek adresi olarak algılanacak ve o bellekteki veri okunup hedef'e yazılacaktır. Bu durumda # işareti konmasaydı 0280h adresindeki veri SP içerisine yazılacaktı ki böyle bir adrese sahip bir ram belleği olmadığından işlem başarısız olacaktır. Bu durumda ise SP'ye 0280h sayısı yazılacaktır. Neden bu adresin kullanıldığı SP'de anlatılacaktır. 

SP (Stack Pointer)
  Bu işlemcimiz içerisinde çok önemli bir yeri olan ve her programda bir bellek değeri atanması gereken bir mekanizmadır. Bu mekanizma programımız her kesmeye gittiğinde programın o anki konumunu ve durumunu SP ye atadığımız adresin 1 eksiğine kaydeder. Hafıza Organizasyonu tablosunda ram kısmına bakıldığında 027Fh adresinin ram'in en sonu olduğu görülür. 280h SP çağırıldığında kendine belirtilen adresin bir eksiğine yazdığından ilk olarak 027Fh adresini kullacaktır. Bu işlem SP her çağırıldığında içine yazdığı son adresten 1 eksiğine sırası ile yazma işlemi olarak devam eder.  Bu sebeple SP ye RAM belleğinin adreslenmiş son bölgesinden 1 yüksek olan değer atanır ki 1 bellek adresi boşa gitmesin.

mov.w #WDTPW+WDTHOLD,&WDTCTL  

WatchdogTimer (WDT) (PDF_2 sf:350)
  WatchdogTimer işlemcimizin içerisinde bulunan zamanlı bir güvenlik mekanizmasıdır. WatchdogTimer (WDT) nin amacı bir program hatası oluştuğundan kontrollü bir sistem resetlemesi yapmaktır. Hangi süre ile resetleneğine kendimiz karar verebiliriz ancak burada tamamen kapatmayı tercih ediyoruz. Burada WDTPW WatchdogTimer'a erişim için kullanılan şifredir, bu şifre msp430g2231.h dosyası içerisinde bulunur tıpkı WDTHOLD'un değerinin ve WDTCTL adresinin değerinin buluduğu gibi. Burada WDTHOLD, WDTCTL adresi içerisine yazıldığında WatchdogTimer'ı kapatan bir değerdir.

&WDTCTL
  bunun başında gördüğünüz & işareti, msp430g2231.h içerisinde Relative Adresleme (Daha sonranın konusu) ile WDTCTL adı verilmiş sayının bir bellek adresi olarak işlem göreceğini derleyiciye belirtmek içindir. Farz-ı misal bu durumda WDTCTL=0262h değerine sahipse 0262h'nin bir adres gibi iş göreceğini belirtir.

bis.b   #01000001b,&P1DIR
  Şimdi programlama kitini elinize alın ve işlemci bacaklarının sağında ve solunda yazan yazılara bakın. Mesela ilk olarak P1.0 (LED1) yazısını göreceksiniz, aynı şekilde sağ tarafta (LED2) P1.6 yazısını göreceksiniz. Bunları aklınızda tutun. Ledleri yakıp söndürmek için ilk yapmamız gereken işlemci bacaklarının yönlerini ayarlamaktır. Bu işlem için 8 bitlik P1DIR adresindeki bitleri ayarlamamız gerekmektedir. Bu işlem içinse bis.b komutunu kullanırız.

bis.b
  Bu komut "bit set" komutunun kısaltmasıdır, .b bölümü ise yapılacak işlemin byte (8 bit) düzeyinde yapılacağını belirtir. Hedefdeki bitlerini kaynaktaki 1 olan bitlere göre setleme (1 olarak ayarlamak) işlemini yapar. ".b" belirtecini koymamız gereklidir. Çünkü P1DIR belleği 1 bytelık bir bellektir ve bis komut .b koşulu belirtilmedikçe word yani 2 byte (16 bit) olarak işlem yapar sonuç olarak hatalı işlemlere yol açar.

 #01000001b
  Az önce 1.0 ve 1.6 portlarından ledlerimizin bulunduğunu görmüştük. Bildiğiniz gibi
8 bit x*2^7+ x*2^6+ x*2^5+ x*2^4+ x*2^3+ x*2^2+ x*2^1+ x*2^0 
şeklinde belirtilebilir.

  Biz 0. ve 6. portların çıkış yönünde programlanmasını istiyoruz bu durumda 2^6 ve 2^0 sayınlanın 1 ile diğerlerini 0 ile çarpıyoruz. Bu durumda 01000001 sayısını elde ederiz. Sonuna koyulan b bunun byte düzeninde bir sayı olduğunu belirtmektedir ve koyulması gereklidir, aksi halde sayı word (2 byte) sistemde değerlendirilecektir. Bunun sebebi Port1 ve Port2'nin 8 adet bağlantısı vardır ve her biri 1 bytelık bellek adresleri ile temsil edilir eğer .b koyulmazsa komut belleğe 8 adet 0 yazacaktır. 01000001b=041h İstersek belleğe direk olarak 041h de yazabilirdik sonuç birebir aynı olacaktır.

&P1DIR (Port 1 DIRECTION )
  Bu tıpkı &WDTCTL gibidir. İşlemcinin P(ort)1 bacaklarının yönünün (dir.ection) kayıt edildiği bellek adresini belirtir.

bic.b #00000001b,&P1OUT, bis.b #01000000b,&P1OUT

bic.b
  bu komut hedefteki bitlerin kaynakta setlenmiş bitlere göre temizleme işlemi yapar. Bu durumda 2^0 yanı P1.0'ın bit'i temizlenecek (sıfır olarak setlenecek) ve geri kalanına dokunulmayacaktır.

bis.b
  hedefteki bileri yukarıdaki mantığın aynısını kullanarak setler. 

xor.b    #01000001b,&P1OUT

xor.b
  bu komut basit bir xor işlemine dayanır. xor işlemi matematiği şöyle çalışır
    1*1=0            1*0=1           0*1=1                0*0=0
P1OUT
  P1OUT; PORT1'in çıkış vektörüdür. P1OUT'u 0100 0000b olarak kodun başında ayarlamıştık. Bellek bu durumda iken
kırmızı led sönük yeşil led ise yanık durumdadır.
0100 0000 xor 0100 0001 işlemi sonucu 0000 0001 olacaktır. 
Yani kırmızı led yanacak yeşil led ise sönecektir. 

Wait   mov.w   #0xFFFE,R15:
  Bu işlemler bittiğinde ise bir bekleme rutinine girerek ledlerin durumlarını bir kaç saniye korumalarını isteriz. 0xFFFE sayısını R15 belleğine yazarak bir referans oluştururuz . Wait bekleme rutininin etiketidir

L1 dec.w R15
  R15 içerisindeki sayıyı 1 azaltır .w word (16 bit) olarak işlem yapıldığını gösterir. ".w" nun ayrıca yazılmasına gerek yoktur mps430 işlemleri belirtilmediği sürece word uzunluğunda yapar ancak yazılması kodun okunabilirliğini arttırır.


jnz L1
  Son işlem yapılan register (şu anda R15) içindeki sayı sıfır olduğu zaman SR (Status Register) içinde bulunan Zero Flagı (Sıfır Bayrağı) setlenir. jnz (jum if not zero/sıfır değilse atla) komutu bu bayrağı kontrol ederek koşulub gerçekleşip gerçekleşmediğini anlar.

  Eğer R15 içindeki sayı sıfıra ulaşmamış ise zero bayrağı setlenmemiş demektir. Bu durum pozitif durumdur, jnz çalışır ve L1 etiketine atlar. Bu durum "dec.w R15" komutu R15 belleğindeki sayıyı sıfır yapana kadar devam eder.

  R15 içindeki sayı sıfıra ulaştığında ise koşul negatif döner ve atlama işlemi yapılmadan sıradaki satırdaki komut işletilir

jmp On
  Herhangi bir koşul aranmaksızın direk olarak On etiketine atlanır. Bekleme rutininden çıkılmıştır.


ORG 0FFFEh
DW RESET Bu bölüm kit üzerindeki RESET tuşuna basıldığında programın dallanacağı bölümü belirtilir. 0FFFEh pdf de belirtilen RESET'in kesme (interrupt) vektörüdür. Sayfa 40
END bitiş; yazılması gereklidir.


Beğendiyseniz lütfen soldaki butona tıklayarak +1 leyin

Yorumlar

Bu blogdaki popüler yayınlar

KTU Mikroişlemciler Dersi 2013 Vize 4. Soru Çözümü

A4 Tech Oscar X7 the system cannot locate the object specified Hatasının Çözümü

KTU Mikroişlemciler Dersi 2014 Vize Çözümleri