KESME HK. YARDIM

Başlatan designer.21, 23 Mayıs 2020, 00:51:01

designer.21

Değerli Hocalarım Merhaba; Şu sıralar kesmeler ile uğraşıyorum, çok fazla soru sormaya başladım biliyorum ama yine bir yerde takıldım.

aşağıda basit bir RB0 KESME kodu var. Malum PORTB.0 butona basılınca aktif oluyor.

Merak ettiğim şu; KESME durumu iki butona aynı anda basıldığında aktif olsun. böyle birşey mümkün mü, eğer mümkünse hangi KESME tipini kullanarak yapabilirim acaba.


16F628A
@ __config _CP_OFF & _PWRTE_ON & _WDT_ON & _LVP_OFF & _MCLRE_OFF & _INTRC_OSC_NOCLKOUT

TRISA=0
TRISB=%00000001
PORTA=0
PORTB=0
ON INTERRUPT GOTO KESME 
OPTION_REG=%01000000      'dahili Pull up dirençleri aktif - kesme sinyalin yükselen kenar 
INTCON=%10010000  	      'Kesmeler aktif ve RB0/INT kesmesi aktif

CMCON=7 
SYMBOL LED=PORTA.0
    
    BASLA:
    GOTO BASLA
    
    DISABLE
    KESME: 
        HIGH LED
        PAUSE 1000
        LOW LED
        INTCON.1=0
    RESUME
    ENABLE
    END
    
    



devreci22

Merhaba
Ete hocamın kesme konulara bakarsan  Rb change portb nin 4567 bacaklarını değişim kesmesi ile ilgili ders işlemiş hocam iyi çalışmalar

designer.21

#2
evet PORTB Değişiklik kesmesini gördüm onunla da uğraştım ama öğrendiğim kadarıyla bu kesme, 4-7 arasında veya yine bu ikisi arasında belirlediğin portlarda bir değişiklik algılarsa, 0 veya 1 farketmez bir öncekinden değişik bir konum algılarsa KESME aktif oluyor.

benim istediğim mesela B1 ve B2'deki butonlar aynı anda basılınca 1 olunca KESME aktif olsun.

bu Değişiklik kesmesiyle bu yapılabiliyor mu

ete

Bazı işlemcilerde (16F1827) PORTB nin tamamı değişiklik kesmesine müsaade eder. Böylece o işlemci ile PORTB.1 ve 2 ye aynı anda bastığında istediğini kesme oluşturarak yaptırabilirsin.
Ama dikkat et yanlızca iki tuşa bastığında kesme oluşmaz her hangi birisine basıldığı mutlaka önceden algılanarak kesme oluşturulur. Kesme içinde sen yinede iki tuşun basılı olup olmadığını test etmek zorundasın.
Bu durumda illaki bu işi kesme ile halletmende gerekmiyor.
IF PORTB.1=0 and PORTB.2=0 THEN INTCON=%xxxxxxx
şekinde de kesme kullanmadan yapabilirsin.
Yada bir tuşu test edersin;
IF PORTB.1=1 THEN
  IF PORTB.2=0 THEN INTCON=%xxxxxx
   ....
....
ENDIF
yada tersini de yapıpp önce PORTB.2 ya basılmışmı bakar ardından PORTB.1 de basılmış ise INTCON da değişiklik yaparsın.

Ete

designer.21

Ete Hocam elimde uğraştığım bir proje var, ve o projemin içinde iki farklı uygulama var yani bu işimi her türlü kesme kullanarak yapmak durumundayım. illa PORTB1 ve 2 olmak zorunda değil. 16f628A'da ki herhangi iki port olabilir.

B4-7 değişiklik kesmesiyle bu iki butona basılma şartını gerçekleştirebiliyor muyum

designer.21

Hocam kendi çapımda böyle bir proje yaptım :)

ekli dosyada çalışma mantığı görünüyor zaten. pic'e başka bir buton ekleyip ikisinin basılması şartı gelsin istiyorum.

burada RB0 kesmesi kullandığım için buton PORTB0'a bağlı, butonu kaldırıp başka porta da alabilirim sorun değil.

ekleyeceğim butonlar herhangi iki porta bağlı olabilir.

ete

Kesme kullanılan programlarda kesinlikle pause komutu olmamalı.
Ayrıca kesme içine resmen uzunca bir program yazmışsın. Kesme denilen yer yalnızca özel durumlarda çok kısa zaman aralığında gelinip geri dönülen bir yer olmalıdır. Oraya uzunca program yazmak pek akıllıca değil.
Kesme içinde bir işaret bitini set edip ana program kısmında da o işaret bitini döngüle riçinde test edersen set olduğunda da bir alt programa yönledirip kesme içindeki programıda oraya oturtursan aynı sonucu elde edersin ama usulüne uygun olarak. Üstelik bunu yaparsan kesme oluştuğunda PORTB.0 butonuna basılmış demektir. Bir ikinci butonada basılmışmı diye kesme içinde test edersen asıl istediğinde elde etmiş olursun.

Ete


designer.21

Kesme işini baya abartmışım anlaşılan :) Bilgiler için teşekkürler Hocam

Hocam bu devreyi breadboard'da kurdum çalışmadı, hata vardır dedim tekrar tekrar bağladım yine olmadı. HC595 entegresi bozuktur derken, led'leri ters bağladım (ledlerin + bacağını entergreye bağlamak yerine - bacaklarını entegreye bağladım) devre ters mantıkla çalıştı. HIGH olduğu yerde LOW, LOW olduğu yer HIGH şeklinde çalıştı. bunun sebebi nedir acaba. 595 entegresi mi bozuk yoksa eksi çıkış mı veriyor.

ete

Bana kalırsa ledleri ters bağlıyorsun sen. Led lerde diyot sembolü şeklinde gösteriliyorlar.
Ancak okun yönü GND bağlanacak ucu gösteriyor. Ledlerin üzerinde yan kısımda düz bir yer vardır bu GND bacağını gösterir. Başka izahı yok. Diğer bir bacak tespit metodu direk fiziksel olarak lede bakmakla yapılıyor. Led in ışık veren kısmına çıplak gözle bakınca iki bacak göreceksin. Birisi uzun diğeri kısa. Kısa olan daima + beseleme bacağıdır. Uzun olan ise GND bacağıdır.


Ete

designer.21

#9
Hocam ledleri ŞEKİL-A'da olduğu gibi bağlıyorum yanmıyor, Fakat ŞEKİL-B'de olduğu gibi bağlıyorum çalışıyor ama ters mantıkla çalışıyor. HIGH olması gerekirken LOW, LOW olması gerekirken HIGH şeklinde yanıyorlar.

Ledler sağlam. Entegreden kaynaklanıyor olabilir mi acaba. Markası;
GM1807FSF
SN74HC595N




Ph.D.

@designer.21, ledleri dışarıda bir ölçü aleti ile veya harici enerji (2-3V gibi) vererek yani entegre olmadan bağladınız mı? Yani ledin bacakları @ete hocamın dediği şekilde + ve - uçları doğru değil mi? Ters bir led var mıdır bilmiyorum hiç görmedim. Ledlerden emin olursanız daha sonra 595'i ölçü aleti ile de kontrol edebilirsiniz.
...hiç...

designer.21

ledlerde sıkıntı yok. sürekli kullandığım elimin altındaki ledler. ayrıca kontrol ettim çalışıyorlar sağlam.

ete

Bozuk demedim zaten ters bağlanmıştır dedim.

Ete

Powered by EzPortal