Ö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();
}
}
(http://i1105.hizliresim.com/2011/5/18/1495.png)
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?
7 segment displayleri 74hc595 ile de surebilirsin çok stabil ve guzel çalışıyor. Tavsiye ederim (:
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.
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?