Ultrasonic Sensör İle Mesafe Ölçüm Sorunu

Başlatan Electroman, 07 Mayıs 2013, 00:08:56

Electroman

Merhabalar, HC-SR04 adlı ultrasonik uzaklık sensörü ile mesafe ölçümü yapmak istiyorum.Sensörün çalışma mantığı anladığım kadarıyla trig pininden 10Us'lik bir pals gönderiyoruz ve echo pini sensörden çıkan dalganın gidip dönmesi süresince 1 olarak kalıyor(kullandığım sensörhttp://www.roboweb.net/rw-ml-1265.html ).Kodumda 18F4550'nin TMR1'ini kullanarak geçen süreyi 16 bitlik modda ölçmeyi amaçlıyorum  4Mhz kristal kullanıyorum ve 4/4'den timer frekansını 1/1.000.000'dende timerın bir artışını 1Us olarak hesapladım  portb.rb0'ı trig pinine pulse için portb.rb1'ide input olarak echo pinine bağlıyorum ama bir türlü pratikte düzgün bir ölçüm alamıyorum, uzaklık ve süre değişkenleri sürekli değişimde oluyor ve saçma değerler veriyor.Kodu aşağıda paylaşıyorum sizce programımda göremediğim bir hata mı var yoksa sensörün arızalı olabileceğinden mi şüphelenmeliyim?şimdiden teşekkürler.

Alıntı Yap
sbit LCD_RS at RD2_bit;
sbit LCD_EN at RD3_bit;
sbit LCD_D4 at RD4_bit;
sbit LCD_D5 at RD5_bit;
sbit LCD_D6 at RD6_bit;
sbit LCD_D7 at RD7_bit;

sbit LCD_RS_Direction at TRISD2_bit;
sbit LCD_EN_Direction at TRISD3_bit;
sbit LCD_D4_Direction at TRISD4_bit;
sbit LCD_D5_Direction at TRISD5_bit;
sbit LCD_D6_Direction at TRISD6_bit;
sbit LCD_D7_Direction at TRISD7_bit;

unsigned int sure,uzaklik;
char h[7];
void main() {
ADCON1 |=0x0F;
CMCON |=7;
TRISB=0x02;
PORTB=0x00;
T1CON=0X81;

Lcd_Init();
Delay_Ms(100);
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);

for(;;) {
PORTB=0x01;
Delay_Us(15);
PORTB=0x00;
while(!(PORTB.RB1));
TMR1H=0;
TMR1L=0;
while(PORTB.RB1);
sure = TMR1H;
sure = sure << 8;
sure = sure | TMR1L;
uzaklik=(sure/58);
InttoStr(uzaklik,h);
Lcd_Out(1,9,h);
Lcd_Out(1,1,"cm");
InttoStr(sure,h);
Lcd_Out(2,9,h);
Lcd_Out(2,1,"us");
Delay_Ms(100);
       }
}

Kabil ATICI

Bu dili  anladığımı söyleyemem, ama
burada timer1 nerede durduruluyor...

timer1 durdurulmuyorsa
sure = TMR1H;
sure = sure << 8;
sure = sure | TMR1L;

komut süresince saymaya devam eder... Kimbilir ne değere gelir...
ambar7

M_B

Alıntı yapılan: ambar7 - 07 Mayıs 2013, 01:02:16
Bu dili  anladığımı söyleyemem, ama
burada timer1 nerede durduruluyor...

timer1 durdurulmuyorsa
sure = TMR1H;
sure = sure << 8;
sure = sure | TMR1L;

komut süresince saymaya devam eder... Kimbilir ne değere gelir...


Timer1 kurulum esnasında şunların da olması lazım.
INTCON = 0xC0;       // GIE, PEIE bitleri set edildi
TMR1IE_bit = 1;      // TMRO kesmesi aktif edildi

Timer1 durdurma
TMR1IF_bit = 0;    // TMR1IF sıfırlandı
İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

serhat1990

T1CON=0X81;
Burada T1CON değeri 0x01 olması gerekir .

İyi çalışmalar dilerim ...

Electroman

#4
Alıntı yapılan: M_B - 07 Mayıs 2013, 08:14:06

Timer1 kurulum esnasında şunların da olması lazım.
INTCON = 0xC0;       // GIE, PEIE bitleri set edildi
TMR1IE_bit = 1;      // TMRO kesmesi aktif edildi

Timer1 durdurma
TMR1IF_bit = 0;    // TMR1IF sıfırlandı

Hocam bunlar tmr1 kesmesini kullanmak için değil mi?Ben kesme kullanmayacağım sadece tmr1'in aktif olup saymasını istiyorum yinede INTCON ayarı yapmam gerekiyor mu?

mesaj birleştirme:: 07 Mayıs 2013, 13:38:56

Alıntı yapılan: serhat1990 - 07 Mayıs 2013, 10:19:22
T1CON=0X81;
Burada T1CON değeri 0x01 olması gerekir .

İyi çalışmalar dilerim ...
hocam 18F4550'de T1CON'un 7. biti 16-8 bit seçme biti burada 255'den yüksek değerlerede ihtiyaç olabileceği için TMR1'i 16 bit olarak kullanmak istedim o yüzden o şekilde yaptım ama yanlış mu düşünüyorum?

serhat1990

Pardon Hocam, ben 18f4550 için olduğunu gözümden kaçırmışım önümde başka bir dahasheet açık onda da 7. ve 6.bit TMR1CS bitleri . Ben karıştırdım kusuruma bakmayın ...

