Programlama | Programlama Dilleri | C Programlama Dili |C++

Anasayfa Programlama C / C++ Proteus Kullanarak MSP430 Alarm Saat Uygulaması


Proteus Kullanarak MSP430 Alarm Saat Uygulaması

GİRİŞ

Projenin amacı Proteus programı kullanarak bir alarmlı saat simülasyonu yapmaktır. Labcenter Electronic firmasının bir ürünü olan Proteus görsel olarak elektronik devrelerin simülasyonunu yapabilen yetenekli bir devre çizimi, simülasyonu, animasyonu ve PCB(Baskı Devre Kartı) çizimi programıdır [1]. Proteus yüklemesiyle birlikte iki adet program gelir. Bunlardan birisi simülasyon için devrelerin hazırlandığı ISIS programı, diğeri baskı devre için devre elemanlarının kart üzerine yerleştirildiği ARES programıdır. Sadece simülasyon yapılacağı için ISIS programı kullanılmıştır.

ISIS programı içerisinde birçok aktif ve pasif devre elemanları barındırır. Bu programın kütüphaneleri içinde bulunan devre elemanları kolay bir şekilde seçilip devreye eklenebilir ve kablo bağlantıları yapılabilir.

Alarmlı saat uygulaması yapılırken saat devresinin kontrolünü sağlayacak bir mikrodenetleyici kullanılması gerekmektedir. PROTEUS programı içerisinde çok 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 örnek olarak verilebilir. Projeyi gerçekleştirmek için seçilen mikrodenetleyicinin çok yüksek işlem kapasitesi olmasına gerek yoktur. Mikrodenetleyicinin yapması gereken işlemler arasında; saat verisini ekranda göstermek, saati her saniyede bir güncellemek, kullanıcıdan girişler alıp saat ve alarmı ayarlamak ve alarm için kullanıcıya uyarı vermek vardır. Bu gereksinimler göz önüne alındığında basit bir mikrodenetleyici ihtiyacmızı karşılayabilmektedir. Mikrodenetleyici seçiminde en uygun seçenek Microchip firmasından bir PIC kullanmak gibi gözükse de Texas Instruments firmasının MSP430 ailesinden bir mikrodenetleyici kullanılmıştır. PIC için çok fazla Türkçe kaynak bulunmasına rağmen daha önce çok az da olsa araştırdığım ve aşina olduğum MSP430 seçilmiştir. MSP430 için Texas Instruments firması ücretsiz olarak C derleyicisi ve IDE desteği sağlamaktadır. MSP430 desteği PROTEUS ile yeni gelen bir özelliktir. Bunun için simülasyonda Proteus 7.6 VSM sürümü kullanılmıştır.

 

KULLANILAN MALZEMELER

a.      4 Haneli 7 Kısımlı Ortak Anotlu LED Görüntü Birimi

Alarm saat hakkındaki bilgileri göstermek için bu görüntü birimi kullanılmıştır. Saat ve dakika değerlerini göstermek için 4 hane yeterli olacaktır.

7 kısımlı görüntü birimi ortak anotlu ve ortak katotlu olarak ikiye ayrılır. 7 kısımlı ismini almasının sebebi sayıları gösterebilmek için 7 tane bacağa sahiptir. Görüntü birimindeki nokta işaretini göstermek için bir bacak daha mevcuttur. Aşağıdaki şekilde ortak anotlu bir görüntü biriminin içyapısı verilmiştir.

 7 segmet display7 segment iç yapısı diyotlu

Görüntü 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. Örneğin görüntü biriminde 7 rakamını elde etmek için ortak anotun artı(VCC,+); a, b ve c uçlarının toprağa(GND) bağlanması gerekir. Tek haneli görüntü birimi için toplam dokuz uç kullanılmaktadır.

Dört haneli görüntüyü sağlamak için Proteus programında bulunan 7SEG-MPX4-CA-BLUE kodlu görüntü birimi kullanılmıştır. Bu görüntü biriminin toplam 12 tane ucu vardır. Bunlardan 8 tanesi rakamları gösterecek kısımlar için, 4 tanesi de haneleri seçmek içindir. Görüntü biriminin Proteus programındaki görünümü ve içyapısı aşağıdaki şekilde verilmiştir.

