çoklu switch kesme sorunu

Başlatan ipek, 21 Aralık 2008, 19:33:52

ipek

mcs ile tasarlamaya çalıştığım devrede kesme sorununu halledemedim
12 anahtar var normalde açık bunları pencere bağlı olarak düşünebilirsiniz
her hangi bir pencere açıldığında led bir kere yanıp sönüyor bu arada başka  bir pencere'de açılsa ledin aynı işlemi yapılması bekleniyor bu bütün switch'ler için geçerli
yazdığım programda port4...port7 switch'leri aşağı yukarı istenilen gibi çalıştı fakat bunda'da sorun mevcut
örnek b4 anahtarı açıldı yada açık kaldı ,bu arada b5 anahtarı açıldı yada açık kaldı led doğru olarak  vazifesini yaptı fakat sorun açık pencereleri tekrar kapatmaya çalıştığımda tekrar interrupt geliyor
fazladan led tekrar yanıp sönüyor ..asıl sorun bu 4 portun dışında diger portları çalıştıramadım.
INTCON.0 = 0' Clear the RB port change flag bit bu satırı geçersiz bıraktığımda tüm portlar çalışıyor
fakat one-shot özelliği bozuluyor filip flop gibi oluyor.. saygılarımla..

@ device  pic16f84, xt_osc, wdt_off, pwrt_on, protect_off

led1	VAR PORTA.0

sw1  VAR PORTA.1
sw2  VAR PORTA.2
sw3  VAR PORTA.3
sw4  VAR PORTA.4
sw5  VAR PORTB.0
sw6  VAR PORTB.1
sw7  VAR PORTB.2
sw8  VAR PORTB.3
sw9  VAR PORTB.4
sw10 VAR PORTB.5
sw11 VAR PORTB.6
sw12 VAR PORTB.7


cnt   var byte
cnt2  var byte

INTCON.3 = 1	' Enable the RB port change interrupt
OPTION_REG.7 = 0	' Enable PORTB pull-ups
TRISA = %11110
PORTA = 0
TRISB = %11111111
PORTB = 0

on interrupt goto wake_up

main:

GoTo main

disable 
wake_up: 

   IF sw1 = 0 Then S1
   IF sw2 = 0 Then S2
   IF sw3 = 0 Then S3
   IF sw4 = 0 Then S4 
   IF sw5 = 0 Then S5
   IF sw6 = 0 Then S6
   IF sw7 = 0 Then S7
   IF sw8 = 0 Then S8
   IF sw9 = 0 Then S9
   IF sw10 = 0 Then S10
   IF sw11 = 0 Then S11
   IF sw12 = 0 Then S12 
   
goto exit

S1:
   for cnt = 1 to 1
      led1 = 1
      pause  500
      led1= 0
      pause  500
   next  
   
goto exit


S2:
   for cnt = 1 to 1
      led1 = 1
      pause  500
      led1= 0
      pause  500
   next  
   
goto exit

S3:
   for cnt = 1 to 1
      led1 = 1
      pause  500
      led1 = 0
      pause  500
   next   
goto exit

S4:
   for cnt = 1 to 1
      led1 = 1
      pause  500
      led1 = 0
      pause  500
   next   
goto exit

S5:
   for cnt = 1 to 1
      led1 = 1
      pause  500
      led1 = 0
      pause  500
   next   
goto exit


S6:
   for cnt = 1 to 1
      led1 = 1
      pause  500
      led1 = 0
      pause  500
   next   
goto exit

S7:
   for cnt = 1 to 1
      led1 = 1
      pause  500
      led1 = 0
      pause  500
   next   
goto exit

S8:
   for cnt = 1 to 1
      led1 = 1
      pause  500
      led1 = 0
      pause  500
   next   
goto exit

S9:
   for cnt = 1 to 1
      led1 = 1
      pause  500
      led1 = 0
      pause  500
   next   
goto exit

S10:
   for cnt = 1 to 1
      led1 = 1
      pause  500
      led1 = 0
      pause  500
   next   
goto exit

S11:
   for cnt = 1 to 1
      led1 = 1
      pause  500
      led1 = 0
      pause  500
   next   
goto exit

S12:
   for cnt = 1 to 1
      led1 = 1
      pause  500
      led1 = 0
      pause  500
   next   
goto exit
exit:   
   INTCON.0 = 0' Clear the RB port change flag bit
   resume 
   enable

End


simulasyon ve dosyalar
http://rapidshare.com/files/175515825/12key.rar.html

ete

@İpek,
Bana kalırsa bu amaç için kesme kullanmaya gerek yok. Zaten kesme bütün butonları kontrol edemiyor.

Aşağıdaki programı bir denermisin istediğin bu mudur acaba?

Ete

@ device  pic16f84, xt_osc, wdt_off, pwrt_on, protect_off

led1	VAR PORTA.0

