YAZARLIK BAŞVURUSUBize Katılmak istermisiniz?

MSP430 ile GPIO uygulamaları

Merhabalar..

Bu konuda önceki konunun devamı olarak MSP430 ile GPIO uygulamalarına değineceğiz. Örnek olarak basit led uygulamaları(karaşimşek, binary sayıcı vb), buton ile led kontrolü, buton interruptları gibi örneklere yer vereceğiz.

İlk örneğe geçmeden önce bazı ayrıntılara değinelim. Öncelikle MSP430 pinleri en falza 10 mA çıkış verebilmektedir (Datasheet’ te 6 mA standarttır). Bu yüzden herhangi bir led bağlantısı için mutlaka direnç kullanmanız gerekir. Aksi taktirde o portu yada portun o pinini kullanım dışı bırakabilirsiniz.

İkinci olarak pin yapılarına biraz değinelim. Konumuz GPIO’ lar olduğu için bu konu son derece önemli. Örneğin benim örnekleri vereceğim MSP430 modelinde 6 numaralı porta kadar kullanılabilirken, MSP430G2 serisinde port numaraları en fazla 2 ye kadar gitmektedir. Yani siz aşağıdaki örnekleri denerken kendi MSP çeşidiniz port yapısına göre denemenizi yapmalısınız.

Son olarak önceki konuda MSP430 ile RAM bölgesinde örnekler vermiştik (BURADAN ulaşabilirsiniz). Önceki uygulamalar IAR üzerinden yapılmıştı. Lakin bu konuda örnekleri CCS üzerinden gerçekleştireceğim. Bunun sebebine gelince IAR ile GPIO işlemlerini yapmaya kalktığınız zaman kodunuz tam doğru olsa bile çözümü olmayan bazı sorunlar yaşayabiliyorsunuz. Bu yüzden benim tavsiyem uygulamanız sadece RAM bölgesi üzerinde değilse IAR’ ı değil CCS’ i kullanmanız. Ancak seçim size kalmış. Ben iki ideyi de kullanabilin diye aralarındaki farklı kullanımları yeri geldikçe belirteceğim.


 

Şimdi ilk uygulamamıza geçebiliriz. Her zaman olduğu gibi ilk olarak MSP430 üzerindeki dahili bir ledi belli aralıklarla yakıp söndürme işlemi yapalım. Aşağıdaki resimlerde benim kullandığım MSP430F5529 ve piyasada sıklıkla kullanılan model olan MSP430G2253(1)’ in pin yapıları görünmekte

Resmi büyültmek için resme tıkla
Resmi büyültmek için resme tıkla

MSP430F5529 üzerinde resimdede görüldüğü üzere iki dahili led bulunmakta. Biz bu uygulamada P1 portunun 0 nolu pinine yani P1.0′ a bağlı ledi belli aralıklarla yakıp söndürelim. MSP430G2 serisinde de sanırım bu led aynı pine bağlı. Bu sebeple de yazılımda değişiklik yapmadan kullanabilirsiniz.

Led yakıp söndürmek istiyoruz. Led’ in bağlı olduğu pinden gerilim almak bir çıkış işlemidir. Biz denetleyiciden çıkış almak istiyorsak o pini ilk olarak o pini çıkış olarak yönlendirmemiz gerekir. Bunun için şu şekilde bir işlem yeterlidir.

Burda “bis” komutu user guide’ dan bakabileceğiniz gibi basit olarak bit set leme işlemi gerçekleştirir. PADIR ise port yönlendirme registeridir. Bu register üzerinden portun o pinine karşılık gelen pin 0 ise giriş 1 ise çıkış olarak yönlendirilir.

Bu kodlarda ise outer etiketinin olduğu yerde PA portunun değerini 0000 0001 değeri ile xor işlemine soktuk. Böylece birince pine bağlı olan led yanıyorsa söndü, sönmüşse yandı.