4 digit 7 segment display4 digit 7 segment display iç yapısı

Bağlantı şeması Lumex firmasının ürettiği bir görüntü birimine aittir [3]. Bu şemaya göre hane uçlarından bir tanesi seçilip(pozitif gerilim uygulama) kısım uçlarından da istenilen değeri göstermek için gerekli uçları toprağa bağlamak, istenilen hanede istenilen rakamın gösterilmesini sağlayacaktır. Örneğin birinci hanede 7 rakamını göstermek için 1 nolu ucu pozitif gerilime; a,b ve c uçlarını da toprağa bağlamak yeterli olacaktır.

Şekildeki görüntü birimi kullanılarak aynı anda iki farklı hanede iki farklı değer gösterilemez. Fakat saat değerlerini göstermek için farklı hanelerde farklı değerlerin gösterilmesi gerekir. Bu işlemin nasıl yapıldığı 3. bölümde anlatılmaktadır.

b.      MSP430F2131 Mikrodenetleyici

MSP430 Texas Instruments firmasının ürettiği düşük güç tüketen yetenekli bir mikrodenetleyicidir. Simülasyonda kullanılan MSP430F2131’in bazı özellikleri aşağıda verilmiştir[4].

·         Düşük besleme gerilimi ile çalışma(1.8V-3.6V)

·         Çok düşük güç tüketimi (aygıtlar kapalı iken RAM değerlerini koruma:0.1µA)

·         Temel Saat Modülü Ayarları:

§  16MHz’e kadar çıkabilen ve ayarlanabilen içsel saat frekansı

§  32kHz kristal

§  Dışarıdan alınabilen saat işareti

§  Temel Saat Modülü Ayarları:

·         Voltaj düşüklüğü algılayıcı

·         16 bitlik Timer_A(zamanlayıcı devre)

·         16 adet genel amaçlı G/Ç bacağı

MSP430F2131’in 20 bacaklı plastik kılıf yapısı aşağıdaki şekilde verilmiştir [4].

msp430 20 bacaklı plastik kılıf bacakları

c.       Diğer Malzemeler

Saat modları arasında geçiş yapmak için ve değerleri değiştirmek için 3 adet dokunsal düğme(tactile button), Alarm sesini duyabilmek için 1 adet 2V ile çalışan buzzer.

 

ÇIKIŞLARIN EKRANDA GÖSTERİLMESİ

Bölüm 2.a’da anlatıldığı gibi görüntü biriminde aynı anda sadece bir değer gösterilebilir. Saat değerini göstermek için görüntü biriminin haneleri sürekli olarak taranır. Tarama işleminde ilk olarak birinci hane seçilir ve burada bu hanenin değeri gösterilir. Sonrasında ikinci hane seçilir ve burada bu hanenin değeri gösterilir. Bu işlemler dördüncü haneye kadar yapılır. Dördüncü hanedeki değer gösterildikten sonra tekrar birinci hanedeki değer gösterilir. Bu şekilde dönel olarak hanelerdeki değerler sürekli olarak taranır. Haneler arasındaki geçiş insan gözünün algılayacağı seviyeden daha düşük olduğu için aynı anda dört hane de görüntü biriminde gösteriliyormuş gibi olur.

Tarama işlemi main fonksiyonu içerisinde sonsuz bir döngüde sürekli 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/Ç bacakları kesmeleri algılayacak şekilde programlanabilir.

 

İŞLEMLERİN ZAMANLANMASI

MSP430 mikrodenetleyicilerinin 16 bitlik içsel bir zamanlayıcı birimi (TIMERA) bulunmaktadır. Bu zamanlayıcı içerisinde basit bir sayıcı devresi ve üç 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 çeşitli zamanlama işaretleri kullanabilmektedir. Temel saat modül sisteminde(basic clock module system) tanımlanan TACLK, ACLK, SMCLK, INCLK zamanlama biriminin kullandığı işaretlerdir. Zamanlamayı sağlamak için kristal osilatörden alınan 32768 Hz’lik bir saat işareti kullanılabilirdi. Fakat MSP430 mikrodenetleyicisinin içinde bulunan ACLK işareti kullanılarak devrede kristal osilatör kullanılmasına gerek kalmamıştır. ACLK işareti Auxilary Clock olarak geçmektedir ve düşük hızda işlem yapan çevre birimleri için kullanılır. ACLK işareti içsel düşük güçlü ve frekanslı bir osilatör işareti olan VLOCLK’a yazılımsal olarak bağlanabilir. Bu sayede 12kHz’lik bir ACLK işareti üretilir. TIMERA birimi de zamanlama işaretini ACLK’dan alırsa TIMERA’nın sayıcı devresindeki değer saniyede onikibin defa artar.

