RBCH Kesme kullanımı

Başlatan devreci22, 30 Nisan 2019, 00:01:38

devreci22

merhaba arkadaşlar portb degişiklik kesmesinle bir örnek yaptım
tuşlara basıldığını nasıl nasıl anlayabilirim örnek devremde kullanma mantığı nda  hatam  varmı incele yebilirmisiniz ?
ana program da gosub ile alt programa mı yoksa kesme içerisinde mi  basılıp basılmadığını ne şekilde sorgulamalıyım !
bayrak bıt i mi set etmeliyim ?
bilgisi olan arkadaşlardan yardımlarını bekliyorum
program devre şeması işikte
PORTA=0:portb=0
TRISB=%11110000   'PortB tamamı giriş yapıldı.
TRISA=%00000000   'A portu tamamı çıkış yapıldı.
'-----------------------------------------------------------------
'@ DEVICE pic16F628                      'işlemci 16F628                               
'@ DEVICE pic16F628, WDT_on              'Watch Dog timer açık
'@ DEVICE pic16F628, PWRT_ON             'Power on timer açık
'@ DEVICE pic16F628, PROTECT_OFF         'Kod Protek kapalı
'@ DEVICE pic16F628, MCLR_off            'MCLR pini kullanılıyor.
'@ DEVICE pic16F628, INTRC_OSC_NOCLKOUT  'Dahili osilatör kullanılacak
@ __config _INTRC_OSC_NOCLKOUT & _WDT_ON & _PWRTE_ON & _MCLRE_ON & _LVP_OFF & _CP_OFF 
'-----------------------------------------------------------------
ON INTERRUPT GoTo KESME   'kesme oluşursa KESME adlı etikete git.
OPTION_REG=%10000000   'dahili Pull up dirençleri aktif edildi ayrıca pullup direncine gerek yok.
INTCON=%10001000  'Kesmeler aktif ve RB CHANGE kesmesi aktif

CMCON=7    '16F628 de komparatör pinleri iptal hepsi giriş çıkış
'-----------------------------------------------------------------
'DURUM  VAR BYTE
TUSLAR  VAR BYTE
SYMBOL TUS=PORTB.0
SYMBOL TUS=PORTB.1
SYMBOL TUS=PORTB.2
SYMBOL TUS=PORTB.3
SYMBOL LED=PORTA.0
SYMBOL LED=PORTA.1
SYMBOL LED=PORTA.2
SYMBOL LED=PORTA.3
SYMBOL RBIF=INTCON.0
TUSLAR=PORTB
'-------------------------------------------------------------------
BASLA:
      IF TUSLAR=2 THEN
      PORTA.0=1
      ELSE
      PORTA.0=0
      ENDIF
      IF TUSLAR=1 THEN
      PORTA.1=1
      ELSE
      PORTA.1=0
      ENDIF
      IF TUSLAR=4 THEN
      PORTA.2=1
      ELSE
      PORTA.2=0
      ENDIF
      IF TUSLAR=8 THEN
      PORTA.3=1
      ELSE
      PORTA.3=0
      ENDIF
      goto basla
   
DISABLE  'yeniden kesme oluşması önleniyor 
KESME: 'program buraya geldiğinde kesme oluşmuş demektir.
       TUSLAR=(PORTB&%11110000)>>4
       RBIF=0   'INTCON.0=0 yapıldı yani RB CHANGE Bayrağı (flag) silindi.
       Resume      'geldiğin yere dön.
   Enable      'kesmeler yeniden aktif.
End

MB_77

#1
bu mesaj tarafımdan silinmiştir.

devreci22

Merhaba kesme programı içerisinde nasıl bir algoritma ile yazmalıyım;  buna bir örnek verebilir misiniz !
Kolaylık oluşması için led ile tasarladim similasyonu
Aslen devrede role kullanıyorum role leri tuşu her bastığında 50 ms çekili yapmam lazım 
Kesmede de pause komutu kullanılmıyor?
Ana programın içerisinde tuşlar gecikmeli çalışıyor
Saygılarımla