pencere var word 60
konum var word   62
cnt   var byte   64
cnt2  var byte   65
I     var byte   66
temp var byte    67
A    var byte    68
B    var byte    69 
z    var byte    70 

OPTION_REG.7 = 0	' Enable PORTB pull-ups
PORTA = 0
TRISA = %00011110
PORTB = 0
TRISB = %11111111

main:
pencere=0
B=PORTB
PENCERE=B
Pencere=pencere<<4

A=PORTA & %00011110
temp=a>>1
PENCERE=PENCERE+temp
FOR I=0 to 11
if pencere.0[I]=0 then
  gosub FLASH
endif
next
pause 100

GoTo main

flash:
      if konum.0[I]=1 then
         konum.0[I]=0
         pause 500
         return
      else
         konum.0[I]=1
         led1=1
         pause 500
         led1=0
         pause 500
      endif
      return
            end
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

ipek

Hocam saygılar
buttonlar olmuş her basışta 1 saniye olmuş fakat sıkıntı button'lar dan bir yada bir kaçı basılı kaldı ise flash ediyor isteğim her tuşa tek bir reaksiyon bağımsız gibi davranmaları birden fazla tuş basık kalmış ise tuşları kaldırır iken reaksiyon göstermemeleri  kolay gelsin...

ete

İsteneni anlamak programın yarısıdır.
Şimdi ortada basılacak 12 adet tuş bulunuyor. Bu tuşlardan bazılarına basılıp basılı olarak bırakılabiliyor anladığım kadarı ile.
Diyelimki 1-5-ve 10 nolu tuşlara birden basıldı.
İlk  basılma anında her biri için led bir kere yanıp sönecekmi yoksa hespi için tek bir kere mi yanıp sönecek?.

Bu basılı olan 1-5-10 nolu butonlar basılı bırakılmış ise (hala basılı) bırakıncaya kadar onlar ile ilgili hiç bir işlem yapılmayacak öylemidir?
Birde şuna bak o zaman;


Ete
@ device  pic16f84, xt_osc, wdt_off, pwrt_on, protect_off

led1	VAR PORTA.0

pencere var word 60
konum var word   62
FLAG var word
I     var byte   66
temp var byte    67
A    var byte    68
B    var byte    69 
z    var byte    70 

OPTION_REG.7 = 0	' Enable PORTB pull-ups
PORTA = 0
TRISA = %00011110
PORTB = 0
TRISB = %11111111

main:

pencere=0
B=PORTB
PENCERE=B
Pencere=pencere<<4

A=PORTA & %00011110
temp=a>>1
PENCERE=PENCERE+temp
FOR I=0 to 11
if pencere.0[I]=0 and FLAG.0[I]=1 then
  gosub FLASH
endif
next
FLAG=PENCERE
pause 100
GoTo main

flash:
      if konum.0[I]=1 then
         konum.0[I]=0
         pause 100
         return
      else
         konum.0[I]=1
         led1=1
         pause 500
         led1=0
         pause 500
      endif
      return
            end
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

ipek

hocam