TIMERA içerisinde bulunan yakala/karşılaştır birimlerinin çeşitli çalış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 üreten, sonrasında yine sıfırdan belirtilen değere kadar sayan şekilde çalıştırılmıştır. “UP MODE” çalışma şekli aşağıdaki şekilde de gösterilmiştir.

TACLK UP çalışma modu

TIMERA için 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 gözükmektedir.

 

KULLANICIDAN GİRDİLERİN ALINMASI

Saat, dakika, alarmın saati ve dakikasını ayarlamak için kullanıcının devreye müdahale edebilmesi gerekir. Bunlar MSP430 mikrodenetleyicisinin genel amaçlı G/Ç bacaklarına bağlanan dokunsal düğmelerle sağlanır. Devreyi kontrol etmek için üç adet düğme bulunur. Bunlardan bir tanesi modlar arasında geçiş yapmak için, bir tanesi seçilen değeri artırmak için ve diğeri de seçilen değeri azaltmak için kullanılır.

Düğmelere basıldığı esnada bir kesme oluşur ve kesmenin kaynağına göre gerekli işlem yapılır. Saatin toplam 6 çalışma modu vardır:

§  Normal: Saat ve dakika değerleri görüntü biriminde gösterilir.

§  Saat Ayarı: Mevcut saat değerinin değiştirilebileceği moddur. Bu modda saat değeri görüntü biriminde yanıp söner ve aşağı, yukarı düğmeleri ile değeri ayarlanabilir.

§  Dakika ayarı: Mevcut dakika değerinin değiştirilebileceği moddur. Bu modda dakika değeri görüntü biriminde yanıp söner ve aşağı, yukarı düğ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 görüntü biriminde yanıp söner ve aşağı, yukarı düğ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 görüntü biriminde yanıp söner ve aşağı, yukarı düğmeleri ile değeri ayarlanabilir.

§  Alarm: Alarm çaldığı andaki moddur. Bir dakika boyunca bu modda kalır, saat ve dakika değeri görüntü biriminde yanıp söner ve buzzer’ dan kesik kesik alarm sesi gelir.

 DEVRE BAĞLANTILARI

MSP430F2131 entegresinin genel amaçlı 16 G/Ç bacağının 8 tanesi görüntü biriminin kısımlarını seçmek için çıkış, 4 tanesi görüntü biriminin hanelerini seçmek için çıkış, 3 tanesi düğmelerdeki basılmayı anlamak için giriş ve 1 tanesi de buzzer’dan ses alabilmek için çıkış olarak programlanmıştır ve aşağıdaki şekilde bağlantılar yapılmıştır. Karmaşıklığı önlemek için Proteus’un bir özelliği olan bus yapısı kullanılmıştır. Şekildeki mavi kalın çizgi bu hattı göstermektedir. 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ıç olarak program belleği 1kB olan MSP430F2101 mikrodenetleyicisi kullanılmıştır. Fakat program boyutu arttıkça bu mikrodenetleyicinin program belleği yetersiz kalmıştır. Yapılan derleyici optimizasyonlarıyla program boyutu 4kB’a kadar inmiştir. Bunun üzerine 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 sönme işlemini gerçekleştirmek için kesmeler her yarım saniyede bir üretilmektedir. Normal modda çalışırken görüntü biriminin ikinci hanesindeki nokta yarım saniye yanar, yarım saniye sönük kalır.

§  Gerçek devrelerde mikrodenetleyicinin bacaklarına gelen akımı sınırlamak gerekebilir. Bunun için dirençler kullanılmaktadır. Fakat simülasyonda buna ihtiyaç duyulmamıştır.

