Ultrasonik Mesafe Ölçümü Acil Yardımınızı Bekliyorum

Başlatan conqueror3, 15 Şubat 2009, 00:35:51

conqueror3

Arkadaşlar benim ultrasonik mesafe ölçümü ile ilgili bir problemim var. Bana yardımcı olacağınızı ümit ediyorum. Devrenin verici ve alıcı kısımlarında bir sorun yok. Sadece programda bir hata olduğunu düşünüyorum. Kesme oluştuğunda ekranda timer değeri gözüküyor fakat timer içindeki sayılar mantıksız oluyor.

Örneğin kesme oluştuğunda ultrasonik sensörün önündeki engeli uzaklaştırıyorum. Timerin içindeki sayıda mantıklı bir şekilde artma olmuyor. Daha düşük bir sayıyı da gösterebiliyor. Bir de timer bazen negatif sayılar gösteriyor -197 gibi fln. Timerin negatif sayı göstermesinin mantığı nedir?

Ayrıca nedense timer 1 16 bitlik olmasına ve 65536 ya kadar saymasına rağmen sayılan sayı 200 ü geçmiyor. 4 5 haneli sayılara hiç ulaşmıyor. Halbuki mesafe uzadıkça artması lazım. Programımda gördüğünüz yanlışlar varsa yardımcı olabilirseniz çok sevinirim.

Özellikle ultrasonik üzerine çalışmış arkadaşların yardımlarını bekliyorum. Şimdiden teşekkür ederim.



#include <16F877A.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4000000)
#define buton pin_B2
#include <lcd.c>

int value,k;

#int_ext                // Alıcı devresinden bir işaret alındığında kesme oluşur.
void ext_kesmesi()
{

value=get_timer1();  // Kesme içerisinde timerın içindeki sayı value
                              //değişkenine atılır.

printf(lcd_putc,"\f Timer= \n %d",value); // value değeri lcd ye yazdırılır.
}

void main()
{
setup_psp(PSP_DISABLED);
setup_spi(SPI_SS_DISABLED);
setup_timer_1(T1_INTERNAL | T1_DIV_BY_8);
setup_timer_2(T2_DISABLED,0,1);
setup_ccp1(CCP_OFF);
setup_CCP2(CCP_OFF);
enable_interrupts(INT_EXT);
enable_interrupts(GLOBAL);

set_tris_d (0x00);
lcd_init();

while(1)
{
if (input(buton))                 // Butona basıldığında,
{
while(input(buton));            // Butondan el çekilene kadar döngüye gir.
set_timer1(0);                    // Butondan el çekildiğinde timer1 i sıfırla
for(k=0; k<4; k++)           // 4 adet 40 kHZ'lik pulse yolla
{
output_high(pin_b1);
delay_us(9);
output_low(pin_b1);
delay_us(1);
}
delay_us(200);                   // 200 mikrosaniye bekle
}
}
}

conqueror3

Bu arada sinyal yollama işini tuşa basınca yapması tamamen benim isteğim yüzündendir. İlk etapta sürekli ölçüm yerine ben düğmeye basınca ölçüm yapmasını istiyorum. Yardımcı olursanız çok sevinirim :)

ferdem

"value" değişkeni 8 bitlik olduğundan 255 ten büyük sayı görememeniz normal. Öncelikle bu değişkenin türünü "int16" veya "long" yapınız(CCS C de ikisi de aynı anlama geliyor, bknz. help). Bu değişkeni lcdye yazarken de işaretsiz görüntülemek için
printf(lcd_putc,"%lu",value);

şeklinde yazınız. (lu: Long unsigned int)
Bu arada
for(k=0; k<4; k++) // 4 adet 40 kHZ'lik pulse yolla
{
output_high(pin_b1);
delay_us(9);
output_low(pin_b1);
delay_us(1);
}

ile 40 kHz den daha büyük bir frekans elde edersiniz.

for(k=0; k<4; k++) // 4 adet 40 kHZ'lik pulse yolla
{
output_high(pin_b1);
delay_us(9);
output_low(pin_b1);
delay_us(6);
}

İkinci verdiğim kod proteusta daha iyi sonuç veriyor.

Yansıma yaklaşık 10 m uzaktaki engelden olursa timer1 in taşacağını unutmayınız.
Not: Forumda ultrasonik mesafe ölçümü ile ilgili başlıklara göz atmanızı tavsiye derim. İyi çalışmalar.

conqueror3

Saolasın ferdem arkadaşım.

Şimdi şöyle bir durum var. Programa kesme falan da ekleyince yeni kodlar falan ekleyince, üretilen pwm in sinyali de değişiyor. O yüzden mantıklı gelmese bile proteus da ki denemem sonucunda 40 kHZ üreten delay süreleri o şekilde oldu bende. Proteus sürümü ile ilgili olabilirmi? Proteusa bu konuda ne kadar güvenebilirim?

Aynı pwm i ccp modülünden set_pwm komutu ile de yaptım ancak pek verim alamadım. Çünkü bu sefer de pwm üretiliyor 4 pulse sonunda kesemiyorum. Set_duty(0) yapırum olmuyor. CCP yi Off yapıyorum yine olmuyor falan neyse. En azından sorumun bir kısmının cevabını aldım. Çok sağolasın.

Daha fazla yardımınızı bekliyorum arkadaşlar :)

necati

[email]entegreterbiyecisi@yahoo.com[/email]

rree

Bu devreyi çalıştıran varmı kaç metreyi ölçüyor.

conqueror3

necati sağolasın ama senin verdiğin örnek kesin çalışıyormu sen denedin mi ?

necati

[email]entegreterbiyecisi@yahoo.com[/email]