Ultrasonik Sinyali Algılatamıyorum?

Abicim tamamen mantık hatası yapıyorsun, ondan olmuyor. Vericiyi tetikliyorsun ve eko bekliyorsun. ekoyu alamadığını farzet, senin kod while döndüsünde dönüp duruyor, sürekli zamanı hesaplıyor. Bu arada hiç vericiden yeni bir sinyal göndermiyorsun. Senin sinyal eridi gitti havada, sen hala while döngüsünden çıkamadın.

while (1) ile yapmayacaksın. While(k) ile yap. Timer1 interrupt rutinin de olsun. Her interrupt oluştuğunda yani timer1 overflow olduğunda ki bu 104ms sürede overflow olacak k=0 yap. Böylece while döngüsünden çıksın ve yeniden vericiyi çalıştırsın. Vericiyi çalıştırınca k=1 yap ve set_timer1(0) yap.

Ayrıca 58 değil 38 e bölmen lazım.. Hadi bi gayret, kafayı toparla...
 
Hocam ilk olarak int k; diye değişken tanımladım.sonra timer1 kesme oluşması için timer1 e yazılan değeri hesapladım ve 536 buldum.bunu kesmeye yazdım.

#int_timer1
void timer1_kesme()
{
k=0;
set_timer1(536);


}

yaptım while(k) yaptım.

Benim anlamadığım yer vericiyi şimdi nasıl çalıştıracağız k=1 ve set_timer1(0) nerede nasıl olacak.
biraz daha açıklar mısınız?
 
int k;
void TIMER1_isr(void)
{
k=0;
}

void main()
{

setup_psp(PSP_DISABLED);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_ccp1(CCP_CAPTURE_DIV_4);
setup_CCP1(CCP_CAPTURE_RE);
setup_CCP2(CCP_PWM);
setup_timer_2(T2_DIV_BY_16,7,1);
set_pwm2_duty(7);


set_tris_a(0xFF);
set_tris_b(0x00);
set_tris_c(0x04); // RC2 giriş RC1 çıkış
lcd_init();
printf(LCD_PUTC, "\f Sonar Test");
delay_ms(1000);

enable_interrupts(GLOBAL);

while(1)
{
output_high(trig);
delay_us(250);
output_low(trig); // 250us suresince 40khz gönder.

enable_interrupts(INT_TIMER1);
set_timer1(0); // Timer başlasın
k=1;



while(!input(ECHO) && k); // Echo pini 1 volt olmadıysa ve timer overflow olmadıysa burda bekle

time=get_timer1(); // Hemen timeri okuyalım, nolur nolmaz.

disable_interrupts(INT_TIMER1); // Birşey oldu, interruptları durdur.

if (k==0) {
printf(LCD_PUTC, "\fSINYAL BULUNAMADI"); // overflow olmuş, ekoyu yakalayamadık.
goto son; // Hesap yapmaya gerek yok, yeni puls göndermek lazım.
}

// Echo gelmiş, o zaman hesap yapalım.

distance=time/38; // Mesafe hesapla cm olarak

printf(LCD_PUTC, "\fTime : %Lu \nDistance : %Lu",time,distance);

son:;

delay_ms(200);

}


}
 
Hocam kodlar için teşekkür ederim.Fakat devreyi çalıştırdığımda time değeri 2,7,8,12,13 değerlerini alıyor .simülasyonda da bu değerler görünüyor.mesafeyi ölçemedim.
devreyi tekrar kurup sonuç almaya çalışacağım.


 
Bunun simulasyonunu nasıl yapiyorsun sorması ayıp. ultrasonic verici alıcı mesafe tanımlaabiliyor musun. En azında zaman farkı koyman lazım ki mesafe cıksın. Simulasyon neyin mesafesini gosterecek
 
Hocam simülasyon derken isis de vericinin old. yere buzzer bağladım frekansmetre de bağladım. başlattığımda lcd de gerçekde kurduğum değerler gibi değerler orada da çıkıyor.onu demek istedim tabi ki mesafe göstermiyor sadece time değerlerinin belli değerler aldığını bunun gerçek devrede de aynı değerler aldığını mesafeninin de hep 0 olduğunu söylemek istedim.
 
Benim yazdığım kodla simulasyonda ekrana sinyal bulunamadı gelmesi lazım. Baska bisey nasıl gelebilir ki.
 
output_high(trig);
delay_us(250);
output_low(trig); // 250us suresince 40khz gönder.

delay_us(50); // ARAYA BUNU EKLE BAKALIM NOOLACAK

enable_interrupts(INT_TIMER1);
set_timer1(0); // Timer başlasın
k=1;
 
Sinyal bulunamadı yazısı çıkıyor.Devrem delikli plaket ve bread board da olduğu için hatalar olabilir belki .bunun için baskı devre çıkaracağım.Çıkardığımda çalışmasını denerim ve size bildiririm hocam.
 
verici transduseri büyük ihtimal transistorle sürmek gerekiyor. İyi bir ses çıkmadığı için muhtemelen yansıma yapamıyor. Normalde sürekli olarak 40khzi uygularsan kulağını dayadığında biraz ses duyman lazım. Hatta transduser bacaklarını ellediğinde daha da net duyulabilir. Hiç duyamıyorsan yeterince güçlü süremiyorsun demektir.

bak adam nasıl surmuş.
 

Forum istatistikleri

Konular
127,950
Mesajlar
913,851
Kullanıcılar
449,598
Son üye
kadir12366

Yeni konular

Geri
Üst