§  Görüntü birimine mikrodenetleyiciden giden akımı sınırlamak için transistorlar kullanılabilir. Fakat transistor kullanıldığında hem devre karmaşıklaşmıştır hem de görüntü biriminde yanıp sönmeler meydana gelmiştir.

§  Simülasyon yapılırken görüntü biriminin her bir hanesine değer gönderildikten sonra gereksiz bir bekleme kodu eklenmiştir. Bu kod eklenmediği takdirde görüntü biriminde anlamsız değerler alınmaktadır.

§  Simülasyonun çalışması aşağıdaki bağlantıdan izlenebilir.

http://www.youtube.com/watch?v=8t5jPtU3DMo

 

 

 

Alarm saat devresinin Proteus programındaki görünümü


 

 

Program Kodu:

  1.  
  2.  
  3.  
  4.  
  5.  
  6.  
  7. #include <io430x20x1.h>
  8.  
  9. #include "in430.h" /*Genel Kesmeleri aktif etmek için gereken başlık dosyası*/
  10.  
  11. #define DUGME1 P1IN_bit.P1IN_6
  12.  
  13. #define DUGME2 P1IN_bit.P1IN_7
  14.  
  15. //Saatin modları
  16.  
  17. #define MD_NORMAL 0;//Saatin normal çalışma modu
  18.  
  19. #define MD_ST_AYAR 1;//Saat ayarlama modu
  20.  
  21. #define MD_DK_AYAR 2;//Dakika ayarlama modu
  22.  
  23. #define MD_AL_ST_AYAR 3;//Alarm saat ayarlama modu
  24.  
  25. #define MD_AL_DK_AYAR 4;//Alarm dakika ayarlama modu
  26.  
  27. #define MD_ALARM 5;//Alarm çalma modu
  28.  
  29.  
  30.  
  31. unsigned int SaatModu=0;
  32.  
  33. const unsigned char seg[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
  34.  
  35. unsigned char digits[4];
  36.  
  37. int saat=0,dakika=0,saniye=0;
  38.  
  39. int alrsaat=1,alrdakika=1;
  40.  
  41. int yanson=0;
  42.  
  43. unsigned int DurumSayaci=0;
  44.  
  45. void delay(unsigned long int ms)
  46.  
  47. {
  48.  
  49.   for(unsigned long int i=0;i<ms;i++);
  50.  
  51. }
  52.  
  53.  
  54.  
  55. void SaniyeArtir()
  56.  
  57. {
  58.  
  59.   saniye++;
  60.  
  61.   if(saniye==60)
  62.  
  63.   {
  64.  
  65.     saniye=0;
  66.  
  67.     dakika++;
  68.  
  69.     if(dakika==60)
  70.  
  71.     {
  72.  
  73.       dakika=0;
  74.  
  75.       saat++;
  76.  
  77.       if(saat==24)
  78.  
  79.         saat=0;
  80.  
  81.     }
  82.  
  83.   }
  84.  
  85. }
  86.  
  87.  
  88.  
  89. void SaatBastir()
  90.  
  91. {
  92.  
  93.   int bekleme=1000;
  94.  
  95.   if(yanson && SaatModu==5)
  96.  
  97.     P2OUT=0x11;
  98.  
  99.   else    
  100.  
  101.     P2OUT=0x01;
  102.  
  103.   P1OUT=digits[0];
  104.  
  105.   delay(bekleme);
  106.  
  107.   if(yanson && SaatModu==5)
  108.  
  109.     P2OUT=0x12;
  110.  
  111.   else    
  112.  
  113.     P2OUT=0x02;
  114.  
  115.   P1OUT=digits[1];
  116.  
  117.   delay(bekleme);
  118.  
  119.   if(yanson && SaatModu==5)
  120.  
  121.     P2OUT=0x14;
  122.  
  123.   else    
  124.  
  125.     P2OUT=0x04;
  126.  
  127.   P1OUT=digits[2];
  128.  
  129.   delay(bekleme);
  130.  
  131.   if(yanson && SaatModu==5)
  132.  
  133.     P2OUT=0x18;
  134.  
  135.   else    
  136.  
  137.     P2OUT=0x08;
  138.  
  139.   P1OUT=digits[3];
  140.  
  141.   delay(bekleme);
  142.  
  143. }
  144.  
  145.  
  146.  
  147.  
  148.  
  149. void main( void )
  150.  
  151. {
  152.  
  153. WDTCTL = WDTPW + WDTHOLD;//Watchdog timer durduruluyor...
  154.  
  155. BCSCTL3 |= LFXT1S_2;//ACLK için VLO kullan, yaklaşık 12Khz
  156.  
  157. BCSCTL1 = CALBC1_1MHZ;// Set DCO to 1MHz
  158.  
  159. DCOCTL = CALDCO_1MHZ;
  160.  
  161. CCR0  = 12000-1;// 12000 saat darbesinde 1 kesme üretilecek
  162.  
  163. CCTL0 = CCIE;// CCR0 kesmeleri aktif
  164.  
  165. TACTL = TASSEL_1+MC_1;// TimerA için ACLK'i saat olarak seç, upmode
  166.  
  167. //TACCTL0|=CM_3;
  168.  
  169. P1DIR = 0xFF;   //P1 çıkış...
  170.  
  171. P2DIR = 0X1F;   //P2.6 ve P2.7 giriş diğerleri çıkış
  172.  
  173. //port interruptlarını aktif etme
  174.  
  175. P2IE_bit.P2IE_5=1;//P2.5 için interruptları aktif yapma
  176.  
  177. P2IES_bit.P2IES_5=1;//P2.5 için interrupt çıkan kenarda
  178.  
  179. P2IFG_bit.P2IFG_5=0;//P2.5 için interrupt bayrağını sıfırla
  180.  
  181. P2IE_bit.P2IE_6=1;//P2.6 için interruptları aktif yapma
  182.  
  183. P2IES_bit.P2IES_6=1;//P2.6 için interrupt çıkan kenarda
  184.  
  185. P2IFG_bit.P2IFG_6=0;//P2.6 için interrupt bayrağını sıfırla
  186.  
  187. P2IE_bit.P2IE_7=1;//P2.7 için interruptları aktif yapma
  188.  
  189. P2IES_bit.P2IES_7=1;//P2.7 için interrupt çıkan kenarda
  190.  
  191. P2IFG_bit.P2IFG_7=0;//P2.7 için interrupt bayrağını sıfırla
  192.  
  193.  
  194.  
  195. _BIS_SR(GIE);// kesmeleri aktif et
  196.  
  197.  
  198.  
  199.  while(1)
  200.  
  201.  {
  202.  
  203.    DurumSayaci++;
  204.  
  205.    if(SaatModu == 0 ) //MD_NORMAL
  206.  
  207.    {
  208.  
  209.      digits[0]=seg[saat/10];
  210.  
  211.      digits[1]=seg[saat%10];
  212.  
  213.      digits[2]=seg[dakika/10];
  214.  
  215.      digits[3]=seg[dakika%10];
  216.  
  217.      if(yanson)
  218.  
  219.        digits[1]&=0x7F;
  220.  
  221.    }
  222.  
  223.  
  224.  
  225.    else if(SaatModu==1)//MD_ST_AYAR
  226.  
  227.    {
  228.  
  229.      if(DurumSayaci<50)
  230.  
  231.      {
  232.  
  233.         digits[0]=0x88;//A harfi
  234.  
  235.         digits[1]=0x91;//Y Harfi
  236.  
  237.         digits[2]=0x88;//A harfi
  238.  
  239.         digits[3]=0xAF;//r harfi
  240.  
  241.  
  242.  
  243.      }
  244.  
  245.      else
  246.  
  247.      {
  248.  
  249.       if(yanson)
  250.  
  251.       {
  252.  
  253.         digits[0]=seg[saat/10];
  254.  
  255.         digits[1]=seg[saat%10];
  256.  
  257.         digits[2]=seg[dakika/10];
  258.  
  259.         digits[3]=seg[dakika%10];
  260.  
  261.       }
  262.  
  263.       else
  264.  
  265.       {
  266.  
  267.         digits[0]=0xFF;
  268.  
  269.         digits[1]=0xFF;
  270.  
  271.         digits[2]=seg[dakika/10];
  272.  
  273.         digits[3]=seg[dakika%10];
  274.  
  275.       }
  276.  
  277.      }
  278.  
  279.    }
  280.  
  281.    else if(SaatModu==2)//MD_ST_AYAR
  282.  
  283.    {
  284.  
  285.       if(yanson)
  286.  
  287.       {
  288.  
  289.         digits[0]=seg[saat/10];
  290.  
  291.         digits[1]=seg[saat%10];
  292.  
  293.         digits[2]=seg[dakika/10];
  294.  
  295.         digits[3]=seg[dakika%10];
  296.  
  297.       }
  298.  
  299.       else
  300.  
  301.       {
  302.  
  303.         digits[0]=seg[saat/10];
  304.  
  305.         digits[1]=seg[saat%10];
  306.  
  307.         digits[2]=0xFF;
  308.  
  309.         digits[3]=0xFF;
  310.  
  311.       }
  312.  
  313.    }
  314.  
  315.    else if(SaatModu==3)//MD_AL_ST_AYAR
  316.  
  317.    {
  318.  
  319.      if(DurumSayaci<50)
  320.  
  321.      {
  322.  
  323.         digits[0]=0x88;//A harfi
  324.  
  325.         digits[1]=0xC7;//L Harfi
  326.  
  327.         digits[2]=0xAF;//r harfi
  328.  
  329.         digits[3]=0xFF;
  330.  
  331.      }
  332.  
  333.      else
  334.  
  335.      {
  336.  
  337.       if(yanson)
  338.  
  339.       {
  340.  
  341.         digits[0]=seg[alrsaat/10];
  342.  
  343.         digits[1]=seg[alrsaat%10];
  344.  
  345.         digits[2]=seg[alrdakika/10];
  346.  
  347.         digits[3]=seg[alrdakika%10];
  348.  
  349.       }
  350.  
  351.       else
  352.  
  353.       {
  354.  
  355.         digits[0]=0xFF;
  356.  
  357.         digits[1]=0xFF;
  358.  
  359.         digits[2]=seg[alrdakika/10];
  360.  
  361.         digits[3]=seg[alrdakika%10];
  362.  
  363.       }
  364.  
  365.      }
  366.  
  367.    }
  368.  
  369.    else if(SaatModu==4)//MD_AL_DK_AYAR
  370.  
  371.    {
  372.  
  373.       if(yanson)
  374.  
  375.       {
  376.  
  377.         digits[0]=seg[alrsaat/10];
  378.  
  379.         digits[1]=seg[alrsaat%10];
  380.  
  381.         digits[2]=seg[alrdakika/10];
  382.  
  383.         digits[3]=seg[alrdakika%10];
  384.  
  385.       }
  386.  
  387.       else
  388.  
  389.       {
  390.  
  391.         digits[0]=seg[alrsaat/10];
  392.  
  393.         digits[1]=seg[alrsaat%10];
  394.  
  395.         digits[2]=0xFF;
  396.  
  397.         digits[3]=0xFF;
  398.  
  399.       }
  400.  
  401.      }   
  402.  
  403.    else if(SaatModu==5)//MD_ALARM
  404.  
  405.    {
  406.  
  407.       if(yanson)
  408.  
  409.       {
  410.  
  411.         digits[0]=seg[alrsaat/10];
  412.  
  413.         digits[1]=seg[alrsaat%10];
  414.  
  415.         digits[2]=seg[alrdakika/10];
  416.  
  417.         digits[3]=seg[alrdakika%10];
  418.  
  419.       }
  420.  
  421.       else
  422.  
  423.       {
  424.  
  425.         digits[0]=0xFF;
  426.  
  427.         digits[1]=0xFF;
  428.  
  429.         digits[2]=0xFF;
  430.  
  431.         digits[3]=0xFF;
  432.  
  433.       }
  434.  
  435.      }   
  436.  
  437.  SaatBastir();
  438.  
  439.  }
  440.  
  441. }
  442.  
  443.  
  444.  
  445.  
  446.  
  447. #pragma vector=TIMERA0_VECTOR
  448.  
  449. __interrupt void TIMERA0_ISR(void) {
  450.  
  451.   yanson=!yanson;
  452.  
  453.   if(dakika==alrdakika && saat==alrsaat && SaatModu==0)
  454.  
  455.     SaatModu=5;//Alarm çalma moduna geç
  456.  
  457.   if(yanson && SaatModu==0)
  458.  
  459.   {
  460.  
  461.     SaniyeArtir();
  462.  
  463.   }
  464.  
  465.   else if(SaatModu==5)
  466.  
  467.   {
  468.  
  469.     if(yanson)
  470.  
  471.       SaniyeArtir();
  472.  
  473.     if(dakika!=alrdakika || saat!=alrsaat)
  474.  
  475.       SaatModu=0;
  476.  
  477.   }
  478.  
  479.   _BIC_SR_IRQ(LPM3_bits);
  480.  
  481. }
  482.  
  483.  
  484.  
  485. #pragma vector=PORT2_VECTOR
  486.  
  487. __interrupt void PORT2_ISR(void)
  488.  
  489. {
  490.  
  491.   if(P2IFG_bit.P2IFG_7==1)
  492.  
  493.   {
  494.  
  495.     if(SaatModu!=5)
  496.  
  497.     {
  498.  
  499.       SaatModu=(SaatModu+1)%5;//Mod değiştirme
  500.  
  501.       DurumSayaci=0;
  502.  
  503.     }
  504.  
  505.     P2IFG_bit.P2IFG_7=0; //P2.7 kesme bayrağı temizleniyor.
  506.  
  507.   }
  508.  
  509.   else if(P2IFG_bit.P2IFG_6==1)
  510.  
  511.   {
  512.  
  513.     if(SaatModu==1)//MD_ST_AYAR
  514.  
  515.     {
  516.  
  517.       saat=(saat+1)%24;
  518.  
  519.     }
  520.  
  521.     else if(SaatModu==2)//MD_ST_AYAR
  522.  
  523.     {
  524.  
  525.       dakika=(dakika+1)%60;
  526.  
  527.     }
  528.  
  529.     else if(SaatModu==3)//MD_AL_ST_AYAR
  530.  
  531.     {
  532.  
  533.       alrsaat=(alrsaat+1)%24;
  534.  
  535.     }
  536.  
  537.     else if(SaatModu==4)//MD__AL_DK_AYAR
  538.  
  539.     {
  540.  
  541.       alrdakika=(alrdakika+1)%60;
  542.  
  543.     }
  544.  
  545.     P2IFG_bit.P2IFG_6=0; //P2.6 kesme bayrağı temizleniyor.
  546.  
  547.   }
  548.  
  549.   else
  550.  
  551.   {
  552.  
  553.     if(SaatModu==1)//MD_ST_AYAR
  554.  
  555.     {
  556.  
  557.       saat=(saat-1+24)%24;
  558.  
  559.     }
  560.  
  561.     else if(SaatModu==2)//MD_ST_AYAR
  562.  
  563.     {
  564.  
  565.       dakika=(dakika-1+60)%60;
  566.  
  567.     }
  568.  
  569.     else if(SaatModu==3)//MD_AL_ST_AYAR
  570.  
  571.     {
  572.  
  573.       alrsaat=(alrsaat-1+24)%24;
  574.  
  575.     }
  576.  
  577.     else if(SaatModu==4)//MD__AL_DK_AYAR
  578.  
  579.     {
  580.  
  581.       alrdakika=(alrdakika-1+60)%60;
  582.  
  583.     }
  584.  
  585.     P2IFG_bit.P2IFG_5=0; //P2.5 kesme bayrağı temizleniyor.
  586.  
  587.   }
  588.  
  589. }

KAYNAKLAR

[1]           http://tr.wikipedia.org/wiki/Proteus , 02.01.11

[2]           http://focus.ti.com/mcu/docs/mcuprodoverview.tsp?sectionId=95&tabId=140&familyId=342, 02.01.11

[3]           http://www.lumex.com/specs/LDQ-M284RI.pdf, 03.01.11

[4]           MSP430x21x1 Mixed Signal Microcontroller (Rev. D)

[5]           MSP430x2xx Family User's Guide (Rev. F)

Yorumlar (0)
Sadece kayıtlı kullanıcılar yorum yazabilir!
Son Güncelleme ( Çarşamba, 10 Ağustos 2011 20:54 )  
amınıza koyayım amınıza koyayım amınıza koyayım amınıza koyayım amınıza koyayım amınıza koyayım