Msp430 Launchpad ile Frekansmetre

Başlatan rooest, 18 Mayıs 2011, 03:25:59

rooest

Ödev olarak verilen, "msp430 ve 3 digit 7 segment display ile frekansmetre"  yapımı ile uğraşıyorum. Konuya pek hakimiyetim olmadığından kısım kısım ilerleyerek ve sonuçları gözlemleyerek ilerlemeyi düşünüyorum.

Öncelikle yakalama modunu kullanarak,  gelen işaretin periyodunu bulup frekansı hesaplamayı düşünüyorum. Bu kısımda pic ile yapılmış projelere göz attım ve pek sıkıntı yaşamayacağımı düşünüyorum.

3 adet displayi de, tarama metodu kullanarak sürmeyi planlıyorum. Daha önce display sürmediğimden basit display örnekleri yapıp proteusta simüle etmeye başladım, fakat proteusta tarama metodunu bir türlü gerçekleştiremedim.  Kodu ve şemayı ekliyorum.  Hatalı kısımları bulmama yardımcı olursanız memnun olurum.


#include "io430.h"

 void bekle(void)
 {
       unsigned int k = 10000;  
       while(k>1) 
       {
           k--;
       }
 }

void main( void )
{
   
    
    WDTCTL = WDTPW + WDTHOLD;
    
    P2SEL = 0x00;
    P1DIR = 0xFF;
    P2DIR = 0xFF;
    
   
    while(1)
    {
      P2OUT = 0x80;
      P1OUT =0x24;
      bekle();
      
      P2OUT = 0x40;
      P1OUT = 0x78;
      bekle();
    }
}






rooest

Forumda araştırırken proteusta tarama yöntemi ile ilgili sorunlar olabileceği fikrine kapıldım. Daha önce proteusla tarama yönteminde sıkıntı yaşayıp, aynı  kodu gerçek devrede sorunsuz çalıştırabilen olduysa,  bilgi ve tecrübelerini paylaşabilir mi?

MrDarK

7 segment displayleri 74hc595 ile de surebilirsin çok stabil ve guzel çalışıyor. Tavsiye ederim (:
Picproje Eğitim Gönüllüleri ~ MrDarK

rooest

#3
Alıntı yapılan: MrDarK - 19 Mayıs 2011, 23:08:14
7 segment displayleri 74hc595 ile de surebilirsin çok stabil ve guzel çalışıyor. Tavsiye ederim (:

Elimde  birkaçtane 7447 bulunduğundan devreyi bu entegre ile kurdum, yine de teşekkürler tavsiyeniz için.

Bu arada proteusta  yapamadığım Display tarama işlemini,  kodu hiç değiştirmeden, devreyi kurup denediğimde olumlu sonuç aldım.   Fakat  hala frekansı hesaplamayı başarabilmiş değilim.  Frekans hesaplamak için yazdığım kodda,  olağanüstü mantık hataları yapmış olabilirim. Bu konuda deneyimli olan arkadaşlar tavsiyelerini esirgemezlerse sevinirim.
#include "io430.h"
#include "in430.h"

void bekle(void)
{
    unsigned int say = 600;
    int say2 = 6;
    
    while(say2>2){
        say2--;
        while(say > 1)
        {
          say--;
        }
    }

}

void main( void )
{
        
       WDTCTL = WDTPW + WDTHOLD;
       
       BCSCTL1 = CALBC1_1MHZ;       
       DCOCTL  = CALDCO_1MHZ;
            
       TACCTL0 = CM_1 | CCIS_0 | SCS | CAP | CCIE;	// her yukselen - CCIxA giriş - senkron - capture mod - CCP için kesmeler açık
       TACTL = TASSEL_2 | ID_0 | MC_2 | TACLR;	        // işaret kaynağı SMCLK - Frekans bolucu 1 - continuous
       
       P2SEL = 0x00;                                    // P2 Portu İ/O seçildi
        
       P1DIR = 0xFF & ~(BIT0 | BIT1);                   // P1.0 P1.2 giriş, diğerleri çıkış
       P1SEL = BIT1;                                    // P1.1  sinyalin uygulanacağı giriş
       P2DIR = 0xFF;                                     // P2 Çıkış
       P2OUT = 0xFF;                                      // P2  çıkışı 1
       
       unsigned char tablo[10] = {0x00, 0x04, 0x08, 0x0C, 0x10, 0x14, 0x18, 0x1C, 0x20, 0x24};  
       unsigned int Count;
       unsigned int frek;
       unsigned int i = 60000;
       int dgt1, dgt2, dgt3;
       
       _BIS_SR(LPM1_bits);
       
       while(1)
       {
          if(TACCTL0_bit.CCIFG==1)      // Yakalama gerçekleştiyse
          {
              Count = TACCR0;           // TAR değişkeniinden TACCR0 ' a  kopyalanan değer, Count a  aktarıldı
              TAR = 0x00;               // TAR yeni baştan sayması için 0 landı
              bekle();
              
              frek = 1000000 / Count; 
              
              dgt3 = frek / 100;
              dgt1 = frek % 10;
              dgt2 = (frek / 10) % 10;
              
              while(i>1)
              {
                  P2OUT = 0x40;
                  P1OUT = tablo[dgt2];
                  bekle();
                  
                  P2OUT = 0x80;
                  P1OUT = tablo[dgt3];
                  bekle();
                  
                  P2OUT = 0x00;
                  
                  P1OUT = tablo[dgt1];
                  P1OUT_bit.P1OUT_7 = 1;
                  bekle();
                  P1OUT = 0x00;
                  
                  i--;
              }
              
              TACCTL0_bit.CCIFG = 0;      // CCI kesme bayrağı temizlendi
          }
       
       }
}


Not1:  'frek' değişkenini elimle atadığımda,  3 digit 7 segment displayde bu değeri görebiliyorum. Yani yakalanan frekansı displaye aktarma kısmında bir sorun yok,  devrede de bir problem yok. 

Not2:  Msp430 un P1.1  pinine, başka bir msp430 vasıtasıyla pwm uyguluyorum. Pwm'i  ürettiğim Msp430' un P1.6 pinini çıkış olarak seçtim ve çıkış sinyalinde bir sorun olmadığını, P1.6 daki led ile gözlemledim.


rooest

Msp430'da kesme vektörüyle değilde,  sonsuz bir döngü içerisinde  "  if(TACCTL0_bit.CCIFG==1)  "  yakalama işleminin  gerçekleşip gerçekleşmediğini kontrol etmeye çalıştım.  Böyle bir kullanım hatalı mıdır?