avatar_Celal Kızılırmak

HC-SR04

Başlatan Celal Kızılırmak, 17 Nisan 2020, 23:09:01

Celal Kızılırmak

Ustalarım bir konuda yardımınıza ihtiyacım var. Hc-sr04 ultrasonik mesafe sönsörü ile bir proje yapacağım ama araştırmama rağmen pic basic ile yazılmış uygulama bulamadım acaba yardımcı olurmusunuz.Sadece yabancı bir siteden bulduğum kodla deneme yaptım proteusta çalışıyor ama gerçekte bir türlü çalıştıramadım.Devre ve kodları paylaşıyorum yardımcı olursanız çok memnun olurum.iyi çalışmlar

NOT:İşlemci 16f628a


@ __config  _WDT_OFF & _MCLRE_OFF & _LVP_OFF & _CP_OFF & _INTRC_OSC_NOCLKOUT

DEFINE LCD_DREG		PORTB	
DEFINE LCD_DBIT			0		
DEFINE LCD_EREG		PORTB	
DEFINE LCD_EBIT  		4					
DEFINE LCD_RSREG	PORTB	
DEFINE LCD_RSBIT		5				
DEFINE LCD_BITS			4		
DEFINE LCD_LINES                2



DEFINE OSC 4
W var word
R VAR WORD
A VAR WORD

TR VAR PORTA.0
EC VAR PORTA.1
TRISA=%00000110
TRISB=%00000000
PORTB=0
PORTA=0

W=0
lcdout $FE,1 
PAUSE 50               
lcdout $FE,1 
LCDOUT $FE,$80,"CELAL" 
LCDOUT $FE,$C0,"KIZILIRMAK"


BASLA:
IF PORTA.2=1 THEN
GOSUB OLC
GOSUB GOSTER
ENDIF 
LOW TR
GOTO BASLA

OLC:

HIGH TR
PAUSEUS 10
LOW TR
PULSIN EC,1,W
R=W/58
RETURN

GOSTER:
lcdout $FE,1 
PAUSE 50              
lcdout $FE,1 
LCDOUT $FE,$80,"MESAFE"
LCDOUT $FE,$C0,#R,  " CM"
PAUSE 1000
RETURN

END


ete

Aslında çok basit bir alet trigger ucunu belirli bir süre HIGH yapıyorsun ama bu süre en az 15us olmalı sen 10us yapmışsın. Belki çalışır ama süreyi 15us yapmak daha uygun olacak.
Alet belirli süre bir ses sinyali yolluyor ve karşıdan yansıyan sinyalin süresini ölçerek mesafeyi hesaplıyorsun. Bütün olay budur. Program da ufak tefek kusurlar var aşağıda sıralıyorum.
1. Açılış gecikmesini 50ms yerine 250 ms yap.
lcdout $FE,1 
PAUSE 250 

2. İsmini yazdırdıktan sonra en az bir 500 ms gecikme koy ki ismin ekranda görülebilsin yoksa anında kaybolacaktır.
LCDOUT $FE,$80,"CELAL" 
LCDOUT $FE,$C0,"KIZILIRMAK"
pause 500

3.Lüzumsuz satırları çıkar. Tuş kontrolünden sonra LOW TR diye bir komut var. Zaten tetik sinyali verildikten sonra TR LOW a çekiliyor tekrardan bir kez daha çekmek gereksiz.

4. Trigger sinyalini 10us değil en azından 15us ye ver.
HIGH TR
    PAUSEUS 15
    LOW TR

5. Gösterme kısmındaki lüzumsuz satırları çıkart aşağıdaki gibi olsun.
GOSTER:          
        lcdout $FE,1 
        LCDOUT $FE,$80,"MESAFE"
        LCDOUT $FE,$C0,#R,  " CM"
        PAUSE 1000
        RETURN

