Projenin amacı Proteus programı kullanarak bir alarmlı saat simulasyonu yapmaktır. Labcenter Electronic firmasının bir urunu olan Proteus gorsel olarak elektronik devrelerin simulasyonunu yapabilen yetenekli bir devre cizimi, simulasyonu, animasyonu ve PCB(Baskı Devre Kartı) cizimi programıdır [1]. Proteus yuklemesiyle birlikte iki adet program gelir. Bunlardan birisi simulasyon icin devrelerin hazırlandığı ISIS programı, diğeri baskı devre icin devre elemanlarının kart uzerine yerleştirildiği ARES programıdır. Sadece simulasyon yapılacağı icin ISIS programı kullanılmıştır.
ISIS programı icerisinde bircok aktif ve pasif devre elemanları barındırır. Bu programın kutuphaneleri icinde bulunan devre elemanları kolay bir şekilde secilip devreye eklenebilir ve kablo bağlantıları yapılabilir.
Alarmlı saat uygulaması yapılırken saat devresinin kontrolunu sağlayacak bir mikrodenetleyici kullanılması gerekmektedir. PROTEUS programı icerisinde cok fazla mikrodenetleyici mevcuttur. Bunlara Motorola firmasının 68 ailesi, Microchip firmasının PIC ailesi, 8051 mikrodenetleyiciler, AVR, Z80 mikroişlemciler ve Texas Instruments firmasının MSP430 ailesi ornek olarak verilebilir. Projeyi gercekleştirmek icin secilen mikrodenetleyicinin cok yuksek işlem kapasitesi olmasına gerek yoktur. Mikrodenetleyicinin yapması gereken işlemler arasında; saat verisini ekranda gostermek, saati her saniyede bir guncellemek, kullanıcıdan girişler alıp saat ve alarmı ayarlamak ve alarm icin kullanıcıya uyarı vermek vardır. Bu gereksinimler goz onune alındığında basit bir mikrodenetleyici ihtiyacmızı karşılayabilmektedir. Mikrodenetleyici seciminde en uygun secenek Microchip firmasından bir PIC kullanmak gibi gozukse de Texas Instruments firmasının MSP430 ailesinden bir mikrodenetleyici kullanılmıştır. PIC icin cok fazla Turkce kaynak bulunmasına rağmen daha once cok az da olsa araştırdığım ve aşina olduğum MSP430 secilmiştir. MSP430 icin Texas Instruments firması ucretsiz olarak C derleyicisi ve IDE desteği sağlamaktadır. MSP430 desteği PROTEUS ile yeni gelen bir ozelliktir. Bunun icin simulasyonda Proteus 7.6 VSM surumu kullanılmıştır.
KULLANILAN MALZEMELERa. 4 Haneli 7 Kısımlı Ortak Anotlu LED Goruntu Birimi
Alarm saat hakkındaki bilgileri gostermek icin bu goruntu birimi kullanılmıştır. Saat ve dakika değerlerini gostermek icin 4 hane yeterli olacaktır.
7 kısımlı goruntu birimi ortak anotlu ve ortak katotlu olarak ikiye ayrılır. 7 kısımlı ismini almasının sebebi sayıları gosterebilmek icin 7 tane bacağa sahiptir. Goruntu birimindeki nokta işaretini gostermek icin bir bacak daha mevcuttur. Aşağıdaki şekilde ortak anotlu bir goruntu biriminin icyapısı verilmiştir.


Goruntu biriminde ışık vermeyi sağlayan her bir kısım birer LED’den oluşmuştur. Ortak anotlu olması anot ucundan pozitif gerilim verildiğinde hangi kısımların ucu toprağa(GND) bağlanmışsa o kısımların yanacağı anlamına gelir. Orneğin goruntu biriminde 7 rakamını elde etmek icin ortak anotun artı(VCC,+); a, b ve c uclarının toprağa(GND) bağlanması gerekir. Tek haneli goruntu birimi icin toplam dokuz uc kullanılmaktadır.
Dort haneli goruntuyu sağlamak icin Proteus programında bulunan 7SEG-MPX4-CA-BLUE kodlu goruntu birimi kullanılmıştır. Bu goruntu biriminin toplam 12 tane ucu vardır. Bunlardan 8 tanesi rakamları gosterecek kısımlar icin, 4 tanesi de haneleri secmek icindir. Goruntu biriminin Proteus programındaki gorunumu ve icyapısı aşağıdaki şekilde verilmiştir.