Bu kısımda ise ledin yanıp sönme arasındaki gecikmeyi oluşturduk. Yani led yandıktan sonra denetleyici belli bir süre beklesin sonra ledi söndürsün. Yada bu işlem tam tersi şekilde gerçekleşsin. Bunu sağlamak için bir registere FFFF değeri atayıp birer birer azalttık. Bu değeri seçtik çünkü denetleyicimizdeki registerlerimiz 16 bit ve 16 bitlik en büyük sayının değeri FFFF‘ dir. Bu sayede bir register üzerinden verilebilecek en büyük gecikmeyi vermiş olduk.

En alttaki jmp komutu ile de sonsuz döngüyü oluşturduk ve yazılımın başına geri döndük.

MSP430 ile Assembly’ de led blink uygulaması bu şekilde. Yazılımın tamamına buradan ulaşabilirsiniz. Şimdi gelelim butondan giriş alarak led yakıp söndürme uygulamasına. Bu uygulamada MSP430 üzerindeki led’ lerden biri belli aralıklarla yanıp sönerken butona bastığımızda diğer led’ i yanıyorsa söndürecek, sönmüşse yakacağız. Böylece interrupt’ un ana programa etkisini tam olarak gözlemlemiş olacağız.


 

Yeri gelmişken interrupt’ tan bahsedelim. Interrupt’ lar adından da anlaşılacağı gibi ana programın işleyişini kesen yapılardır. Bu sayede siz ana programda bir iş gerçekleşirken bir interrupt gelmesi durmunda denetleyicinize o an ki işini bırakıp interrupt gerçekleşince yapılması gereken işlemi yapmasını sağlayabilirsiniz. Peki bunu nasıl ayarlıyacağız? Elbet registerler üzerinden ayar yaparak. Şimdi bu registerleri tanıyalım.

Registerlere geçmeden interrupt’ ı kullanmak istediğimiz pin için bazı ayarlar yapmamız gerekeli. Bu ayarlar o pinin giriş olarak kullanılabilmesi için gereklidir.

 

P2IE register’ i P2 portu için Interrupt Enable registeri’ dir. 8 bitliktir. Her bit bir pini temsil eder. Registerde bitin karşılığındaki değer 1 ise o pin için interrupt aktif edilmiş demektir.

“eint”, general interrupt enable komutudur. Bu komut ile bir üstte yaptığımız Interrupt Enable işleminin geçerli olmasını sağlıyoruz. Eğer bu komutu kullanmazsak interrupt çalışmayacaktır.

Daha sonra interrupt’ in işaretin hangi kenarında tetikleneceğine karar vermeye geldi.

Yükselen Kenar
Düşen Kenar

 

 

 

 

 

Biz MSP430′ da bulunan dahili butonu kullanmaya çalıştığımız için interrupt’ u düşen kenar olarak ayarlamalıyız. Çünkü buton normalde Vcc’ ye bağlı ve biz butona bastığımızda girişimiz toprak gerilimi seviyisine düşüyor. P2 portu için bu ayarı yapmak istiyorsak P2IES registerini setlemeliyiz. Eğer bu register’ de pinin karşılığı olan biti 1 setlersek düşen kenar olarak setlemiş oluruz.

Şimdi sıra geldi interrupt geldiğince setlenecek bayrağa. İnterrupt geldiğinde eğer ayarlar doğru şekilde yapılmışsa P1 portu için P1IFG registerinde ilgili pin setlenir. Daha sonra MSP430 yazılımda interrupt geldiğinde yapılacak işlemlerin olduğu kısma geçip işlemlerini yapmaya başlıyacaktır. Burda dikkat edilmesi gereken işiniz bittiğinde bu registeri temizlemelisiniz. Aksi taktirde ana yazılım asla interrupt’ tan çıkamaz.

Şimdi gelelim CCS’i IAR’ dan ayıran bir diğer kısma. Interrupt vektörünü ayarlarken IAR’ da registeri ve etiket adresi girmeniz yeterlidir. Lakin CCS’ de interrupt vektör adresini temsil eden bazı string ifadeler vardır ve onları kullanmalısınız. Port 2 için bu ayar şu şekildedir.

Eğer IAR ı kullanıyorsanız bu ayar şu şekilde olmalıdır:

Eğer MSP430G2231 kullanıyorsanız, IAR’ da Interrupt ayarını bu şekilde yapmalısınız:

