Park Yeri Ölçme Projesi TIMER0 Sorunu

Başlatan sanvenganza, 05 Aralık 2014, 13:41:37

sanvenganza

Merhaba

Arkadaşlar yazım biraz uzun olacak projeyi tam olarak anlamanızı sağlayıp bana daha kolay yadım edebilmeniz açısından.Üzerinde çalıştığım konu iki araç arasındaki park mesafesini ultrasonic sensör yardımı ile ölçmek. Şu şekilde düşünerek yazdım bu kodu elimdeki araca 1 adet hc-sr04 taktım ve motora pwm vererek iki aracın yanından sn'de 4.57 cm lik sabit hız ile geçmekte.Aracı ilk arabanın yanına paralel olarak koyarak işleme başlıyorum sensör araç hareket ederken ilk olarak küçük değerler ölçüyor. Park edilecek boşluğun yanından geçerken büyük değerler okumaya başlıyor. Büyük değer olarak ben 15cm seçtim. 15 cm yi ilk okuduğu zaman TIMER0 ı başlattım. TIMER0 da sayaç değişkeni 0.065536 sn'de 1 artmakta. Sonra benim aracım park yerini geçip ikinci aracın yanına geldiğinde yine 15'cm den küçük değer okuduğu anda TIMER0 ı durdurdum ve sayac değişkeninden aldığım değerle TIMER0'a gitme süresini(0.065536sn) çarparak kaç sn 15'cm den büyük değer ölçtüğünü buldum.Bulduğum zaman ile aracın hızını çarparak X=V*T den park edilecek konumun uzunluğunu ölçmek istedim fakat TIMER0 dan veri alamıyorum parkyeri hep 0 olarak çıkıyor.Kullandığım TIMER0  şeklini buton kullanarak denedim butona basma süresini kaç sn basıldığını sorunsuz şekilde ölçüyordu ama burada işe yaramadı.  Sorunun nerede olduğunu bulamadım yardımlarınızı bekliyorum.

kodları ve isis şemasını ekledim. Ben hc-sr04 u isis üzerine ekledim. Sizdede çalışması için kullandığım sensörün LIBRARY dosyasını ve hc-sr04 ün içine atılacak .HEX uzantısınıda ekledim.

http://dosya.co/7f6539393f46d77f/mesafe.rar

OLAY BU ŞEKİLDE GERÇEKLEŞMEKTE






#FUSES NOWDT, XT, NOPUT, PROTECT, NOBROWNOUT, NOLVP, NOCPD, NOWRT, NODEBUG   
#use delay(clock=4000000)   
#define use_portb_lcd true 
#include <lcd.c> 
#define trig pin_A0     
#define echo pin_A1   
#use fast_io(c)

int i=40;        // pwm sınyalı duty buyuklugu
int16 mesafe=0 ; //  park edilecek mesafe
int16 sayac=0 ;  // timer 0 sayacı
int16 zaman;     // tımer 1 den okunan değer
float sure=0;    // kısa aalıkta gecen sure
float hiz=4.57;  // arabanın hızı
float parkyeri=0; // arabanın park edecegı yerın uzunlugu

#int_timer0
void timer0_kesme ()
{
set_timer0(0);
sayac++;
}

void olcum() //  mesafe  ölçülüyor ve mesafe değişkeni yeni değer atanıyor
{
output_high(trig);           
delay_us(15);             
output_low(trig);   
while(!input(ECHO))           
{}   
set_timer1(0);             
while(input(ECHO))           
{}
zaman=get_timer1();           
mesafe=(zaman*10)/(58) ;       
}
void main()   

set_tris_c(0x00);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);       //tımer1 ayarı
setup_timer_0(RTCC_INTERNAL | RTCC_DIV_256);  //tımer0 ayarı
setup_timer_2(T2_DIV_BY_16,170,1);  //tımer2 ayarı
enable_interrupts(GLOBAL);
set_timer0(0);
lcd_init();                // LCD temizle 
delay_ms(50); 
printf(LCD_PUTC, "\f DCI");// LCD DCI yazdır   
delay_ms(2000);   
while(1)
{
setup_ccp1(CCP_PWM);
set_pwm1_duty(i);  // araba harekete basladı

olcum();         // mesafe okundu

lcd_gotoxy(1,1);                         //  ekrana yazdırıldı
printf(lcd_putc, "\fMesafe :%Lu  cm",mesafe);
delay_ms(10);
if(mesafe>=15)     // park edilecek yere geçildi timer 0 başlatıldı     
{
enable_interrupts(INT_timer0);   //Tımer 0 başlatıldı
while(1)
{           
olcum(); // mesafe ölçüldü
lcd_gotoxy(1,1);                                //measafe ölçülüp ekrana yazdırıldı
printf(lcd_putc, "\fMesafe : %Lu cm",mesafe);
delay_ms(10);
if(mesafe<15)
{
disable_interrupts(INT_timer0); // tımer 0 durduruldu
delay_ms(10);     
sure=sayac*0.065536;  // uzun ölçümlerde geçirilen süre hesaplandı
parkyeri=sure*hiz;    // X=V*T denklemınden park yeri hesaplandı
delay_ms(200);
i=0;
set_pwm1_duty(i);    //pwm durduruldu
while(1)
{
lcd_gotoxy(1,1);  //park yeri  ekrana yazdırıldı
printf(lcd_putc, "\fPark yeri : %f cm",parkyeri);
delay_ms(10);
}
}
}
}
}
}




