S

TIMER0 ile aracın süratini öğrenebilmek

Başlatan Serhat, 06 Ocak 2012, 16:25:51

Serhat

Merhaba
Pic Basic Pro ile yazmaya çalıştığım programda takıldığım yer şurası:
Kullandığım PIC:16F84A
Örneğin B0 a bağlı bir butona bastığımda timer0 çalışmaya başlasın ve süreyi tutsun,aynı butona 10 kere basılınca  timer ı durdursun bana süreyi söylesin böylece ben aracın süratini bulmak istiyorum
(Aslında B0 a gelen pals "araç 10 cm gitti" bilgisi olduğundan aracın km/s bilgisine ulaşabilirim)
Program sahada maximum 10 km/s le giden araçda çalışacağı için saniyede maximum 277,7 cm/sn hızla gideceğine göre 10 mili saniyede en çok 28 puls gelir .10 Puls ı ise 3,37 milisaniye sürer.Bunları şunun için yazdım aracın 10 km sürati geçtiğinde sesle ve flash ile göstermem gerekirse ne kadarlık bir periyotu ölçmeliyim 1 sn lik periyot yeterlimidir(ki 16F84 ün sınırlarını aşıyor presclaler yapılması gerekiyor sanırım )

Özetle 10 (yada atıyorum 100 )pulsın süresini tutan bana bunu lcd de gösteren küçük programa ihtiyacım var ,(LCDOUT .... diye yazsanız yeterli LCD tanımlamalarını başta yazmanıza gerek yok -o kısımda sorunum yok yani)
Ekleme:Aslında kodlar yerine komut satırınının açıklamalarını yazsanız ("INTERRUPT ları aç" gibi) konuyu daha iyi anlarım

Herkeze kolay gelsin

ete

Programlama konusunda bilgi eksikliğin olduğu gibi TMR0 çalışma şekli konusunda da bilgi eksikliğin var.
TMR0 8 bitlik bir sayaçtır. Geri planda sürekli çalışır. Bu sayacı durdurmak mümkün değildir. Ancak sıfırlayabilir ve belirli bir zaman içinde değerini okuyabilirsin.
Bu açıklamadan sonra gelelim senin yazdıklarına;
10 ms de 28 darbe gelecek ise TMR0 sayacı harici kaynaktan sayacak şekilde ayarlanmalıdır.
Böylece sayarken alıp başını gitmez ve yalnızca 10 ms de 28 puls dediğin darbeleri sayar.
Bu durumda yapman gereken yaklaşık 1 sn lik (1000 ms) zaman tutup gelen pulsları saydırmak olmalıdır.
Yoksa dediğin şekilde darbe süresini ölçmeye kalkarsan hiç bir sayaç değeri buna yetişmez sürekli sınırları aşarsın yani taşma denilen owerflow yaratırsınki buda sonuçları hatalı algılamana sebep olur.

OPTION REGISTERI incelemen gerekiyor. Bu registerin 5 nolu biti TMR0 sayacının sayması için sinyalin nereden geleceğini belirler.
Bu bit sıfır olursa sistem osilatörü darbelerinden tetik alır. Bu bit 1 olur ise PORTA.4 pininden giren darbeleri sayar. Unutma PORTA.4 Open collector dür ve kendi başına HIGH çıkartamaz. Şayet gelen darbeler de HIGH kaynak tarafından yaratılmıyor ise Bu pine birde PULLUP direnci bağlaman gerekir.
Gelen darbeleri 1/1 oranında sayacağın için, Option registeri 3 nolu biti 1 yapacaksın.  Bit 2-0 arasındada %000 vereceksin.
Kısaca Option Reg=%00101000  eşitliğini kullanacaksın.
Programı şöyle yapabilirsin.
Programın başında Option registerine yukardaki değeri verdikten sonra;
TMR0=0
Pause 1000
SAYAC=TMR0
şeklinde bir komut dizisi kullanabilirsin. SAYAC değişkenine 1 sn içinde gelen darbe sayısı kayıt edilir. Şayet bu değer 255'i aşacak ise bence TMR1 sayacını kullanman daha uygun olur. TMR1 sayacı aynı özelliklere sahip dışarıdan bir pinden tetiklenebilir ancak 16 bitlik bir sayactır.
Darbelerin hangi aralıkta verileceğini yazmamışsın. O nedenle ben hesaplayamadım. Bana göre yaptığın hesap ta yanlış.
277,7 CM/sn lik bir hızda (277,7 cm/1000 ms) 10 ms cinsinden hesaplanırsa 2,777 bulunur 27,7=~28 bulunmaz.
Bu yazdıklarımdan yola çıkarak bir şeyler yapmaya çalış istersen.

