Ana içeriğe atla

MSP430 Assembly ile Örnek Kod



     MSP430 Assembly ile Örnek Kod 

Led Yakma ve Interrupt

     Merhaba dostlar. Bu yazıda farklı bir konuya giriş yapacağız. İnternette üzerine çok fazla kaynak bulunmayan assembly programlama konusunda ufak bir uygulama gerçekleştireceğiz. Bu uygulama için kullacanağım mikroişlemci ise Msp 430 olacak. 

     Msp 430, Texas Instruments tarafından geliştirilmiş, 16 bitlik RISC mimarisine sahip düşük güç tüketimi özellikli bir mikroişlemcidir. Lcd, Usb kontollerine ve seri haberleşme protokollerine sahiptir. Diğer bütün mikroişlemciler gibi çok farklı alanlarda kullanılabilmektedir. Bekleme modunda çektiği akım 1 uA dan daha azdır ve uyku modunda uzun süre kalarak akım tüketimini en aza indirir. Aktif moda geçme süresi ise 1 uS den daha azdır. Bu özellikleri düşük güç tüketimi mantığının temelini oluşturur. Pille çalışan uygulamalarda çokça tercih edilmiştir. 




     İşlemcimiz üzerinde bulunan modüller ise genel olarak şunlardır ;


  • Flash, RAM : Verilerimizi depoladığımız bellek bölgesi. 
  • ADC : Dışarıdan alınan analog verilerin sayısala dönüştürülmesini sağlayan modül.
  • Port P1, P2, P3 : Giriş çıkış kanallarımız. Her portta 8 adet bacak bulunur. Msp 430'da 2 adet port vardır.
  • USCI : Seri haberleşme protokollerinin gerçekleştirildiği modül.
  • Timer : Sayıcı olarak kullanılan modül. Timer Interrupt işleminde kullanılır.
  • CPU : Merkezi işlem birimi. 
     
      Msp 430'un bellek bölgesi farklı alanlara ayrılmıştır. Program bölümü bizim kodlarımızın bellekte saklandığı yerdir. Bu bölgede program çalışırken yazma yapılamaz sadece okuma yapılabilir. RAM bölgesi ise program çalışırken okuma ve yazma yapabildiğimiz yerlerdir. Program çalışırken yaptığımız hesaplamalar RAM bölgesine yazılır. Interrupt Vector Table, interrupt alt programlarının adres verilerinin saklandığı bölgedir. 

      Msp 430'un genel yapısını hakkında basit bilgiler verdim şuana kadar. Şimdi ise bu mikroişlemciyi assembly diliyle nasıl programlıyoruz mantığını anlamaya çalışalım yavaş yavaş. Herşeyden önce msp430'da her adres 16 bitlik sayı ile temsil edilmektedir. Bu adresler kolaylık olması için hexadecimel olarak temsil edilir. 

       RAM bölgesinin adresleri 1C00h ile 5BFFh arasındadır. Bu 16 bitlik adreslerin her biri 8 bitlik veri saklamaktadır. 8 bitlik adrese en fazla 256 sayısı yazılabilmektedir. 


     Kaydediciler (Registers ) içerisinde bilgi saklayan elemanlardır. 

     Status Registers ( SR, Durum Kaydediciler ) işlemin son durumu hakkında bilgiler verir.  

     General Purpose Registers ( R4 - R15 ) : Genel amaçlı kaydediciler istediğimiz herhangi bir veriyi saklayabilmemizi sağlar. 16 bitliktir. 

  
   Uygulama 

      Msp 430'un üzerinde biri yeşil biri kırmızı olmak üzere 2 adet led bulunmaktadır. Bu ledlerden kırmızı olanı P1.0 pinine, yeşil olanı ise P1.6 pinine bağlıdır. Bizim yapacağımız uygulamada yeşil led 1 sn aralıklarla yanıp sönecek, kırmızı led ise işlemci üzerindeki butona basıldığında yanacak tekrar basıldığında ise sönecektir. Bu buton da P1.3 pinine bağlıdır. 

      İlk önce assembly dilindeki ihtiyacımız olan komutlara bakalım ;

      PxDIR : Portların giriş veya çıkış olarak tanımlanmasını sağlar. 8 bitliktir. " P1DIR " ise port 1 pinlerinin giriş veya çıkış olarak tanımlanmasını sağlar. 

      PxOUT : Çıkış olarak tanımlanan pinlerin hangi lojik durumda olduğu verisini saklar. 8 bitliktir. " P1OUT "  port 1'in çıkış olarak tanımlanan pinlerinin HIGH ve LOW durumda olmasını belirler.  

      bis : Kaydedicide istenilen bitlerin setlenmesini sağlar. 

      bic : Kaydedicideki istenilen bitlerin clearlanmasını sağlar. ( low duruma geçirir. )

      mov : Kaynaktaki verinin hedefe aktarılmasını sağlar. 

      xor : Kaynaktaki veriyi hedefteki veri ile xor işlemine sokup hedefe kaydeder. ( Herhangi bir pini 1 ile xor işlemine sokarsak o pinin tersi alınır. )

      inc : Hedef kaydedicinin içeriğini 1 artırır.


     dec : hedef kaydedicideki veriyi 1 azaltır. 


      jnz : " jump if not zero " sıfır bayrağı kalkmadığı sürece önünde bulunan etiketin satırına atlama yapar.

     jmp : koşulsuz bir şekilde önünde bulunan etiketin satırına atlama yapar. 

     org : yazılan programın flash'da nereye kaydedileceğini belirler. 

     P1IE : Interrupt enable kaydedicisi port1'in hangi pininden kesme gelebileceğini tanımladığımız kaydedicidir. Interrupt yetkilendirme işlemidir.

     P1REN : Port 1 pinlerinde bulunan dahili pull down dirençlerini aktif etmemizi sağlar. 

     P1IFG : Interrupt flag, port1'in hangi pininden interrupt geldiğini anlamamızı sağlar. P1.1'den interrupt gelmişse P1IFG kaydedicisinin 2. biti 1 olur. ( Bizim uygulamamızda P1.3'e bağlı butondan interrupt geleceği için 4. bit 1 olacak. )

      eint : Dışarıdan gelen interruptların dikkate alınmasını sağlar. Bu kod olmadan interrupt işlemi yapılamaz. 

      reti : Interrupt'ın alt programdan geri dönmesini sağlar.


     Ne demiştik uygulamamız için yeşil led 1 sn aralıklarla yanacak, kırmızı led ise butona basıldığı zaman yanacak tekrar basıldığında sönecek. Butonumuz P1.3 pinine bağlı. Biz burada butonu dışarıdan gelen bir kesme olarak kullanacağız. Yani interrupt işlemi gerçekleştireceğiz. Interruptın ne olduğu hakkında daha önceki yazılarımda bolca bilgi verdim. Ama kısaca tekrar hatırlatmak gerekirse interrupt ; program normal akışında devam ederken kesme gelmesi ile alt programa gidip programın oradan devam etmesidir. 

      Bir de msp430'da hangi pinin çıkış olarak tanımlamak istediğimizi nasıl yapıyoruz onu göstereyim ; 

      bis.b#001h,&P1DIR ( Burada P1.0 pini çıkış yapılır. ) 

      Mantık şu ; 001h -> ilk sıfırı yok say -> 0000 0001 ( ikilik tabanda ) -> 8 bitin ilk biti 1 

      Bu şekilde P1.0'ı çıkış yapmış olduk. Diyelim ki P1.2 ve P1.4'ün çıkış olmasını istiyoruz. O zaman ikilik tabanda sayımız nasıl olmalı ? 

     " 0001 0100 " P1.2 pini ve P1.4 pini 1. Burada biraz temel bilgisayar birimlerini bilmek gerekiyor. Her bir portta 8 pin olduğu için işlemimizi bu şekilde gerçekleştirebiliyoruz. 

     ( bis.b#000010100b,&P1DIR ) = bis.b#014h,&P1DIR 

      İki komut da aynı işi yapar. Biz kolaylık olması hexadecimal tabanda yazıyoruz kodlarımızı. 

      Biraz kompleks bir konu evet farkındayım. Üniversitelerde ders olarak okutulduğunda da kolay gelmiyor kimseye emin olun. Yani ilk defa öğrenmeye çalışıyorsanız kafanızın karışması çok normal. Farklı kaynaklardan araştırdıkça ve kendinizde çalıştıkça kolaylaşacaktır. 

      Artık kodlara geçebiliriz. 


        Her satırın yanına yine açıklamasını yazdım umarım açıklayıcı olmuştur. Bu da videosu ; 


       KAYNAK : https://mehmetalikucuk.wordpress.com/
     

Yorumlar

En çok okunanlar ;

PLC Zamanlayıcı ( Timer ) Komutu Uygulamaları ve Simülasyonu

SIEMENS S7 - 200  PLC TİMER KOMUTU UYGULAMALARI ve SİMÜLASYONU      Merhaba, bugünkü yazıda PLC'de timer komutunun kullanımını öğreneceğiz ve bu komutun simülasyon üzerinde uygulamalarını gerçekleştireceğiz. Timerler PLC'de oldukça öneme sahip komutlardır. S7 - 200 PLC'de 3 çeşit zamanlayacı bulunmaktadır ;      1 ) Çekmede Gecikmeli Zaman Rölesi ( TON ) : Bu zamanlayıcı '' enable '' girişine ait komutlar doğru ise zamanlayıcı zaman süresini saymaya başlar. Bu anda zamanlayıcının zaman biti 0'dır. Zamanlayıcı'nın saydığı zaman değeri '' Present Value '' değerine eşit olduğu zaman, zamanlayıcı biti 1 olur. Enable girişi 0 olduğunda ise zaman rölesi sıfırlanır.         T32 - T96                                            >>> 1 ms        T33 - .... - T36 ve T97 - ... - T100      >>> 10 ms        T37 - .... - T63 ve T101 - .... - T255   >>> 100ms         Present Time ( PT ) değeri ola

PLC Mühürleme, Set - Reset Komutları ve Elektronik Kilitleme

SIEMENS S7 - 200 PLC  STEP 7 MICROWIN 4.0 PROGRAMI İLE MÜHÜRLEME,SET-RESET,ELEKTRONİK KİLİTLEME UYGULAMALARI ve SİMÜLASYONU      Merhaba, bugün daha önce anlattığımız konulardan daha temel ve kolay olan mühürleme, set - reset , elektronik kilitleme gibi konulara kısaca değineceğiz. Öğrenilmesi her ne kadar daha basit olsa da içerdiği önem oldukça fazladır. Bu yüzden bu konuları öğrenmeden PLC eğitimi gerçekleştirilmiş olamaz.       İlk olarak mühürleme işleminin ne olduğu ile başlayalım. Örnek verecek olursak siz start butonuna basıldığı zaman herhangi bir devre elemanının ( lamba, motor, kompresör vb. ) çalışmasını istiyorsunuz. Start butonu olarak ise normalde açık ( NO ) buton kullanmanız gerekir. Bu yüzden sizin sürekli çıkışı aktif hale getirebilmek için butona sürekli basmanız gerekir. Bu ise pek mümkün olabilecek bir şey değil. İşte bu noktada mühürleme işlemine gerek duyarız. Gelin önce mühürlemenin ladder diyagramını çizelim ve diyagram üzerinde konuyu kav

3 Fazlı ASM'lere Yıldız / Üçgen Yol Verme Kumanda Devresi ve Simülasyonu

3 FAZLI ASENKRON MOTORLARA YILDIZ / ÜÇGEN YOL VERME KUMANDA DEVRESİ SİEMENS S7 -200 LADDER DİYAGRAMI VE SİMÜLASYONU      Merhaba, bu yazıda sanayide en çok kullanılan elektrikli motor olan 3 fazlı asenkron motorlara yıldız/üçgen yol verme yöntemi ile yol verilmesini STEP 7 MicroWİN programında gerçekleştirmeyi öğreneceğiz. PLC komutlarına geçmeden önce neden yol verme yöntemlerine ihtiyaç duyuyoruz, yıldız/üçgen yol vermek ne demektir, bize ne faydası olur gibi soruları cevaplamak gerektiğini düşünüyorum. Bu yüzden ilk olarak bu soruları cevaplamaya çalışacağız.         3 fazlı asenkron motorlar kalkış anında normal çalışma durumuna göre 5 ila 7 kat arasında daha fazla akım çeker. Bu durum ise pano elemanlarının ( kondaktör, termik röle, sigorta vb. ) daha çabuk yıpranmasına sebep olur. Bu yıpranmayı önlemek için ilk kalkış anında bazı yol verme yöntemleri geliştirilmiştir. Bunlardan en çok kullanılanı ise yıldız / üçgen yol verme yöntemidir.      Yıldız/Üçgen yol verm