burctankal

sure=sayac*0.065536;

Emin olmamakla birlikte, bu ifadenin yanlış olabileceğini düşünüyorum. Belki de sure=sayac*65536/1000000; gibi bir ifade çalışabilir. Ama en iyisi Ete Hoca'nın cevabını beklemek sanırım.

sanvenganza

burctankal

dediğin gibi denedim ama sonuç aynı.
Suan değişkenleri ekrana yazdırarak hangi değişkeni hesaplamadıgını bulmaya çalışıyorum. Sayac değişkeninden şüpheleniyordum ben ama düzgün bir şekilde artıyor senin de dediğin gibi süre değişkenini hesaplamıyor hep 0 olarak hesaplıyor.

burctankal

 sure=sayac*0.065536;  // uzun ölçümlerde geçirilen süre hesaplandı
parkyeri=sure*hiz;

Dediğiniz gibi lcd kullandığınız için değişkenleri takip etmek sorunu çözecektir. Lcd'ye direk "süre" değişkeni yazdırdığınızda 0 değerinin gözükmesinin tek ihtimali vardır. Çarpanlardan birisinin 0 olması. Bir de hiç ondalık değer kullanmadan değişkenlerinizi int ile tanımlayıp ( tabi 0.065536 yerine denemelik 2 gibi bir sayı kullanabilirisiniz) deneseniz. Ondalığa neden taktım bilmiyorum ama bi kaç kere başıma epey sorun açmıştı bu ondalıklar)

sanvenganza

burctankal

Söylediğin gibi float ları int 16 olarak tanımlayıp 3-5 gibi rastgele değerler verdim  şuan değerler çıkıyor ekranda karşıma. Ama çok mantıksız değil mi ondalık sayılarda cvp vermemesi ve ben o kullandığım değerleri kullanmak zorundayım nasıl bir çözüm bulabiliriz buna

burctankal

*/ operatörünü araştırdınız mı. Basic'te Ondalıklarla çalışamayacağınız için bu operatör ile ondalıklardan kurtulmanız mümkün diye biliyorum.

sanvenganza

O konu hakkında bilgim yok ben bu şekilde bir sorunla ilk defa karşılaşıyorum yani diğer yaptığım uygulamalarda da float değişkeni kullanmıştım hiç sorun vermemişti . Ama dediğini araştırcam.

burctankal

Çözümünüzü paylaşırsanız sevinirim.

burctankal


sanvenganza

Sorunun çözümünü tam olarak düzelirse düzelmiş halini yayınlarım sonradan aynı problemi yaşayanlar olursa onlara da çözüm olsun diyerek. Cvp verdiğin için teşekkür ederim bu arada. Sorunun oradan kaynaklanacağı hiç aklıma gelmezdi doğrusu. Gönderdiğin konuyu da birazdan okuyup neticeyi söylerim

sanvenganza

burctankal

kardeş sorunu çözdüm ben. Kodlarda ki tek sıkıntı float değişkenini ekrana yazdıramamızdan kaynalanıyormuş. Ekrana yazdırma kısmını şu şekilde yapınca çalıştı 
while(1)
{
printf(lcd_putc, "\fPark:%06.3f cm",park); //park yeri  ekrana yazdırıldı                     
printf(lcd_putc, "\nsure :%05.2f  ",sure);   // SURE EKRANA YAZDIRILDI
delay_ms(1000);
printf(lcd_putc, "\nsayac :%Lu  ",sayac);   // SAYAC EKRANA YAZDIRILDI
delay_ms(1000);
}

burctankal

Genelde kodları parça parça çalıştırınca hatayı bulmak kolaylaşıyor. Bu arada bu projeyi tam olarak nerede kullanacaksın. pwm ile sürülen araç tam olarak nedir. Ticari bir yönü yoksa paylaşabilir misiniz. Merak ettim de :)

sanvenganza

Bu benim bitirme projem. Biterse kendi kendine park eden bir oyuncak araba yapmaya çalışıyorum. Bu kısım ise park edilecek kısmın araç için uygunmu değilmi onun ölçümünü yapmaya çalışıyordum. Şuan pc ortamında çalıştı ben evde küçük bir düzenek oluşturdum o pwm değeri ile ordaki hız değerinde düz şekilde hareket ediyor.Önüne iki tane engel koyup aralarındaki boşluğu düzgün ölçecekmi deniycem birazdan.

burctankal

Oyuncak da olsa bence çok ciddi bir proje. Bittiğinde videolarını izlemek isterim.

Powered by EzPortal