Km Göstergesi

Başlatan canakcura, 28 Ocak 2015, 19:26:58

canakcura

Merhabalar,

Bir km saati yapmaya karar verdim. TMR1 sayacına gelen palsler T1CKI pininden sayılıyo. TMR0 sayacı ise her 1 saniyede TMR1 sayacındaki palsleri okuyo. Bu sayede 1 saniyedeki pals sayısını hesaplıyorum buraya kadar sorun yok. Ama bundan sonra km hesabında bi hata oluşuyo mesela hesabıma göre. Bir tam turu 1,43 mt olan tekerlek. 1 saniyede 10 tur atarsa 1,43 x 10=14,3 yani 1 saniyede 14,3 mt saatte ise 51,480 km yapar ama devrede bu 39 km olarak gözüküyor. Bunun nedenini anlayamadım yardımcı olursanız sevinirim dosyalar ektedir

gergy

Alıntı YapCAP=(143)/100 'bir turda gidilen yol 1,43 (Metre cinsinden)

CAP değişkeni byte ve haliyle 143/100=1 olacaktır, yani sizin tahmin ettiğiniz üzere 1,43 olmaz.
Alıntı YapSAAT=(SAYAC*CAP)*3600 'Bir saatte gidilen yol metre cinsinden
KM=SAAT/1000 'Bir saatte gidilen yol km cinsinden

SAYAC değişkeni 10 olursa 36, 11 olursa hesaplar sonucu 39 çıkacaktır. (Aslında 39,6 dır)

proton'da float veya dword değişken ile bu sorun aşılabilir. Picbasic için ise CAP değişkeni kullanmanıza gerek yok.

SAAT=(SAYAC*143)*36 hatta SAAT değişkenini dahi kullanmadan KM=(SAYAC*5148)/1000 yazarak (keza 143 ve 3600 sabit değerlerdir) ve KM değişkenini dword olarak tanımlayarak çözebilirsiniz, tabi ondalık kısım önemli değilse.

ete

Ufak bir fazlalık ve birde hesap hatası buna sebep olmaktadır.
Saat hesabını aşağıdaki şekilde yap. Ayrıca CAP diye bir hesap yapmaya gerek yok.

SAAT=(SAYAC*143)*36 'Bir saatte gidilen yol metre cinsinden
Bu hesabın sonucu 16 bit seviyesini aşacağı için bundan sonraki bölme işlemini 32 bit olarak yap.

KM=DIV32 10 'Bir saatte gidilen yol km cinsinden

Ekran kısmını şöyle yap;

LCDOUT $FE,$80,"KM/H=",DEC3 km/100,",",dec KM//100

Kesme kısmında;
TMR0=0 diye bir komut var buna gerek yok. Zaten TMR0 kesmesi oluştuğu zaman TMR0 sıfırlanmış olacaktır. Fazladan yazdığın bu komut ekstra gecikme yaratmaktadır. Bu komutu sil.

Sonra sonuca bak bakalım.

Ete

canakcura

Ete hocam çok sağolun anlattığınız gibi düzenleyince doğru çalıştı. Peki bunu LCD de değilde 7 segment display de nasıl gösterebiliriz.

ete

Bu soru fazla genel kaçmış. 7 segment display kullanmanın sürme şekillerine göre birden fazla yolu var. Bunlar,
-Direk sürme
- tek 74595 ile sürme
- her displayi bir adet 74595 ile sürme
- max 7129 ile sürme
Belki bir iki tane daha eklemek mümkün. Önce kendine bir sürme şekli belirlemen gerekiyor. Bunuda işlemcindeki pin sayısına bağlı olarak yapman gerek. Direk sürmede tam bir port boş olarak gerekiyor. Ayrıca ortak uç transistörleri için birer uç gerekecek.
Tek 595 yalnızca 3 uç ile sürülebiliyor ayrca transistör uçları gerekecek.
Sürme şekli belirlendikten sonra geriye kafayı çalıştırıp onları sürmeye kalıyor ki buda zor olmasa gerek senin için.

Ete

canakcura

Hocam tek 74595 ile sürmeyi düşündüm fakat displayden önce bir sorum daha olcak, toplam gidilen km ve bir buton ile sıfırlanabilecek km yi nasıl hesaplayabilirim programda ?
aklıma T1CKI pininden gelen palsleri sayarak hesaplamak geldi bu şekilde doğru olurmu eğer olursa bu palslerin toplamını nasıl sayabilirim

ete

İki sayacın olacak birisi Toplam_metre, diğeri Topla_KM. Saniye bazında metre hesabından katedilen yolu önce metre bazında toplaman gerekiyor. Yani her saniye sonunda okuduğun değer üzerinden tur sayısını teker çevresi ile çarparak metre sayacına ekleyeceksin. Sonra bu sayaç değeri 1000 m'ye ulaştığında Toplam_KM sayacını bir artıracak ve Metre sayacınıda sıfırlayacaksın.
Tek_KM şeklinde bir üçüncü değişkeni kullanarak her 1000 m. de bir onuda bir artıracaksın. Gerekirse bunu bir butonla sıfırlayacaksın.
Hepsi bu kadar.
Ete

canakcura

Saniyedeki tur sayısını teker çevresi ile çarptım ama bunu metre sayacına nasıl eklicem

Mucit23

Denizi geçmişsin nehirde boğuluyorsun :)

Dostum teker her bir tur attığında Tekerin çevresi kadar Metre sayacına ekleme yaparsın olur biter. Saniyedeki tur sayısını Çevre ile çarparsan bir saniyede kaç metre yol aldığını bulursun.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

canakcura

