for next döngüsü

Başlatan erdogan2734, 05 Şubat 2015, 13:35:52

erdogan2734

Arkadaşlar Merhaba;
Bir problemim var çözüm bulamadığım için buraya yazıyorum.

Program içerisinde pic çıkışlarından her hangi birini 1-0 yaparak değişken kare dalga üretmem lazım.

karedalga:

for i=1500 to 750 step -1
for tekrar= 0 to 1
PORTb.7=1-PORTb.7
pauseus i
next tekrar
next i

goto karedalga

    Buraya kadar sıkıntı yok. Yalnız step 900 e geliği zaman  örneğin 900 ile 750 arasında ki değerleri. 1 er 1 er değilde 0.5 er 05 er yada 0.25 er 0.25 er azaltmak istiyorum. Çıkıştaki kare dalganın sıklığını arttırmak için. 1500 ile 900 arası darbe puls sayısı geniş 900 ile 750 arası darbe puls sayısı sık olsun istiyorum. Çeşitli formullerle denedim ama kare dalga bozuluyor. Aklına farklı bir fikir gelen varsa yardımcı olursa çok sevinirim. Bu arada basic de en küçük gecikme pauseus 1 doğrumu biliyorum. Yada step olarak en küçük 1 değerimi kullanılıyor?


Şimdiden okuma nezaketinde bulunduğunuz için çok sağ olun iyi çalışmalar... 
Erdoğan
İmkansızın zaman aldığı bir dünya'da bana zorluktan bahsetme!

ete

Komutların da yarattığı gecikmeleri dikkate alabilirsiniz.
Belkide en düşük gecikme değeri PAUSEUS 1 dir ama ondan daha küçüğü hiç bir gecikme komutu vermemektir.
İstediğinizi şöyle yapmak mümkün;
for i=1500 to 750 step -1
for tekrar= 0 to 1
PORTb.7=1-PORTb.7
IF I=>750 and <900 then
'pauseus 1  'bu satırı açarak ve kapatarak deneyin. Kapatırsanız 750-900 aralığı daha sık açarsanız biraz daha az sık olacaktır.
else
pauseus i
endif
next tekrar
next i


Ete

erdogan2734

#2
    Hocam cevabınız için çok teşekkür ederim.
Burada sıklıkta kastım. Örneğin 750 ile 900 arası bir sayı alalım 800 diyelim.
1-0 mantığı ile 800x2=1600 f= 1/1600 bize frekansı veriyor. Ben burada 900 den 899 a inerken 1 er 1 er değilde 900,899,899.5,899.25
gibi inmesini istiyorum. Ara değerler yakalamak için. Burada pauseus 1 den daha küçük bir değer alamadığı için ve step komutu olarak 0.5 kullanamadığım için. Ben bu değerleri sağlayamıyorum. Başka bir yöntem varmıdır acaba?
TMR0 kesmesimi kullansam acaba hocam?

Erdoğan
İmkansızın zaman aldığı bir dünya'da bana zorluktan bahsetme!

ete

Döngü içine Pauseus 1 yazdığın zaman orada 1us lik bir gecikme elde edersin. Ama aslında pauses komutunun gecikmesi + 1us  lik bir gecikme elde etmiş olursun.  Hiç bir şey yazmaz isen yalnızca komut gecikmesini kullanmış olursun bunu anlatıyordum ama anlamamışsın.

Bu durumda hiç bir şey yazmamakla olabilecek en kısa gecikmeyi sağlamış olursun. Diğer bir metod ise işlemci frekansını artırmaktır. 4 Mhz yerine 20 ile çalış frekansın epeyce artar. 4Mhz de 1 komut çevrimi 1us dir. 20 Mhz de ise 1 komut çevrimi 0,2us yani 200 ns dir.
Ama döngü yöntemi yine anlattığım şekilde olacaktır.

Ete

Powered by EzPortal