MB_77

#3
bu mesaj tarafımdan silinmiştir.

ete

Eski ve yeni ayırımına bende bir ilave yapayım.
Neden yeni işlemcileri tercih etmeliyiz? önce buna değinelim. PORTB değişiklik kesmesinden bahsediyoruz ve 16F628 de yalnızca 4 pin (Portb.4-Portb.5-Portb.6 ve Portb.7) bu amaca hizmet edebiliyor. PORTB.0 için INT kesmesi kullanılabiliyor. Peki PORTB deki pinlerin tamamı için kesme kullanmak isteseydik ne yapacaktık? 16F628 de bu mümkün olamıyor maalesef.
Ama yeni işlemcilerde mesela 16F1827 de bu iş mümkün zira bu işlemcide IOC (Interrupt On Change) registeri var ve hangi bitini set edersen ona karşılık gelen giriş pini bu kesmeyi yaratabiliyor.
Bu nedenle yeni işlemcilere yönelmeyi ihmal etmeyin. Mesela harika bir işlemci keşfettim 16F1825 bu 14 bacaklı bir işlemci ve yapmadığı iş yok. Çok tavsiye ederim.

PortB değişiklik kesmesi dediğimiz gibi işlemciler bazında uygulamada farklılıklar gösteriyor. Temel fikir değişmiyor. Ama tekrar 16F628 e dönersek yalnızca sondaki 4 bit bu amaçla kullanılabilir.
Bu nedenle örnek programda hepsine TUS diye isim verilen o pinler yerine sondaki 4 pini kullanmak avantajlı olacaktır.
Neyi nasıl yapacağına karar verebilmek için işin mantığına bakmakta yarar var.
PortB değişiklik kesmesini aktif etmiş isem ve bu tuşlardan birisine basarsam program hemen kesme etiketine atlayacaktır.
Burada oluşan kesme sana hangi pinin kesme yaptırdığını söylemeyecektir. Yeni işlemcilerde bu da kontrol altındadır. Her bir pinin birde flag yani bayrak biti vardır IOCBF registerinde hangi bit set edilmiş ise ona ait pine bağlı butona basılmış diyebiliyorsun.
16F628 de ise sırası ile bütün pinleri kontrol etmen gerekiyor şöyle;
IF PORTB.4=1 THEN....
IF PORTB.5=1 THEN..
gibi.
Kesmenin kullanım amacı basılan tuşların hangisi olduğunu anında bulup ona göre işlem yaptırmak olacağına göre, Bu işin kesme içinde yapılması daha uygun olacaktır. Ama mademki her bir tuş bir röleyi 50 ms çektirecek o halde kendin bir bayrak kullanır ve set edersin ana program içinde de set edlmiş röle bayrağına bakıp ilgili röleyi çektirir ve Timer-1 sayacını 50 ms için kurup süre bitiminde röleyi bıraktırırsın.
Kesme içinde;
IF PORTB.4=1 then BAYRAK=%00000001
IF PORTB.5=1 then BAYRAK=%00000010
diğerlerinide altına yazarsın
kesmeden çıkınca ana bölümde,
IF BAYRAK=1 then
   ROLE1=1
   GOTO SURESAY  'deyip süre sayda 50 ms bekletme yaparsın.
ENDIF

SURESAY kısmında ister döngü kurup 50 ms gecikme yaratırsın ister timer1 sayacını kullanıp 50 ms lik gecikme yaratır ve süre sonunda bütün roleleri kapatır ve baraklarıda sıfırlarsın.

Ete

devreci22

Teşekkür ediyorum başta ete hocam olmak üzere hepinize bilgilerini gün yüzü ne çıkaran  meslek taşlarıma
çok sağolun; herkeze hayırlı işler.

MB_77

#6
bu mesaj tarafımdan silinmiştir.

devreci22

Bu süre 50ms de olabilir 200 ...400 vb sürelerde oluşturulabilir değişken vasıtasıyla; teşekkür ediyorum yardımları n için .

Powered by EzPortal