Buldum programı. Şöyle yazmışım:
#include <16F877A.h>
#FUSES NOWDT //No Watch Dog Timer
#FUSES HS //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOPUT //No Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#FUSES NOWRT //Program memory not write protected
#use delay(clock=4000000)
#priority timer0, RB //RB more priority than timer0
int16 t=0; //topun geçiş süresi(ms)
int1 timing_started=0; //ilk sensör gördü
int1 time_measured=0; //ikinci sensör gördü ve topun geçiş süresi "t" içine kaydedildi.
int16 v=0; //hız
int16 s=613336363; //sabit sayı yol*1saat(3600sn) sadeleştirilerek 720 kabul edilmiştir. sonuç km/h çıkması için.
int8 digit_100=0;
int8 digit_10=0;
int8 digit_1=0;
int8 port_d_deger=0;
int1 hiz_hesaplandi=0;
int1 mod_hesap_tmm =0;
int1 gosterim_tmm =0;
#int_RB
void RB_signal(void)
{
if (input(pin_b4)&&!timing_started)
{
enable_interrupts(INT_TIMER0);
timing_started =1;
}
if (input(pin_b5)&&timing_started&&!time_measured)
{
disable_interrupts(INT_TIMER0);
time_measured = 1;
// timing_started =0;
}
}
#int_TIMER0
void TIMER0_isr(void)
{
set_timer0(231); // TMR0 değeri belirleniyor
t++; // t değeri 1 arttırılıyor
}
void main()
{
setup_psp(PSP_DISABLED);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_adc_ports(NO_ANALOGS);
setup_spi(SPI_SS_DISABLED);
setup_ccp1(CCP_OFF);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
set_tris_b(0xF0); // RB7,RB6,RB5,RB4 giriş, diğer uçlar çıkış
set_tris_a(0x00); // A portu çıkış
set_tris_c(0x00); // C portu çıkış
set_tris_d(0x00); // D portu çıkış
setup_timer_0(RTCC_INTERNAL | RTCC_DIV_4); // Timer0 ayarları yapılıyor
set_timer0(231); // TMR0 değeri belirleniyor
output_a(0x00);
output_d(0x00);
output_high(pin_B1); //led sürücü resetleniyor
delay_ms(50);
output_low(pin_B1);
delay_ms(50);
enable_interrupts(INT_RB);
enable_interrupts(GLOBAL);
//**********************************************************************
//Tüm değerler sıfırlanıyor.
t = 0;
v = 0;
timing_started=0;
time_measured=0;
hiz_hesaplandi=0;
mod_hesap_tmm=0;
port_d_deger=0;
digit_100=0;
digit_10=0;
digit_1=0;
gosterim_tmm=0;
while(1)
{
if (time_measured&&!hiz_hesaplandi)
{
disable_interrupts(INT_RB);
/////////////////////////////////////////////////////////////
//v=hız L=yol (2m) t=süre( ms olarak) s=sabit(yol/360)
//v=L/t v=(2m*360)/t (sonuç km/h cinsinden çıkması için 1saat=3600sn 360 olarak sadeleştirildi.
//s(sabit)=L*360 ise v=s/t
/////////////////////////////////////////////////////////////
v=s/t;
hiz_hesaplandi = 1;
}
if (hiz_hesaplandi&&!mod_hesap_tmm)
{
/////////////////////////////////////////////////////////////////
//digit_100= (v-vmod100)/100 yada digit_100= (v/10)mod10
//digit_10= (vmod100-((vmod100)mod10)/10
//digit_1= vmod10(vmod100)
/////////////////////////////////////////////////////////////////
//digit_100= (v/10)%10;
digit_100= (v-(v%100))/100;
digit_10= ((v%100)-((v%100)%10))/10;
digit_1= ((v%100)%10);
port_d_deger = digit_10;
port_d_deger = port_d_deger << 4;
port_d_deger = port_d_deger | digit_1;
mod_hesap_tmm =1; //hesaplama işlemi tamamlandı.
}
if (mod_hesap_tmm)
{
output_d (port_d_deger); //birler-onlar haneleri port d'ye yazıldı.
output_a (digit_100); //yüzler hanesi port c'ye yazıldı.
delay_ms(4000); //3sn boyunca gösterim devam etti.
gosterim_tmm=1;
}
reset_all:
if (gosterim_tmm)
{
t = 0; //Tüm değerler sıfırlanıyor.
v = 0;
output_d (0x00); //display sıfırlandı.
output_a(0x00);
timing_started=0;
time_measured=0;
hiz_hesaplandi=0;
mod_hesap_tmm=0;
port_d_deger=0;
digit_100=0;
digit_10=0;
digit_1=0;
output_d (port_d_deger); //birler-onlar haneleri port d'ye yazıldı.
output_a (digit_100); //yüzler hanesi port c'ye yazıldı.
enable_interrupts(INT_RB); // INT_EXT kesmesini aktif yapar
enable_interrupts(GLOBAL); // Aktif edilen kesmelere izin ver
gosterim_tmm=0;
}
}
}