Hocam timer saydırma işleminde timer'ı başlatsanız bence daha sağlıklı olur . Yani sensör lojik -1 verdiği andan itibaren TMR1L , TMR1H değerlerini ayarladıktan sonra TMR1ON bitini 1 yapmanız , sensör lojik - 0 verdiği anda timer'ı durdurmanız sonrasında değerleri okumanız işleminizin daha sağlıklı olmasını sağlar diye düşünüyorum . Çünkü timer'dan okuma yaparken bile kodlarınızda TMRON biti sürekli aktif ..

İyi çalışmalar dilerim...

Electroman

#6
Alıntı yapılan: serhat1990 - 07 Mayıs 2013, 14:00:33
Pardon Hocam, ben 18f4550 için olduğunu gözümden kaçırmışım önümde başka bir dahasheet açık onda da 7. ve 6.bit TMR1CS bitleri . Ben karıştırdım kusuruma bakmayın ...

Hocam timer saydırma işleminde timer'ı başlatsanız bence daha sağlıklı olur . Yani sensör lojik -1 verdiği andan itibaren TMR1L , TMR1H değerlerini ayarladıktan sonra TMR1ON bitini 1 yapmanız , sensör lojik - 0 verdiği anda timer'ı durdurmanız sonrasında değerleri okumanız işleminizin daha sağlıklı olmasını sağlar diye düşünüyorum . Çünkü timer'dan okuma yaparken bile kodlarınızda TMRON biti sürekli aktif ..

İyi çalışmalar dilerim...
ne kusuru hocam yardımcı olmak istemişsiniz,düşününce dediğiniz gibi saydırmak daha mantıklı pek dikkat etmemiştim onlara ama dediğiniz gibi timer sürekli sayıyor ambar7 arkadaşımızda bunu anlatmış sanırım tam olarak algılayamamıştım sorunum bundanda kaynaklanıyor olabilir teşekkürler denemelere başlıyorum  :)

serhat1990

Ne demek Hocam , umarım işinize yarar . İyi çalışmalar dilerim :)

Mr.Java

Kanımca Timer yerine CCP Kesmesi daha etkili.Daha sağlıklı sonuçlar alırsınız.

ens_azl

çalışıyor arkadalar güle güle kullanın  pıc16f877a 20mhz  2*16 lcd  c-2 bacagına tus bagladım basılınca ölçmesi için  öyle daha iyi oluyor yoksa saçmalıyor kolay gelsin  millet para ile yapıor bizde bedava öbür tarafa götürmüyoruz parayı 


    sbit LCD_RS at RB2_bit;
      sbit LCD_EN at RB3_bit;
      sbit LCD_D4 at RB4_bit;
      sbit LCD_D5 at RB5_bit;
      sbit LCD_D6 at RB6_bit;
      sbit LCD_D7 at RB7_bit;
      sbit LCD_RS_Direction at TRISB2_bit;
      sbit LCD_EN_Direction at TRISB3_bit;
      sbit LCD_D4_Direction at TRISB4_bit;
      sbit LCD_D5_Direction at TRISB5_bit;
      sbit LCD_D6_Direction at TRISB6_bit;
      sbit LCD_D7_Direction at TRISB7_bit;

unsigned int distance,time;
unsigned int yuzler,onlar,birler;

sbit trig at RC0_bit;
sbit ECHO at RC1_bit;
sbit tus  at RC2_bit;

void main() {

   TRISC=0X06;
   TRISB=0X00;  //I/O Configuration
   T1CON=0b10000001;   //TIMER1 Configuration
   PORTC=0;
   PORTB=0;

       Lcd_Init();
       Lcd_Cmd(_LCD_CURSOR_OFF);
       Lcd_Cmd(_Lcd_Clear);
       Lcd_Out(1, 1, "Uzaklik:");
       Lcd_Out(1,15,"cm");
       Lcd_Out(2, 1,"Sure:");
       Lcd_Out(2,15,"us");
       delay_ms(100);

while(1){

     if(tus){

      delay_ms(100);
      trig=1;
      delay_us(15);
      trig=0;

       while(!(ECHO) ){
          TMR1L = 0;
          TMR1H = 0;
       }

       while(ECHO){
          time = TMR1H;
          time = time << 8;
          time = time | TMR1L;
       }

         distance=(time*0.0034);//2*(34000cm/20000000us)
         yuzler=distance/100;
         onlar=(distance/10)%10;
         birler=distance%10;
         yuzler+=48;
         onlar+=48;
         birler+=48;

         Lcd_Chr(1,9,yuzler);
         Lcd_Chr(1,10,onlar);
         Lcd_Chr(1,11, birler);

delay_ms(2000);
       }
  }
}

Mr.Java

TEşekkürler program için fakat iyi bir programcı kodlarda sürekli yorum satırı bırakır.Emin ol belki de 1 ay sonra yorum satırı bırakmadığın için yaptığın hesaplamayı ve kullandığın fonksyon nedenlerini unutabilirsin.Bu benim tavsiyem.Bu arada ;

  while(ECHO){
          time = TMR1H;
          time = time << 8;
          time = time | TMR1L;
       }

ne yapıyor ben çözemedim örneğin..

Kolay gelsin,iyi forumlar..

sadogan

16 bit değişkene 8 bit timerH ve timerL atarak 16 bit yapmış.

Mr.Java

Peki neden önce kaydırıp sonra topluyoruz ? Direk toplayarak eklesem değişkene ?

serhat1990

Düşük değerlikli 8 bit ile yüksek değerlikli 8 bit direk olarak toplanmazda ondan . Matematikte nasıl elma ile armut ' u direk toplamıyorsan buda böyle ... Şöyle daha basit anlarsın onlar basamağındaki sayı ile birler basamağındaki sayının değeri birmidir ? Bununla alakalı .

İyi çalışmalar dilerim .

Mr.Java

Örnek biraz ağır kaçtı ama elma armut meselesi.Anladım teşekkürler yorum için.