Soruyu sorarken utanmadım değil ama kafam durdu işte yeni yeni öğreniyorum. Bu şekilde bişey yaptım ama olmadı nasıl yapmam gerek



DEFINE OSC 4

TRISA=0
PORTA=0
TRISB=0
PORTB=0
TRISC=255
TRISD=0
PORTD=0


OPTION_REG=%00000101
INTCON=%10100000
T1CON=%00000111
ON INTERRUPT GOTO KESME
TMR1H=0:TMR1L=0

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

SAYAC  VAR WORD
A      VAR byte
SAAT   VAR WORD
KM     VAR WORD
TOP_MT VAR WORD
TOP_KM VAR WORD

PAUSE 200
LCDOUT $FE,1

BASLA:
TOP_MT=(SAYAC*143)/100
IF TOP_MT=1000 THEN
TOP_KM=TOP_KM+1
TOP_MT=0
ENDIF

SAAT=(SAYAC*143)*36
KM=DIV32 1000 'Bir saatte gidilen yol km cinsinden


LCDOUT $FE,$80,"KM/H=",DEC3 KM
LCDOUT $FE,$C0,"TOPLAM=",DEC5 TOP_KM



GOTO BASLA

DISABLE
KESME:
A=A+1
IF A=61 THEN
  A=0
  SAYAC.HIGHBYTE=TMR1H
  SAYAC.LOWBYTE=TMR1L

TMR1H=0:TMR1L=0
ENDIF
INTCON.2=0
RESUME
ENABLE

ete

TMR0 ne yapıyor?, saniye sayıyor ve 1 sn dolduğunda gidip TMR1 değerini alıyor. Onu teker çevresi ile çarpıp aracın 1 sn kaç KM gittiğini hesaplıyor. Bu ne demektir? 1 sn de katedilen yol demektir. 10 tur atmış ise 1,43*10=14,3m yol katedilmiş anlamınada geliyor bu. Toplam_metre=Toplam_Metre+14,3 dediğin zaman 1 sn içinde katedilen yolu metre sayacına eklemiş olursun işte.
Tur sayısı sıfır ise hiç yol katedilmiş olmayacağı için eklenecek bir şeyde çıkmayacaktır.
Ekleme satırının hemen altına;
IF Toplam_Metre=999 then
  Toplam_Meter=Toplam_meter-1000
   Toplam_KM=Toplam_KM+1
Endif
şeklinde halledersin.
Toplam_Metre tam 1000 olmayacağı için taşan kısmı yeniden Toplam_Metre değişkeninde tutmamız gerekir.
Bir tur=1,43m. olduğuna göre diyelimki araç 10 tur/sn hızla gidiyor. Bu 1 sn de 10*1,43=14,3 m yol alacaktır. Teker 700 tur attığında 1,43*700=1001 m yol almış olacaktır. Dikkat edersen bu tam 1000 değil 1001 dir.
Toplam_Metre=ToplamMeter-1000 dersek yeni Toplam_metre değeri=1 olacaktır. böylece bu farklar eklene eklene giderek genel toplama eklenmiş olmalıdır.

Umarım anlaşılmıştır artık.

Ete

canakcura

Hocam bu şekilde yaptım ama km sayacı artmıyor

BASLA: 

B=(SAYAC*143)/100 'bir saniyedeki metre sayısı
TOP_MT=TOP_MT+B
IF TOP_MT=999 then
  TOP_MT=TOP_MT-1000
   TOP_KM=TOP_KM+1
Endif


SAAT=(SAYAC*143)*36
KM=DIV32 1000 'Bir saatte gidilen yol km cinsinden


LCDOUT $FE,$80,"KM/H=",DEC3 KM
LCDOUT $FE,$C0,"TOPLAM=",DEC5 TOP_KM



GOTO BASLA

gergy

Alıntı YapIF TOP_MT=999 then
yerine IF TOP_MT>999 then diye değiştirirseniz sanırım artacaktır. Ete hocamızın yazdığı şeklinde 999'a eşit olmadıkça artmayacaktır keza her zaman 999'a eşit olmayacağı açık.

canakcura

Dediğiniz gibi değiştirdim artmaya başladı ama baya fazla artıyo bu şekilde olunca bi nerde hata yaptım acaba ?

gergy

#14
km hesabını tmr0 kesmesi içinde yapın keza ana döngüde sürekli aynı değeri habire topluyor, halbuki saniye başına eklemesi gerekir. Yani kısaca kesme rutinini aşağıdaki gibi bir KM_SAY değişkenine sayaç değerlerini ekleyin sonra ana döngüde km hesabını yapabilirsiniz (kesmeden mümkün olduğunca çabuk ve az işlemle çıkmak lazım) ister ETE hocanın tarzında ister benim yazdığım tarzda olabilir ancak Top_MT değişkenini gerekirse tercihen dword tanımlamanız ve belli km'den sonra ilgili değişkenleri sıfırlamanız gerekir.



BASLA:


TOP_MT=(KM_SAY*143)/100
TOP_KM=TOP_MT/1000


SAAT=(SAYAC*143)*36
KM=DIV32 1000 'Bir saatte gidilen yol km cinsinden


LCDOUT $FE,$80,"KM/H=",DEC3 KM
LCDOUT $FE,$C0,"TOPLAM=",DEC5 TOP_KM



GOTO BASLA




DISABLE
KESME:
A=A+1
IF A=61 THEN
  A=0
  SAYAC.HIGHBYTE=TMR1H
  SAYAC.LOWBYTE=TMR1L

KM_SAY=KM_SAY+SAYAC

TMR1H=0:TMR1L=0
ENDIF
INTCON.2=0
RESUME

Powered by EzPortal