Kronometre

DSC_0627

Kromometre, zamanı büyük hassasiyetle ölçen bir saat  çeşididir. Normal saatlerde santisaniye kavramı yoktur. Ancak kronometrelerde santisaniye kavramı vardır. Santisaniye 10milisaniyelik zaman birimidir. 100 santisaniye 1 saniye eder.

Kronometreler zamanın hassas ölçülmesi gereken yerlerde kullanılır. Mesela koşu, yüzme gibi spor müsabakalarında skoru tespit için, çizgi izleyen robotların pisti ne kadar zamanda tamamladığını ölçmek için vb. kullanılır.

Bu uygulamamızda PIC16F628A mikrodenetleyicisi kullanarak, 7 segment displayde 4 dijit kronometre yapacağız. Max ölçme sınırı 99 saniye 99 santisalise olacak. Zaman ölçümü için timer1 zamanlayıcısını kullanacağız.

7 segment displayi tarama metoduyla süreceğiz. Tarama için timer0 kesmesi kullanılacak. Yani bu uygulamada iki timer birden kullanacağız. İki timer birlikte kullandığımız için zamanların çakışmaması için ortak değerin en az olduğu kesme değeri kullanılmıştır.

Kronometreyi başlatmak için BUTON ismindeki B1 butonuna basacağız. Sıfırlamak için de RST tuşunu kullanacağız.

Devre şeması;

7segment Kronometre

mikroC program kodları aşağıdadır.

</pre>
#define BUTON PORTB.B0

#include <built_in.h>

const char LedKod[10]={0x80,0xF9,0x44,0x50,0x19,0x12,0x03,0xF8,0x00,0x18};
char deger[4], saniye=0, salise=0, sayac=0,temp=0;
unsigned char tara[4]={14,13,11,7};
//Timer0
//Prescaler 1:16; TMR0 Preload = 68; Actual Interrupt Time : 3 ms
void InitTimer0()
{
 OPTION_REG = 0x03;
 TMR0 = 68;
 INTCON.T0IE=1;
 INTCON.GIE=1;
}
//Timer1
//Prescaler 1:1; TMR1 Preload = 55536; Actual Interrupt Time : 10 ms
void InitTimer1()
{
 T1CON = 0x00;
 TMR1IF_bit = 0;
 TMR1H = 0xD8;
 TMR1L = 0xF0;
 TMR1IE_bit = 1;
 INTCON.PEIE=1;
}
//-----------------------------
void basamakla()
{
 deger[0]=LedKod[saniye/10];
 deger[1]=LedKod[saniye%10];
 deger[2]=LedKod[salise/10];
 deger[3]=LedKod[salise%10];
}
//---------------------------------
void Interrupt()
{
 if (TMR1IF_bit){
 TMR1IF_bit = 0;
 TMR1H = 0xD8;
 TMR1L = 0xF0;
 salise++;
 if(salise==100){salise=0;saniye++;}
 basamakla();
 }

if (TMR0IF_bit)
 {
 TMR0IF_bit = 0;
 TMR0 = 68;
 sayac++;
 if(sayac==4) sayac=0;
 temp&=0x0F;
 temp|=(tara[sayac]<<4);
 PORTB=temp;
 if(sayac==1) PORTB.B2=0; // saniye ile salises arasındaki nokta
 else PORTB.B2=1;
 PORTA=deger[sayac];
 }
}
//-------------------------------------------
void kurulum()
{
 CMCON=7;
 TRISA=0;
 TRISB=1;
 PORTA=0;
 PORTB=0xF4;
 InitTimer0();
 InitTimer1();
}
//------------------------------------------
void main()
{
 kurulum();
 basamakla();
 while(BUTON);
 T1CON.TMR1ON=1;
 Delay_ms(500);
 do
 {
 if(!BUTON) T1CON.TMR1ON=0;
 }while(1);

}
<pre>

Proje dosyalarına buradan erişebilirsiniz.

Projenin videosu aşağıdadır.

Reklamlar

6 thoughts on “Kronometre

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Connecting to %s