2 veya daha üstü ulltrasonic mesafe sensörü için timer ayarları

Başlatan murtiaxi, 24 Nisan 2014, 15:24:34

murtiaxi

iyi akşamlar abilerim ablalarım.benim bir sorunum var 1 tane ultrasonic sensor için timer1 i ayarladığımda sistem sorunsuz çalışıyor fakat,2 veya 3 üstü sensörler için timer0 ve timer 2 de sıkıntım oluyor çünkü bunlar 255 e kadar sayabiliyor ama timer 1 65332 kadar sayabildiği için bu sensörlerden gerekli mesafeyi tam olarak alamıyorum.yani söyle anlatayım kısa mesafe icin 255 e kadar gelmeden kendini sıfırlayıp mesafeyi veriyor ama uzun mesafe için 255 i geçtiği için gene kendini sıfırlıyor yani ben 1-19 cm arası uzunluk alabiliyorum en fazla.bu konuda bilgisi olan kodlarımda nerede değişiklik yapabiliceğimi söyleyebilirlermi

saygılar

#include <16F877A.h>
#fuses XT,NOLVP,NOWDT,NOBROWNOUT
#use delay(Crystal=8MHZ)
#define gucled pin_a1
#define tetikpin pin_d0
#define ekopin pin_d1
#define tetikpin2 pin_d2
#define ekopin2 pin_d3
#define LCD_ENABLE_PIN  PIN_B2  //lcd nin aç kapa pini                              
#define LCD_RS_PIN      PIN_B0  //lcdyi okuma pini            
#define LCD_RW_PIN      PIN_B1  //lcdye yazma pini              
#define LCD_DATA4       PIN_B4  //data pinleri                               
#define LCD_DATA5       PIN_B5  //data pinleri  
#define LCD_DATA6       PIN_B6  //data pinleri                                    
#define LCD_DATA7       PIN_B7  //data pinleri  
#include <lcd.c>
int16 mesafe,zaman,mesafe2,zaman2;
void solsensor() {
output_high(tetikpin); // trig bacağı
delay_us(20); // 20us high yapılarak
output_low(tetikpin); // tetiklenmiş oldu
while(!input(ekopin)) // sinyal gönderilene kadar echo pini 0 olur o yüzden bekliyoruz
{}
set_timer1(0);
while(input(ekopin)) // echo pini yeniden 0 olana kadar bekliyoruz
{}
zaman=get_timer1();
mesafe=zaman*4/58;

delay_ms(1000);
}
void sagsensor() {
output_high(tetikpin2); // trig bacağı
delay_us(20); // 20us high yapılarak
output_low(tetikpin2); // tetiklenmiş oldu
while(!input(ekopin2)) // sinyal gönderilene kadar echo pini 0 olur o yüzden bekliyoruz
{}
set_timer0(0);
while(input(ekopin2)) // echo pini yeniden 0 olana kadar bekliyoruz
{}
zaman2=get_timer0();
mesafe2=zaman2*4/58;
lcd_gotoxy(1,2);

delay_ms(1000);
}
void main(void) {
  set_tris_a(0x0F);
  set_tris_b(0x00);
  output_b(0x00);
  output_a(0x00);
  lcd_init();
  lcd_gotoxy(1,1);
  delay_ms(1000);
  setup_timer_1(T1_INTERNAL|T1_DIV_BY_8); 
  setup_timer_0(RTCC_INTERNAL|RTCC_DIV_4|RTCC_8_bit);   
printf(LCD_PUTC, "\f Baslatiliyor."); //lcdye baslatılıyor yaz 500 ms aralıklarla
delay_ms(500); //500 ms bekleme
printf(LCD_PUTC, "\f Baslatiliyor.."); //lcdye baslatılıyor yaz 500 ms aralıklarla
delay_ms(500); //500 ms bekleme
printf(LCD_PUTC, "\f Baslatiliyor..."); //lcdye baslatılıyor yaz 500 ms aralıklarla
delay_ms(500); //500 ms bekleme
  output_high(gucled);
while(true) {
sagsensor();
solsensor();
lcd_gotoxy(1,1);
printf(LCD_PUTC, "\f S1:%LuM1=%Lu",zaman,mesafe);//zaman ve mesafe ekrana yazdırılıyor
lcd_gotoxy(1,2);
printf(LCD_PUTC, "S2:%LuM2=%Lu",zaman2,mesafe2);//zaman ve mesafe ekrana yazdırılıyor
}
}

ferit06

Tüm sensörlerden aynı anda bilgi almıyorsun dolayısı ile tüm sensörler için TIMER1'i kullanabilirsin. Ama diğer TIMER leri de kullanacağım dersen TIMER taşımaları ile çalışan interrupt kullanabilirsin.

murtiaxi

tmm diğer timerleride kullanabiliyorum.esas olan timer 0 255 e kadar sayıyor.bana 65332 lazım.bunu nasıl fix edebilirim.yada tek timerden nasıl bütün devreyi kesmeye uğratabilirim?