Bağlantı şeması Lumex firmasının urettiği bir goruntu birimine aittir [3]. Bu şemaya gore hane uclarından bir tanesi secilip(pozitif gerilim uygulama) kısım uclarından da istenilen değeri gostermek icin gerekli ucları toprağa bağlamak, istenilen hanede istenilen rakamın gosterilmesini sağlayacaktır. Orneğin birinci hanede 7 rakamını gostermek icin 1 nolu ucu pozitif gerilime; a,b ve c uclarını da toprağa bağlamak yeterli olacaktır.
Şekildeki goruntu birimi kullanılarak aynı anda iki farklı hanede iki farklı değer gosterilemez. Fakat saat değerlerini gostermek icin farklı hanelerde farklı değerlerin gosterilmesi gerekir. Bu işlemin nasıl yapıldığı 3. bolumde anlatılmaktadır.
b. MSP430F2131 Mikrodenetleyici
MSP430 Texas Instruments firmasının urettiği duşuk guc tuketen yetenekli bir mikrodenetleyicidir. Simulasyonda kullanılan MSP430F2131’in bazı ozellikleri aşağıda verilmiştir[4].
· Duşuk besleme gerilimi ile calışma(1.8V-3.6V)
· Cok duşuk guc tuketimi (aygıtlar kapalı iken RAM değerlerini koruma:0.1µA)
· Temel Saat Modulu Ayarları:
§ 16MHz’e kadar cıkabilen ve ayarlanabilen icsel saat frekansı
§ 32kHz kristal
§ Dışarıdan alınabilen saat işareti
§ Temel Saat Modulu Ayarları:
· Voltaj duşukluğu algılayıcı
· 16 bitlik Timer_A(zamanlayıcı devre)
· 16 adet genel amaclı G/C bacağı
MSP430F2131’in 20 bacaklı plastik kılıf yapısı aşağıdaki şekilde verilmiştir [4].

c. Diğer Malzemeler
Saat modları arasında geciş yapmak icin ve değerleri değiştirmek icin 3 adet dokunsal duğme(tactile button), Alarm sesini duyabilmek icin 1 adet 2V ile calışan buzzer.
CIKIŞLARIN EKRANDA GOSTERİLMESİ
Bolum 2.a’da anlatıldığı gibi goruntu biriminde aynı anda sadece bir değer gosterilebilir. Saat değerini gostermek icin goruntu biriminin haneleri surekli olarak taranır. Tarama işleminde ilk olarak birinci hane secilir ve burada bu hanenin değeri gosterilir. Sonrasında ikinci hane secilir ve burada bu hanenin değeri gosterilir. Bu işlemler dorduncu haneye kadar yapılır. Dorduncu hanedeki değer gosterildikten sonra tekrar birinci hanedeki değer gosterilir. Bu şekilde donel olarak hanelerdeki değerler surekli olarak taranır. Haneler arasındaki geciş insan gozunun algılayacağı seviyeden daha duşuk olduğu icin aynı anda dort hane de goruntu biriminde gosteriliyormuş gibi olur.
Tarama işlemi main fonksiyonu icerisinde sonsuz bir dongude surekli olarak yapılır. Saat değerinin değiştirilmesi ve tuşlara basıldığında yapılacak işlemler kesmelerle kontrol edilir. MSP430 mikrodenetleyicisinin G/C bacakları kesmeleri algılayacak şekilde programlanabilir.
İŞLEMLERİN ZAMANLANMASI
MSP430 mikrodenetleyicilerinin 16 bitlik icsel bir zamanlayıcı birimi (TIMERA) bulunmaktadır. Bu zamanlayıcı icerisinde basit bir sayıcı devresi ve uc adet yakala/karşılaştır(capture/compare) birimi vardır [5]. Bu zamanlayıcı kullanılarak zamanlama işlemleri kesmeler ile kontrol edilebilir.
Zamanlama biriminin sayıcı devresi ceşitli zamanlama işaretleri kullanabilmektedir. Temel saat modul sisteminde(basic clock module system) tanımlanan TACLK, ACLK, SMCLK, INCLK zamanlama biriminin kullandığı işaretlerdir. Zamanlamayı sağlamak icin kristal osilatorden alınan 32768 Hz’lik bir saat işareti kullanılabilirdi. Fakat MSP430 mikrodenetleyicisinin icinde bulunan ACLK işareti kullanılarak devrede kristal osilator kullanılmasına gerek kalmamıştır. ACLK işareti Auxilary Clock olarak gecmektedir ve duşuk hızda işlem yapan cevre birimleri icin kullanılır. ACLK işareti icsel duşuk guclu ve frekanslı bir osilator işareti olan VLOCLK’a yazılımsal olarak bağlanabilir. Bu sayede 12kHz’lik bir ACLK işareti uretilir. TIMERA birimi de zamanlama işaretini ACLK’dan alırsa TIMERA’nın sayıcı devresindeki değer saniyede onikibin defa artar.
TIMERA icerisinde bulunan yakala/karşılaştır birimlerinin ceşitli calışma şekilleri vardır. Devrede “UP MODE” adı verilen her saat darbesinde sayıcının değerini bir artıran ve belirtilen değere gelince bir kesme ureten, sonrasında yine sıfırdan belirtilen değere kadar sayan şekilde calıştırılmıştır. “UP MODE” calışma şekli aşağıdaki şekilde de gosterilmiştir.

