valla süper olur teşekkür ediyorum ben de bu tür bişey yapıcam sanırımYı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.
kardeş çok teşekkür ediyorum ben bunu bi uygulayayımBuldum 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 ?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;
}
}
}
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.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ı.
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?