Şimdide interrupt geldiğinde yapılmasını istediğimiz işlemleri ayarlayalım.

Artık uygulamamız hazır MSP’ ye yükleyip denemelerimizi yapabiliriz. Buradan yazılım tamamına ulaşabiliriz.


 

Son olarak led counter uygulaması ile konuyu sonlandıralım. led counter’ ımızı butona bastıkça artacak veya azalacak şekilde ayarlayalım. Yani her butona basmamızda sayacın değeri bir artacak ve ledler değişecek. Diğer butana bastığımızda ise sayacın değeri azalacak. Bu uygulama için dışardan led bağlantısı yapacağız. Led leri pinlere bağlarken direnç kullanmayı unutmayın. Aksi taktirde üzücü sonuçlar alabilirsiniz. Bunu dışında bu uygulama için kullanacağımız 4 ledi herhangi bir pine bağlarsanız arttırma işleminde zorluk çekersiniz. Ledleri mutlaka herhangi portun 0. pininden başlayarak 1, 2 ve 3. pinlerine bağlamalıyız. Yani bağlantınız eğer MSP430G2231 kullnıyorsanız resimdeki gibi olmalıdır.

mspLedMSPF5529 için bağlantı şemasını Fritzing kütüphanesinde bulunmadığı için ekleyemedim. Lakin sadece pinleri P6 portunda 0′ dan 3 e kadar bağlamanız benim yazdığım uygulama için yeterli olacaktır. Butonlar MSPG2231 kullacaklar için farklı pinlere bağlanmıştır.

Öncelikle giriş çıkış konfigurasyon ayarlarımızı yaparak uygulamaya başlayabiliriz.

MSP430F5529′ da onboard butonlar P1.1 ve P2.1 pinlerine bağlı ancak üsttede belirttiğimiz gibi MPSG2231 de bu pinler yerine P1.3 ve P2.4 pinlerini kullanmalıyız. Eğer MSPG2231 kullanıyorsanız bu ayarlar şu şekilde olmaldır.

Burdan sonraki kısımlarda MSPG2231 kullanmak isteyen arkadaşlar değişikliği üstteki kısımlarda yaptığım gibi yapabilirler. Üzerinde ayrı ayrı durmayacağım.

Şimdi de ana döngüyü oluşturalım.

Burada P6 portuna sayaç olarak kullandığımız r6 registerindeki değeri yazdırdık. Böylece sayaç her arttığında led lerin durumu değişmiş oldu. Şimdide butona bastığımızda arttırma ve azaltma işlemini yapalım.

Yorum satırlarında da belirttiğimiz gibi P2 portuna bağlı butona bastığımızda sayacın değerini bir arttırdır, P1 portuna bağlı butona bastığımızda ise sayacın değerini bir azalttık. Ekstra olarak sayaç değerinin 16 nın dışına çıkmaması (4 led var 2^4 = 16 adım yapar) için bir kontrol işlemi yaptık. Böylece sayaç değeri 16 yı geçmişse sayacı sıfırladık 0 ın altında düşmüşse 16 yaptık. Eğer MSPG2231 kullanıyorsanız bayrak temizleme işlemlerinde pini üstte belirttiğimiz şekilde P1.3 ve P2.4′ e göre yapmalısınız.

Son olarak Interrupt adreslerini belirlemeye geldi sıra. Eğer CSS IDE’ sini kullanıyorsanız ayarları bu şekilde yapmasınız.

IAR IDE’ sini kullanıyorsanız ayarları bu şekilde yapmalısınız.

Yazılımın CCS ile MSP430F5529 için yazılmış olanına buradan ulaşabilirsiniz.

Bu konumuz da bu kadar. Konuların fazla ilgi çekmemesi sebebi ile devam bu şekilde devam etme konusunda kararsızım. Lakin devam edersem bir sonraki konu ADC ve Seri Haberleşme işlemleri olacaktır. 

Herşeyi açık açık anlatmaya çalıştım, işinize yaraması dileklerimle..

İyi çalışmalar..

 

Add a Comment

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