avatar_jun

pause komutu

Başlatan jun, 02 Eylül 2011, 00:47:19

jun

Hayırlı geceler hocam pause konusunda kafama birşey takıldı size sormayı uygun gördüm.Şimdi pause komutu ile bir kaç saniyelik geçikmeler verebiliyoruz.yanılmıyorsam komutun alabilecegi en büyük değer 16 bit yani word değişkeni.şimdi diyelimki pic e bir işlem yaptırdıktan sonra yarım saat yada bir saat bekletip süre bitiminde tekrar bir işlem yaptırıp beklemeye alıcaz.2 çözüm aklıma geldi fakat bana pek kullanışlıymış gibi gelmiyor birincisi.
1-pause nin alabilecegi en son degeri alt alta girip istenen kadar geçikme yaratmak yani
pause xxx
pause xxx
pause xxx gibi
2-işlemciyi sleep komutuyla uyku moduna sokmak.ama bu konuda pek bilgi sahibi değilim,eger bu konuda biraz yardımcı olursanız çok iyi olur.teşekkürederim saygılar iyi geceler.

jun

unutmadan,program içinde sayaçta kullanabilirim.fakat ben bu komutlarla bu işin yapılıp yapılamayacagını öğrenmek istiyorum.

ete

Uzun süreli gecikme yaratmanın en kısa yollarından birisi döngü kurup pause komutunu döngü içine alarak birden fazla pause ile işi bitirmektir.
Alt alta 10 adet pause yazmak ile birden 10'a kadar bir döngü kurup tek pause yazmak aynı şeydir. Hatta döngü olanı biraz daha fazla zaman alır.  Sebebide döngü komutlarının az da olsa zaman almasından dolayıdır.

Sleep komutu daha büyük gecikmeler yaratmak ve bu esnada işlemciyi en az akım çekecek moda sokmak  için geliştirilmiştir

Sleep sure şeklinde uygulanan komutda süre saniye cinsinden verilir. Sleep 60 şeklindeki komut işlmeciyi 1 dakika süre ile uykuya sokar.
Bu şekilde çok uzun (65535 saniye) sürelerde gecikmeler yaratabilirsiniz.

Birde NAP komutu vardır. Bu işlemci osilatöründen bağımsız  WDT sayacını kullanarak sbait gecikmeler yaratır.
NAP sure şeklinde uygulanır. Sure değeri 0-7 arasında değişir. Bu süreler sabittir değiştirilemez.
Örneğin NAP 0  komutu 18 ms lik bir gecikme yaratır. NAP 7 ise 2,3 saniyelik bir gecikme yaratır. Aradaki değerleri 18 in katları şeklinde hesap edebilirsiniz.

Bu tür gecikmelerin en büyük kusuru işlemciyide başka iş yapmamak üzere bloke etmeleridir. Şayet zamanlama geri planda çalışsın bende bu arada başka işlerle uğraşayım derseniz en iyisi kesme ile saat sinyalleri oluşturup her kesme oluştuğunda bu sinyalleri saymak ve istenilen zaman ulaşılıncaya kadar bu işi yapmaktır.

Ete


pwm3434

döngüden yararlanarak pause komutuyla geçiktirme yaptırmak istedim  ama istediğim gibi çalışmadı program. ıf komutları bir işe yaramadı herhangi biri 0 yapıldığında döngü sadece bir tanesi çalışıyor.
TRISB=%00000000   'PortB tamamı çıkış yapıldı.
TRISA=%00000111   'A portu tamamı çıkış yapıldı.
@ DEVICE pic16F628A                      'işlemci 16F628                               
@ DEVICE pic16F628A, WDT_OFF              'Watch Dog timer açık
@ DEVICE pic16F628A, PWRT_ON             'Power on timer açık
@ DEVICE pic16F628A, PROTECT_OFF         'Kod Koruma kapalı
@ DEVICE pic16F628A, MCLR_OFF             'MCLR pini kullanılıyor.
@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT  'Dahili osilatör kullanılacak
INCLUDE"tanım_LCD"
CMCON=7
OPTION_REG=%00000000                                                 
SYMBOL TUS1=PORTA.0
SYMBOL TUS2=PORTA.1
SYMBOL TUS3=PORTA.2
I VAR BYTE
Z VAR BYTE
'-----------------------------------------------------------------------------
CLEAR  'tüm değişkenler sıfırlandı
PAUSE 200
LCDOUT $FE,1
LOW PORTB.2  'LCD -R/W bacağı LOW'a çekildi.
'-----------------------------------------------------------------------------
BASLA:
PORTA=0:PORTB=0:Z=0:I=0

IF TUS1=0 THEN
      Z=1
      HIGH PORTB.0
      FOR I=0 TO Z
      PAUSE 2000
      NEXT
      LOW PORTB.0
      Z=0:I=0
ENDIF
IF TUS2=0 THEN
      Z=3
      HIGH PORTB.0
      FOR I=0 TO Z
      PAUSE 2000
      NEXT
      LOW PORTB.0
      Z=0:I=0
ENDIF
IF TUS3=0 THEN
      Z=6
      HIGH PORTB.0
      FOR I=0 TO Z
      PAUSE 2000
      NEXT
      LOW PORTB.0
      Z=0:I=0
ENDIF
GOTO BASLA
END

ete

Döngü ile gecikme yaratma işi bekleme anında başka işlerinde kontrolünü sağlamak amacı ile yapılır.
Bekleme anında bir iş yapılmayacak ise döngüye gerek yok. Mesela senin ilk döngünde 0 to 1 döngüsü ile toplam 2000x2=4000 ms lik bir gecikme yaratılmış. Bütünbunların yerine pause 4000 yaz gitsin daha kolay olur.
Muhtemelen çalışmadı dediğinde beklemelerin çok uzun olmasından kaynaklanıyordur.
Zira bir tuş kontrolü için 4 sn beklemek gerekiyor. her bir iiçin ayrı bekleme olduğuna göre bu programın çalışıp çalışmadığını anlamak bile insanı sıkar doğrusu.
Bir tuş kontrolünün çalışması için birincisinin bitmesi gerekir. Birincide 4sn ikincide 6 sn üçüncü tuş ta ise 12 sn lik gecikme mevcut.
Gerçekten çalışıp çalışmadıklarını kontrol etmek istiyor isen, şunları sırası ile yap,
- Program ilk çalıştığında TUS1'e basılı tut. PORTB.0=1 olduğunu görünce hemen elini çek ve bu sefer TUS2 ye basılı tut.
- PORTB.0 LOW olduktan sonra bastığın tuş görülecek ve hemen ardından PORTB.0 =1 yapılacak. Yalnız araya bir gecikme koymadığın için muhtemelen PORTB.0 ın söndüğünü göremeyeceksin bile.
Bu nedenle her bir tuş kontrolü bittikten sonra araya Pause 500 gibi bir gecikme koyarsan aradaki sönme konumlarını görebilirsin.
- İkinci defa PORTB.0=1 olduğunu görünce hemen TUS3'e basılı tut. Böylece bütün tuşların çalıştığını göreceksin. Ama aralardaki gecikmeleri unutma.

Ete





Powered by EzPortal