Time measurement with PIC

eilhan0

Üye
Katılım
29 Şub 2016
Mesajlar
54
Puanları
1
Yaş
31
arkadaşlar biz şimdi bir proje yapacaz okulda ve herkes bir iş bölümüne sahip hepsi birleşince osiloskop gibi bir cihaz çıkacak ortaya,bana düşen kısım da ""TİME MEASUREMENT" ve bunun yazılımını yapıcam nasıl yapacağım ve daha önce hiç uğraşmadığım için tam nedir onuda bilmiyorum.Kullanacağımız pıc 16F883 kullanıcaz.yardımcı olabilir misiniz?
 
Yıllar önce bir proje yapmıştım buna benzer. İki sensörü kesme girişi olarak pic'e girdim. Birinci sensör tetiklendiğinde zaman saymayı başlatıp 2. sensör tetiklendiğinde durduruyordum ve bunu bir objenin hızını ölçmek için kullanıyordum. Tek fark 887A kullandım işlemci olarak. Eski çalışmalarımı bir karıştırayım. Bulursam detay paylaşırım.
 
Yıllar önce bir proje yapmıştım buna benzer. İki sensörü kesme girişi olarak pic'e girdim. Birinci sensör tetiklendiğinde zaman saymayı başlatıp 2. sensör tetiklendiğinde durduruyordum ve bunu bir objenin hızını ölçmek için kullanıyordum. Tek fark 887A kullandım işlemci olarak. Eski çalışmalarımı bir karıştırayım. Bulursam detay paylaşırım.
valla süper olur teşekkür ediyorum ben de bu tür bişey yapıcam sanırım
 
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;
}
}
}
 
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;
}
}
}
kardeş çok teşekkür ediyorum ben bunu bi uygulayayım
 
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;
}
}
}
Bide birşey daha soruam mplab da yazıyorum ancak failed veriyor sürekli ben başka kodlar deniyorum onlara da hata veriyor acaba sebebi ne olabilir ki ?
 
Pic C compiler'da derledim ben hata vermiyor. Ama zaten bunu örnek olarak kullanabilirsiniz. Birebir sizin projeye uygun olmayabilir. En azından kullanmak istediğiniz controller farklı.
 
Pic C compiler'da derledim ben hata vermiyor. Ama zaten bunu örnek olarak kullanabilirsiniz. Birebir sizin projeye uygun olmayabilir. En azından kullanmak istediğiniz controller farklı.
aynen zaten bana örnek olması için kullanıcam ben MPlab da yazıcam programı hani projeyi onun üstünden giderek yapıyoruz bana kalsa PIC C compiler daha iyi ama bununla da bişeyler yapıcaz teşekkür ediyorum.
 

Forum istatistikleri

Konular
128,128
Mesajlar
915,271
Kullanıcılar
449,845
Son üye
burak_duyar

Yeni konular

Geri
Üst