TIMERA icin 12kHz’lik bir saat işareti kullanılmaktadır. Bu birimin yakala/karşılaştır değerine 12000 girmek, her saniyede bir kesme oluşmasını sağlayacaktır. Fakat muhtemelen Proteus programından kaynaklanan bir hatadan dolayı VLOCLK işaretinin 24kHz frekansında olmaktadır. Aynı kod MSP430 Launchpad adlı geliştirme kitinde denendiğinde VLOCLK işaretinin frekansının 12kHz olduğu gozukmektedir.
KULLANICIDAN GİRDİLERİN ALINMASI
Saat, dakika, alarmın saati ve dakikasını ayarlamak icin kullanıcının devreye mudahale edebilmesi gerekir. Bunlar MSP430 mikrodenetleyicisinin genel amaclı G/C bacaklarına bağlanan dokunsal duğmelerle sağlanır. Devreyi kontrol etmek icin uc adet duğme bulunur. Bunlardan bir tanesi modlar arasında geciş yapmak icin, bir tanesi secilen değeri artırmak icin ve diğeri de secilen değeri azaltmak icin kullanılır.
Duğmelere basıldığı esnada bir kesme oluşur ve kesmenin kaynağına gore gerekli işlem yapılır. Saatin toplam 6 calışma modu vardır:
§ Normal: Saat ve dakika değerleri goruntu biriminde gosterilir.
§ Saat Ayarı: Mevcut saat değerinin değiştirilebileceği moddur. Bu modda saat değeri goruntu biriminde yanıp soner ve aşağı, yukarı duğmeleri ile değeri ayarlanabilir.
§ Dakika ayarı: Mevcut dakika değerinin değiştirilebileceği moddur. Bu modda dakika değeri goruntu biriminde yanıp soner ve aşağı, yukarı duğmeleri ile değeri ayarlanabilir.
§ Alarm Saat Ayarı: Alarmın saat değerinin değiştirilebileceği moddur. Bu modda alarmın saat değeri goruntu biriminde yanıp soner ve aşağı, yukarı duğmeleri ile değeri ayarlanabilir.
§ Alarm Dakika ayarı: Alarmın dakika değerinin değiştirilebileceği moddur. Bu modda alarmın dakika değeri goruntu biriminde yanıp soner ve aşağı, yukarı duğmeleri ile değeri ayarlanabilir.
§ Alarm: Alarm caldığı andaki moddur. Bir dakika boyunca bu modda kalır, saat ve dakika değeri goruntu biriminde yanıp soner ve buzzer’ dan kesik kesik alarm sesi gelir.
DEVRE BAĞLANTILARI
MSP430F2131 entegresinin genel amaclı 16 G/C bacağının 8 tanesi goruntu biriminin kısımlarını secmek icin cıkış, 4 tanesi goruntu biriminin hanelerini secmek icin cıkış, 3 tanesi duğmelerdeki basılmayı anlamak icin giriş ve 1 tanesi de buzzer’dan ses alabilmek icin cıkış olarak programlanmıştır ve aşağıdaki şekilde bağlantılar yapılmıştır. Karmaşıklığı onlemek icin Proteus’un bir ozelliği olan bus yapısı kullanılmıştır. Şekildeki mavi kalın cizgi bu hattı gostermektedir. Her bir bağlantı gerekli isimle adlandırılmıştır ve bağlantı noktasının yanında yazmaktadır.
TASARIM NOTLARI
§ Başlangıc olarak program belleği 1kB olan MSP430F2101 mikrodenetleyicisi kullanılmıştır. Fakat program boyutu arttıkca bu mikrodenetleyicinin program belleği yetersiz kalmıştır. Yapılan derleyici optimizasyonlarıyla program boyutu 4kB’a kadar inmiştir. Bunun uzerine MSP430F2131 mikrodenetleyicisi kullanılmıştır.
§ Saati ayarlama modlarında saniye değerinin artması durdurulmuştur. Yani saat veya alarm ayarlanırken saat değeri artmaz.
§ Yanıp sonme işlemini gercekleştirmek icin kesmeler her yarım saniyede bir uretilmektedir. Normal modda calışırken goruntu biriminin ikinci hanesindeki nokta yarım saniye yanar, yarım saniye sonuk kalır.
§ Gercek devrelerde mikrodenetleyicinin bacaklarına gelen akımı sınırlamak gerekebilir. Bunun icin direncler kullanılmaktadır. Fakat simulasyonda buna ihtiyac duyulmamıştır.
§ Goruntu birimine mikrodenetleyiciden giden akımı sınırlamak icin transistorlar kullanılabilir. Fakat transistor kullanıldığında hem devre karmaşıklaşmıştır hem de goruntu biriminde yanıp sonmeler meydana gelmiştir.
§ Simulasyon yapılırken goruntu biriminin her bir hanesine değer gonderildikten sonra gereksiz bir bekleme kodu eklenmiştir. Bu kod eklenmediği takdirde goruntu biriminde anlamsız değerler alınmaktadır.
§ Simulasyonun calışması aşağıdaki bağlantıdan izlenebilir.