Ete

Serhat

Allah yolunuzu açık etsin .
1 sn nin 1000 mili saniye olduğunu öğrettiğin için çok sağol

zoptrik

Ne olduysa arkadaşın işini görmemiş herhalde satırlarca açıklama.
Öyle armut piş ağzıma düş olmuyor. biraz dizini kırıp çalışman gerekiyor sayın abim.
iyi forumlar...
DEHA; İMKANSIZDA MÜMKÜNÜ GÖREBİLMEK DEMEKTİR.GEMİLERİN KARADA DA YÜZEBİLECEĞİNİ SEZMEK, MEHMETLERDEN BIRINI "FATİH" YAPAR...!

Serhat

#4
Zoptrik
Seninle ilgili bir konu konuşuldumu?
Ayrıca mesajımın son kısmında ne yazıyor?
Alıntı yapılan: Serhat - 06 Ocak 2012, 16:25:51
Ekleme:Aslında kodlar yerine komut satırınının açıklamalarını yazsanız ("INTERRUPT ları aç" gibi) konuyu daha iyi anlarım
Sen ne yazmışsın
Alıntı yapılan: zoptrik - 06 Ocak 2012, 18:17:29
Ne olduysa arkadaşın işini görmemiş herhalde satırlarca açıklama.
Öyle armut piş ağzıma düş olmuyor. biraz dizini kırıp çalışman gerekiyor sayın abim.

Ayrıca sen beni nereden ne kadar tanıyorsunda bana araştır diyorsun.Sen git "Case" lerle ilgili millete bişeyler anlat.
Ama anlattıkların yukarıdakiler gibi saçma sapan olmasın.

Benim bulduğum mikroelektronika sitesindeki Basic kodları açıklamaları bana yeter.(Zaten birileride zamanında oralardan copy paste yapıp pic basic pro ya uyarlayıp millete yutturmuş)
Ne çok bilen varmış arkadaş


ooooooooppppps!!!!!!!!!!!!!!!!!!!!!!!! fazla ileri gitme

zoptrik

#5
Kusura bakma ama ne kadar bilirsen bil ETE senin "1 sn nin 1000 mili saniye olduğunu öğrettiğin için çok sağol" diyebileceğin biri değil. Hatta kusura da bakabilirsin son mesajım istediğin kadar salla artık .



Bu tarışmalara hiç gerek yok.  Daha dikkatli davranın lütfeeeeeeen !!!!

DEHA; İMKANSIZDA MÜMKÜNÜ GÖREBİLMEK DEMEKTİR.GEMİLERİN KARADA DA YÜZEBİLECEĞİNİ SEZMEK, MEHMETLERDEN BIRINI "FATİH" YAPAR...!

wishes

#6
Unutma PORTA.4 Open collector dür ve kendi başına HIGH çıkartamaz. Şayet gelen darbeler de HIGH kaynak tarafından yaratılmıyor ise Bu pine birde PULLUP direnci bağlaman gerekir.

hocam şu bilgi o kadar işime yaradı ki. ben de A4 portunun etkileşime girmeme sebebini kara kara düşünüyordum. sayenizde bir sorunumu daha aştım.

Powered by EzPortal