Şimdi ortada basılacak 12 adet tuş bulunuyor. Bu tuşlardan bazılarına basılıp basılı olarak bırakılabiliyor anladığım kadarı ile.
1:evet hocam açıyorum konuyu( button varsaydığım pir yaklaşım sensorundan gelen röle kontağı 12 adet pir var can sıkmasın diye
bir adet buzzer var burada led buzzer. malum pir röleleri hemen bırakmıyor süresi en aşağı 15 saniyeye indirilebiliyor örnek üç no'da hareket algıladı buzzer bir kere çaldı kaldırıp başımı panoya baktım 3 no'nun (uyarı ışığı )yanıyor bu kısımı hallettim.. ama örnek üç no'lu pir'in time bitmeden 12 no'dan obje algıladım (tabloda ışık )yandı fakat buzzeri kaçırdım.... çünki pic hala 3 nolu ile meşgul asıl sorun bu bir button bir işlem olmalı

Diyelimki 1-5-ve 10 nolu tuşlara birden basıldı.
İlk basılma anında her biri için led bir kere yanıp sönecekmi yoksa hespi için tek bir kere mi yanıp sönecek?.
2:hepsi için bir kere

Bu basılı olan 1-5-10 nolu butonlar basılı bırakılmış ise (hala basılı) bırakıncaya kadar onlar ile ilgili hiç bir işlem yapılmayacak öylemidir?
3:evet fakat bu arada örnek 7 basıldı led yine bir kez işlem yapacak

ete

O zaman yukarıda verdiğim ikinci program bu sisteme uyyuyor zannedersem.
Yinede bir tereddütüm var. O da , 1 nolu pir bir cisim algıladı ikaz verdi led yandı söndü ama hala 1 umarayı aktif olarak meşgul ediyor. Pic ilk taramada bunu gördü ledi yaktı ve ikinci taramaya geçtiğinde baktı bu pir hala aktif işini bitirmemiş . Buna ait bir işlem yapmıyor. Ancak pir işini bitirince 1 nolu pir in konum biti hala 1 konumunda kaldı. İkinci defa bu pir aktif olursa led yakılmıyor. Ancak üçüncüde yakılıyor. Bana pencere örneğini verdin ona uygun olarak pencere bir kere açıldımı kapanmasını bekliyor anlamında bu uygulamayı yapmıştım.
Son bir açıklama ile sanırım bu işi halledeceğiz.
Tekrar bir senaryo vermek gerekiyor.
1. Pic taramaya başladı. Diyelimki 1 ve 5 Nolu PIR sensörleri cisim algıladı ve gereki ikazı verdi. Pic bunu butona basılmış kabul edecek ve bu iki PIR e ait olan 2 defa led yakma işini yapacak. 1 ve 5 nolu PIR ler hala aktif. Yani butona basılı bekliyor.
2. Pic taramayı bitirdi ve ikinci taramaya geçti. Baktı ki 1 ve 5 nolu PIR ler hala aktif. Onları geçti diğer PIR lere baktı.

3. Pic taramasını bitirdi bu arada 1 ve 3 nolu PIR lerde aktif olmaktan çıktı ve bekleme konumuna geçtiler (yani buton gibi düşünür isek buton bırakılmış oldu). Pic yeni taramaya geçti ve her hangi bir PIR aktif bulamadı. Taramayı bitirdi.

4. Pic yeniden bir taramaya geçti ve bu anda 5 nolu PIR yeniden aktif oldu. Pic baktı 5 Nolu PIR aktif (Yani 5 nolu butona basılmış) .
İşte burası çok önemli. Pic bu durumda 5 nolu PIR için yeniden led yakacakmı yoksa yakmayacakmı?.

Şayet yakacak dersen üçüncü programı vermek zorundayım ve oda aşağıdadır. Yalnızca FLASH etiketini veriyorum diğer kısımları 2. ile aynı olacak.


flash:
         led1=1
         pause 500
         led1=0
         pause 500
RETURN
      


Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

ipek

hocam ikinci yazdığınız amacına çok yaklaştı arzu edilen gibi çalışıyor
tuşlardan biri yada bir kaçı basık ise bazen işlem yapmıyor aynı butona ikinci basıldığında işlem yapıyor...acaba isis'tenmi gerçek ortamda çalışırmı??

ete

Anladığım kadarı ile 3 . program dediğim sistem tam aradığın olacak. 2. programın flash kısmın son verilen ile değiştir. Tam aradığın olacak herhalde.
Gecikmelerle  de bitraz oynamak gerek. Led yanması esnasında yaklaşık 1 sn lik süre kaybı var . O esnada tuşa basılr ise görülmeyebilir. Bana kalırsa
Flash kısmında led söndükten sonra koyulan ,
PAUSE 500 komutunu PAUSE 100 olarak değiştir.

Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

ipek

hocam Klavyenize sağlık. tam anlamı ile arzu ettiğim gibi çalıştı bu arada
sayenizde bir çok sey öğrendim saygılar hocam...

ete

Olduğuna sevindim. Bir şeyler öğrenmene daha da sevindim. Amacım bu idi zaten. Program biraz daha kıslabilir. Anlayasın diye fazladan değişkenler kullanmıştım. Bu arada Led söndükten sonraki pausu kısaltırsan iki led yanımı arasındaki mesafe azalıyor ve hoş gözükmüyor. Sen yinede 500 olarak bırak istersen.

Kolay Gelsin
Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

hatmeto

Hocam ellerinize sağlık tam devreyi aradığım gibi olmuş. Bir çok şey ögrendik. Çok sağol.... :o  :o
Bir admin ataasözü derki: "biliyorsan paylaş mod yapsınlar. bilmiyorsan sus banlamasınlar"

ete

Programın en kısa hali aşağıdaki şekilde olabiliyor.
Ete
@ device  pic16f84, xt_osc, wdt_off, pwrt_on, protect_off  
LED1   VAR PORTA.0

DURUM var word 60
FLAG    var word
I       var byte   66
TEMP    var byte   67 

OPTION_REG.7 = 0   ' Enable PORTB pull-ups
PORTA = 0
TRISA = %00011110
PORTB = 0
TRISB = %11111111

MAIN: 
      DURUM=0
      DURUM=PORTB
      DURUM=DURUM<<4      
      TEMP=PORTA & %00011110
      TEMP=TEMP>>1
      DURUM=DURUM+temp
      FOR I=0 to 11
     IF  DURUM.0[I]=0 and FLAG.0[I]=1 then
        gosub FLASH
      endif
      next
      FLAG=DURUM
      pause 10
      GoTo main

flash:
         led1=1
         pause 500
         led1=0
         pause 500
         return
         end
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com