Kod:
#include #include "in430.h" /*Genel Kesmeleri aktif etmek icin gereken başlık dosyası* #define DUGME1 P1IN_bit.P1IN_6 #define DUGME2 P1IN_bit.P1IN_7 //Saatin modları #define MD_NORMAL 0;//Saatin normal calışma modu #define MD_ST_AYAR 1;//Saat ayarlama modu #define MD_DK_AYAR 2;//Dakika ayarlama modu #define MD_AL_ST_AYAR 3;//Alarm saat ayarlama modu #define MD_AL_DK_AYAR 4;//Alarm dakika ayarlama modu #define MD_ALARM 5;//Alarm calma modu unsigned int SaatModu=0; const unsigned char seg[]=; unsigned char digits[4]; int saat=0,dakika=0,saniye=0; int alrsaat=1,alrdakika=1; int yanson=0; unsigned int DurumSayaci=0; void delay(unsigned long int ms) void SaniyeArtir() } } void SaatBastir() void main( void ) else if(SaatModu==1)//MD_ST_AYAR else else } } else if(SaatModu==2)//MD_ST_AYAR else } else if(SaatModu==3)//MD_AL_ST_AYAR else else } } else if(SaatModu==4)//MD_AL_DK_AYAR else } else if(SaatModu==5)//MD_ALARM else } SaatBastir(); } } #pragma vector=TIMERA0_VECTOR __interrupt void TIMERA0_ISR(void) else if(SaatModu==5) _BIC_SR_IRQ(LPM3_bits); } #pragma vector=PORT2_VECTOR __interrupt void PORT2_ISR(void) P2IFG_bit.P2IFG_7=0; //P2.7 kesme bayrağı temizleniyor. } else if(P2IFG_bit.P2IFG_6==1) else if(SaatModu==2)//MD_ST_AYAR else if(SaatModu==3)//MD_AL_ST_AYAR else if(SaatModu==4)//MD__AL_DK_AYAR P2IFG_bit.P2IFG_6=0; //P2.6 kesme bayrağı temizleniyor. } else else if(SaatModu==2)//MD_ST_AYAR else if(SaatModu==3)//MD_AL_ST_AYAR else if(SaatModu==4)//MD__AL_DK_AYAR P2IFG_bit.P2IFG_5=0; //P2.5 kesme bayrağı temizleniyor. } }
__________________