Hepsi bu kadar. Şayet hex dosyasını işlemciye doğru şekilde yükleyebiliyorsan bu programın kesinlikle çalışması gerekir. Çalışmıyor ise işlemcini değiştir yada devreni iyice kontrol et bir bağlantı hatası yada bir besleme hatası yapmışsındır.

Ete

Celal Kızılırmak

ETE hocam verdiğiz bilgiler için çok teşekkür ederim sinyali 15us yapınca çalışır deneme yaptığımda tekrardan yazarım .teşekkürler

Celal Kızılırmak

ETE hocam verdiğiniz bilgiler doğrultusunda programı yeniden güncelledim.Ama malesef çalışmadı.herşey stabil bağlantılarda sorun yok hex dosyasını sorunsuzca yüklüyorum.işlemciyi değiştirdim. Sensörü değiştirdim ama sonuç olumsuz neden kaynaklanabilir başka bir öneriniz varmı.

İlyas KAYA

Programın başına;
cmcon=7

Ekleyip denermisin.
Göz odur ki dağ ardını görsün,
Akıl odur ki başa geleceği bilsin.!

Dtmf

Pic i (16f628a) programda belirtmemissin hani.belki ondandir

ete

İlyas'ında belirttiği gibi tek eksik CMCON=7 komutu. Heleki PORTA nın ilk bitlerini giriş çıkış olarak kullanıyorsan program büyük ihtimalle çalışmayacaktır.
Bu komutu ekleyince düzeleceğini düşünüyorum.

Ete

Celal Kızılırmak

Verdiğiniz bilgiler için teşekkür ederim denedikten sonra tekrardan buraya yazarım teşekkürler iyi çalışmalar

Celal Kızılırmak

Alıntı yapılan: Dtmf - 20 Nisan 2020, 08:47:35Pic i (16f628a) programda belirtmemissin hani.belki ondandir


İşlemci tanımlı onda sıkıntı yok.

Celal Kızılırmak

Ustalarım bilginize emeğinize sağlık cmcon=7 komutundan sonra çalıştı.Tekrardan teşekkürler yalnız bir sorum daha olacaktı (bazen çokmu şey istiyorum acaba) yalnız ölçüm yapıyor fakat hep 10 ve katlarını ölçüyor mesela 15 cm i 10 cm olarak ölçüyor vs  acaba bunun için bir öneriniz varmı ben cm cm ölçmesini istiyorm.

ete

Bu konudaki sorun PULSIN komutunun özelliğinden geliyor. PULSIN komutu 4 Mhz OSC frekansında yaptığı ölçümleri 10'un katları şeklinde verir. Örnek vermek gerekir ise,
20 ms lik süreyi 20000us olarak ölçer ama sana vereceği süre bilgisi 20.000 değil 20.00 dir. Sende bunu direk 58 e bölersen ki programında öyle yapıyorsun ölçülen mesafeyi 10 un katları şeklinde hesaplarsın.
Başka bir örnek daha vereyim. Bu sensör maksimum 400 cm mesafeyi doğru ölçebiliyor. Senim formülüne bakacak olursak R=W/58 , de W ölçülen süre olmaktadır. Bunu çekersek formülden W=R*58 olarak bulunur. Burada R=400 cm yerine koyarsak W=400x58=23.200 us olarak hesaplanır. Bu mesafeyi ölçerken PULSIN komutu W=2320 değerini sana verecektir.
Sen 2320 / 58 =40 cm olarak hesap yapmış olursun.
Şimdi gelelim sorunun düzeltilmesine. Pulsin komutundan sonra,
W=W*10  komutunu eklersen sürenin doğru değerini elde edersin. Ardından R=23200/58=400 cm olarak doğru değeri hesaplamış olursun.

Ete


Celal Kızılırmak

Ete hocam sistemim çalıştı emeğine bilgine sağlık,  bizleri kırmayıp bilgilendiriyorsun ayrıca diğer hocalarıma ustalarımada ayrı ayrı teşekkür ediyorm.Çok çok teşekkür ederim.

Powered by EzPortal