Pause...

Başlatan vale9, 28 Eylül 2006, 09:27:54

vale9

Arkadaşlar, pic12F510'da internal 4Mhz osilatör kullanıyorum. Pause komutundan istediğim verimi alamıyorum. Trimpottan okunan değere göre bekletme yapmak istiyorum ama net rakamlar alamıyorum. Pause komutundan başka ne yapabilirim?

HIGH CIKIS
FOR Y=0 TO PZAMAN  
    PAUSE 2000
NEXT Y
LOW CIKIS

Pzaman ve y byte olduğu için maksimum 256 olacak. Toplam bekleme 256X2=512 SN=8.5 DAKİKA olması gerekiyor ama 20 dakika bile gördüm
Hayat 1'ler ve 0'lardan ibarettir.

mmengi

Bu komut ile sapma olur belki 10dk. da 5-10 saniye ama bahsettiğiniz gibi bir sapma olması normal değil yazdığınız kodun tamamı sanırım bu değil belki etkilendiği başka bir durum vardır.

vale9

içiçe if ve for döngüleri var ve toplam içiçe 4 adet gosub komutu var. Bir de programın sonunda goto komutu var. Nedeni bu olabilirmi? Heralde maksimum 4 adet içiçe gosub kullanabiliyoruz. Eğer problem buysa gosub yerine goto kullansam ne değişir?
Hayat 1'ler ve 0'lardan ibarettir.

ibrsel

Pause komutunda bahsettiğin kadar sapma olması ilginç geldi banada..Timer kullanarak daha hasas beklemeler yapabilirsin..

aslan_korhan

Bu tip komutları bende kullandığım zaman 2sn değilde çok daha kısa süreli bir gecikme meydana geliyor.

Çok daha farklı bir mantık kullanmak gerekiyor.

Pause 2000 yerine Pause 4000 yazdığım halde arasında pek bir fark olmuyor nedense...
Dünyada 10 çeşit insan vardır. Binary bilen ve bilmeyenler.

vale9

Alıntı yapılan: "aslan_korhan"Pause 2000 yerine Pause 4000 yazdığım halde arasında pek bir fark olmuyor nedense...

pause komutu osilatör frekansına göre değişiyor. 4 mhz'e ayarlı normalde. Örn 8mhz kullanıyorsak pause 2000 yazınca 1 sn bekliyor.

Bir de timer'ı ilk defa kullanacağım. Timer kullanırken program çalışmaya devam etmiyor mu? Tam olarak mantığı nedir?
Hayat 1'ler ve 0'lardan ibarettir.

aslan_korhan

Zaten programda define osc 4 gibi şeyler ekliyorum.
sadece pause komutunu kullandığım zaman bir sorun olmuyor, ama yukarıdaki gibi bunu bir IF-THEN döngüsü içine yazınca süreler saçmalıyor.
Bu durumda 2000 veya 4000 yazsam bile süre ayni oluyor...

Örneğin:

b = 0
for b = 1 to 30000                              
pause 4                                          
if b = 30000 then goto time                      
next b

Bu gibi komular kullandığımda süreler saçmalıyor ve 1 to 3000 ile 1 to 30000 arasında pek bir fark olmuyor. pause 4 koymadığım zaman olay daha vahim...
Dünyada 10 çeşit insan vardır. Binary bilen ve bilmeyenler.

vale9

Alıntı yapılan: "aslan_korhan"Bu gibi komular kullandığımda süreler saçmalıyor ve 1 to 3000 ile 1 to 30000 arasında pek bir fark olmuyor. pause 4 koymadığım zaman olay daha vahim...

İşte benimde bütün sorunum bu... :roll:
Hayat 1'ler ve 0'lardan ibarettir.

mmengi

aslan_korhan ın verdiği örnek üzerinden konuşursak döngü değeri 3K iken elde edilen sonuç 12.2sn. , 30K ile elde edilen sonuç ise 122.8 sn. bence bu çok normal bir sonuç eğer buna normal değil diyorsanız program içinde gereksiz yere "if B = 30000 then goto TIME" ibaresi var ve burada zaman kaybediliyor zaten For Next döngüsü aynı sayıyı sayıp kontrol ediyor, bu ibareyi çıkardığımızda 30K için 1sn lik bir iyleşme oluyor 3k içinse 0.1sn. kadar. Neden hala 120sn. ve 12sn. hatasız alamıyoruz derseniz For-next komutunu işletmek için mcu zaman harcıyor bunun asm karşılığı üzerinden ne kadarlık saykıl süre tutuyor bulunup for-next döngüsü içindeki sayı üzerinde düzeltme yapılarak istenen hatasız değere yaklaşılabilir.


Alıntı YapDEFINE OSC 4

B   VAR   word
b=0
for B=0 to 30000
pause 4
if B = 30000 then goto TIME
next B

TIME:

end

aslan_korhan

Ya biz bir hatta yapıyoruz, yada picbasic'te bir sorun var.

Başka türlü birşeyler kullandığım zaman oluyor bir şekilde. Yada deneme, yanılma yöntemi ile deniyorub bunları mecburen uygun zamanlamayı tututana kadar.

Bu 30000 rakamını ben X'e yazıyorum örneğin.
Yani For b = 1 to x diyorum.
x var word dememe rağmen olmuyor.
x var byte desem bu 30000 rakamı büyük olacağından çalışmamasını anlarım ...

mmengi ben tam birşeyler yazana kadar yazmış bile :)

burada aradaki pause 4 rakamını değiştirdiğim zaman çok fark oluyor sürede.
Bahisi edildiği gibi: Biraz hesap yaptıktan sonra bir şekilde oluyor sonuçta.
Çok büyük bir sorun değil yani.
Dünyada 10 çeşit insan vardır. Binary bilen ve bilmeyenler.