Jump to content
Forumu Destekleyenlere Katılın ×
Paticik Forumları
2000 lerden beri faal olan, çok şukela bir paylaşım platformuyuz. Hoşgeldiniz.

C veya Assembly de Delay


Manve_13

Öne çıkan mesajlar

Selamlar,

Uzaktan kumanda ile bilgisayar kontrolü ya da röle kontrol edebilecek bir proje hazırlamaya çalışıyorum. RC5 prokolü ile çalışıyorum fakat infrared sensöründen gelen 14 biti okuyabilmek için bunların arasına koymam gereken delaylar var. Resimde biraz anlatıyor. Şimdi benim yapamadığım kısım 4.7ms ve 1.7ms delaylari ayarlayamamak. Bunu nasıl yapabilirim?


Bir biti tanımlamak için hem 0 hem de 1 kullanmışlar. 0->1 ise off 1->0 ise On şeklinde. Ben bu gelen 2 bitten birini okursam işim tamam oluyor. İşte onun için de her okumadan sonra 1 bitlik delay koymam gerekiyor.

Link to comment
Sosyal ağlarda paylaş

delay yapicak kod, micro kontroller mi yada bir pc uzerinde mi calisiyor? pc uzerindeyse hangi isletim sisteminde? Ayrica isletim sistemindeyse driver seviyesinde mi yoksa aplikasyon seviyesinde mi calisiyor?
Delay kodun calistigi seviyeye gore cok degiskenlik gosterebilir ama temel olarak assemblyde Hz'i istedigin saniye cinsinden bolup (micro saniye, nano saniye gibi), o kadar "nop, rept" kombosu koyarak yapabilirsin.
Link to comment
Sosyal ağlarda paylaş

Hmm ya mikrodenetleyici üzerinden delay yapacağım da. Hani delay yapmanın yolunu biliyorum da istediğim süreyi nasıl ayarlicam tam olarak ondan emin değilim. Mesela 11.0592Mhz lik kristal kullaniyorum. Bunun muhakkak bir formülü falan vardır. Delay yapma yöntemim ise bi tane değişkene 255 atıyorum djnz komutu onu caliştiriyorum ama işte kaç tane bu şekilde üst üste saydırmam gerekiyor?
Link to comment
Sosyal ağlarda paylaş

e soyle dusun iste, 1 mhz = 10^-6 sn demek
11000 mhz = 10^-6 sn / 11000 demek
kac saniye delay yapmak istiyorsun ? diyelim ki 5. su islemi yapican

5 / (10^-6 * 11000)

usendim, cikan sonuc diyelim ki 2^16

her cycle'da bir adim iniyor olmasi lazim o loop controller'inda. iki tane icice loop yazacaksan 256'dan 0'a sayacak, .. bitti

bu arada microcontroller falan pek bilmiyorum teorik konusuyorum.
Link to comment
Sosyal ağlarda paylaş

İlk 4.7ms'likde sorun olmaz ama 1.7ms'lige direk delay koymaya çalışırsan sinyalin fazının kayması vb. problemler nedeniyle ciddi senkronizasyon problemleriyle karşılaşabilirsin. Zamanı tam tutturamazsan ya da bi şekilde phase noise yersen senkronizasyon tamamen gidebilir (kumandaya basarsın aglılamaz, bir daha basarsın algılar falan).

Adamlar zaten sana sensör çıkışında bu senkronizasyon bilgisini sunmuşlar zaten. Herhangi bir zamandan sonra bir ya da sıfır okumak yerine, direk sinyalin dustugu ya da yukseldigi yerleri okuman daha mantıklı olur gibi geliyor bana. 0->1 oluyorsa ON, 1->0 oluyorsa OFF gibi. İki çift D-Flip Flop ve çok basit delay elementleri (1ms) işini görür, clock sinyali olarak bunu verirsin, girişlerine 1,0 baglayıp 1ms sonra başka bir çift d flip-flop ile bunları saklarsın. Mikroişlemcin de rahat rahat çalışabilir istediğin frekansta.

FPGA ile çok kolay yaparsın. Mikroişlemcide ise daha zor çünkü aslında senin sinyal bilgini clock olarak bir register'a vermen gerekebilir. Mikroişlemcinin timer'ı varsa o da olur. Eğer olmadı basit birkaç discrete flip flop vs. ile rahat şekilde halledebilirsin.

Flip olduğu anları da kaçırmamak istiyorsan 1.7ms'den biraz fazla (2ms falan olur) basit bir delay elementi koyup da, en son yükselme/alcalmadan sonra tekrar bir aksiyon gelmiş mi ona bakabilirsin. Tam zamanı tutturmaya kasmaya gerek yok bence :)
Link to comment
Sosyal ağlarda paylaş

C'de falan direk delay_ms() falan gibi bir komut olması lazım ya.

O kendisi clock işlerini falan hesaplayıp bekletiyordu.

pic basic pro'da da

delay 100

diyince 100ms bekliyodu mesela.

assembly'de tabi yoktur nop komutuyla yardırmak gerekir de diğer dillerin kendi fonksiyonları olması lazım.
Link to comment
Sosyal ağlarda paylaş

Bakalim bir şeyler yapmaya çalıştım şu açık öğretim sınavı olayları bitsin akşama bi okula gidip lab.ta deneme yapacağım.

Şimdi gene her bit arasına delay koyarak yapmayı denedim. Normalde IR alıcı hep 1 verio. Ben bu sensörü INT0 ayağına bağladım ve ilk düşen kenarda program çalışmaya başlıyor ve 4 küsür ms lik bir delay yaptıktan sonra her 1.7ms de bir veri almaya çalışacağım.

Delay konusunda ise şöyle bir şeyler buldum. Mesela bizim kristalimiz 12Mhz ise bunun 12de birinde bir clock üretiliyormuş. Yani her clock 1Mhz'lik bir işlem hızımız var. Onun da periyodu 1us oluyor. Djnz komutu 2 cycle sürdüğüne göre her djnzde 2us geçiyor. 4-5 tane djnz kullanarak ayarladım. Bakalım eğer böyle ise direk benim istediğim değerlerde delay elde ediyorum. Akşam görcez bakalim...
Link to comment
Sosyal ağlarda paylaş

×
×
  • Yeni Oluştur...