protonda 2 adet kesme koyabilirmiyiz??

Başlatan forumsad, 10 Ocak 2011, 15:10:09

forumsad

arkadaşlar bir ara ccs c yi denemiştim orda birden fazla kesme olayından bahsediyordu
protonda aynı olayı yapabilirmiyiz....

projede 2 adet fotosel var 1'ci fotoseli portd.6 'ya 2'ci fotoseli portd.7'ye bağladım aynı zamanda diyot koyarak ikisinden portb.0 kesmesine
çıkış aldım  yani hangi fotselden sinyal gelirse gelsin portb.0 tetikleniyor...

daha sonra kesme içinde
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
KESME:
devam:
DelayMS 10
'önemli oldugu için ilk önce portların durumlarını okumalıyız
if portd.6=1 then sykmk1=1
if portd.7=1 then sykmk2=1
 
'-------------------------------------------------------------
Disable            'kesmeyi pasif

INTCON.1=0       	'RB0/INT Bayrağı (flag) silindi.
Resume

goto basla
'-------------------------------------------------------------------------------------------------------------


burda fotesel durumlarını değişkenlere atayıp başlat bölümünde değerlendirerek işlem yapmaya çalışıyorum
ama sıkıntı çıkıyor özellikle aynı anda iki fotoselde tetiklendiği zaman birisini değerlendiriyor


eger protondada 2 adet kesme kullanabilirsek ve öncelik tanıyabilirsek o zaman sıkıntı olmayacağını düşünüyorum


bu sorunum ile ilğili fikir ve önerilerinize ihtiyacım var

saygılarınla...

SERRO EFE

Eğer birden fazla sensörü değerlendirmek istiyorsanız portb change kesmesini kullanabilirsiniz bu size 4 adet sensör girişi sağlıyacaktır tek kesme içersinde yada 18f serisinde 2 yada 3 adet ext int pini vardı 18f serisi kullanarak yapabilirsiniz

Ruzgarbey

kodlarınızda kesme etiketi altında delay ile bekleme yapmışsınız.dolayısı ile ilk önce kesme oluşturan sensör belki sizin portları okumanızdan önce çıkışını değiştirebilir.buda sizin programınızın yanılmasını kaçınılmaz yapar.kesme alt etiketinde bekleme olayını kaldırırsanız sorununuz ortadan kalkacaktır.
KESME:
Context SAVE
GIE=0
if portd.6=1 then sykmk1=1
if portd.7=1 then sykmk2=1
INTCON.1=0
GIE=1
Context RESTORE

kodlarınızı bu şekilde deneyin isterseniz.her iki sensörde aynı anda kesmeye girse bile bunu yakalayabilirsiniz.kolay gelsin
Hayatta En Hakiki Mürşid İlimdir. M.K. ATATÜRK

eseneren

Arkadasım kesme protona aıt bır ozellık degıl kontrollera baglı bır ozellıktır.
877A kullanıyorsan kesmelerın sunlardır, 24F kullanıyorsan sunlardır dıye datasheetlerde yazıyor.

Misal 877A kullanıyorsun arkadasında dedıgı gıbı
- rb4-7 kesmesını kullanabılırsın.diyelimki rb4 ve rb5e ıkı buton sensor koydun alt1 kullanabılırsın.
- iki butonla 4 faklı kombınasyon vardır 0-0 durmu ıle ılgılenmez ısen gerı kalan ıcın 3 fonk yazabılırsın ( ıkısıde 1 olursa ) onuda alt2 olarak yazdım.

- istersen butonsa basılı tutmasına bakabılırsın,
- gızlı bır sıfre koyabılırsın ( portb4 a butonu portb5 b butonu olsun abba yazınca bırsey baba yazınca baska bırsey yaptırabılırsın bu uzar gıder
- ıstedıgın bırsey varsa yardımcı olmaya calısırım.

( proton bılmedıgımden asm de orneklendırdım anlasılmayacak bır sey yok dıye detaya gerek duymadım )

alt:1
;*******************
kesme
btfsc portb,4                                 ; portb nin 4. bıtı 1mi
call birincisensorfonksiyonu          ; evet se 1.fonk cagır
btfsc portb,5                                 ; hayırsa porb nin 5. biti 1 mi
call ikincisensorfonksiyonu            ; evetse 2 fonksiyonu cagır
retfie  ; olarak yazabılırsın            ; hayırsa cık
;*******************

alt:2
;*******************
kesme
btfsc portb,4
call testoburu
retfie

testoburu
btfsc portb,5
call ucuncufonksiyon
return
;*******************


Seçim yapmak için durum hakkında bilgi sahibi olmak zorunda değilsin, sonucuna hazır olmak için durum hakkında kaygılanırsın.  http://bit.ly/gixfTk

forumsad

'----------------------------------------------------------------------	'kesme ayarları------------------------------------------------------
On_Interrupt GoTo KESME
OPTION_REG = %00000000 'INTERRUPT KÖSE DURUMU
'INTCON  =%10010000     'global kesme aktif,portb.0 kesmesi aktif
Symbol GIE = INTCON.7  'Global Interrupt Enable
'-----------------------------------------------------------------------


tanımlama bölümünü yukarıdaki şekilde düzelttim hatasız derledi en yakın zamanda deneyip sonucu yazarım


çok teşekkürler...

forumsad

malesef olmadı değişiklikten sonra kesmeye hiç girmedi...

ben portb  cahange kesmelerini kullanmak istiyorum bu konuda kısa bir örnek verebilirmisiniz....



kullandığım kod aşagıdadır
DEVICE 16F877 ;ENTEGRE TANIMLAMA
XTAL 4 ;KRISTAL FREKANSI 
'------------------------------------------------------------------------
TRISA=%11111111
TRISB=%00000001  'PORTB7 GIRIS DIGERLERI ÇIKIS OLSUN
TRISC=%10000000
TRISD=%11110000
TRISE=%00000000

porta=0 
portb=0 
PORTC=0 
PORTD=0
PORTE=0


'LCD TANITMA BOLÜMÜ.....................................................................................
DEFINE LCD_DREG		PORTB	    'LCD data bacaklari hangi porta bagli? portb
DEFINE LCD_DBIT		PORTB.4		'LCD data bacaklari hangi bitten basliyor? portb.4 den itibaren
DECLARE LCD_ENPIN   PORTB.3     'LCD "E" pin portb nin hangi bitine baglidir.
DECLARE LCD_RSPIN   PORTB.2     'LCD "RS" pin portb nin hangi bitine baglidir.
DEFINE LCD_BITS			4		'LCD 4 bit  olarak bağlı

'-----------------------------------------------------------------------
'----------------------------------------------------------------------			
INCLUDE "MODEDEFS.BAS"              'serin-serout          
ALL_DIGITAL=TRUE                    'bütün portlari djital (1-0) yap 
PORTB_PULLUPS=FALSE                 'portb nin pull up kapat 
'----------------------------------------------------------------------	'kesme ayarları------------------------------------------------------
On_Interrupt GoTo KESME
OPTION_REG = %00000000 'INTERRUPT KÖSE DURUMU
INTCON  =%10010000     'global kesme aktif,portb.0 kesmesi aktif
'Symbol GIE = INTCON.7  'Global Interrupt Enable
'-----------------------------------------------------------------------


DIM GiVeri AS WORD
DIM TVeri AS WORD
DIM Gelen AS WORD
DIM SAY AS WORD


DIM sykmk1 AS WORD
DIM sykmk2 AS WORD

DIM syksay1 AS WORD
DIM syksay2 AS WORD









SAY=0
sykmk1=0
sykmk2=0
syksay1=0
syksay2=0
'//////////////////////////////////////////////////////////////////////////
BASLA:
'*****************************************
ENABLE             'kesme devrede 
INTCON.7=1         'global kesme aktif
'*****************************************
Print at 1,1,"mk1",dec sykmk1
Print at 2,1,"mk2",dec sykmk2


if sykmk1=1 then goto mk1verigonder
PAUSE 100
if sykmk2=1 then goto mk2verigonder
PAUSE 100

portc.0=1   'pic devrede
portc.1=0   'kesme veya test yok






SAY=GELEN
Select SAY	
	
Case 48	
goto test	
Case 49	
goto mk1_on
Case 50	
goto mk1_off
Case 51
goto mk1_saykil
Case 52
goto mk2_on
Case 53
goto mk2_off
Case 54
goto mk2_saykil

Case Else	
SAY=0	
EndSelect	


goto basla
'--------------------------------------------------------------------------------------------------------------















'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
mk1_on:
.....................   
goto basla
'-------------------------------------------------------------------------------------------------------------

'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
mk1_off:
.......................
goto basla
'-------------------------------------------------------------------------------------------------------------

'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
mk1_saykil:
.................... 
goto basla
'-------------------------------------------------------------------------------------------------------------


'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
mk2_on:
......................
goto basla
'-------------------------------------------------------------------------------------------------------------

'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
mk2_off:
........................
goto basla
'-------------------------------------------------------------------------------------------------------------

'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
mk2_saykil:
..........................   
goto basla
'-------------------------------------------------------------------------------------------------------------















'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
KESME:
if portd.6=1 then sykmk1=1
if portd.7=1 then sykmk2=1

Disable            'kesmeyi pasif


INTCON.1=0       	'RB0/INT Bayrağı (flag) silindi.
Resume

goto basla
'-------------------------------------------------------------------------------------------------------------





'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
mk1verigonder:
.....................

goto basla
'-------------------------------------------------------------------------------------------------------------








'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
mk2verigonder:
........................

goto basla
'-------------------------------------------------------------------------------------------------------------











'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
test:
.............................

goto basla
'**********************************************************************************************************

END


forumsad

#6
internetde araştırmalarım sonucu şöyle bir uygulama geliştirdim
DEVICE 16F877 ;ENTEGRE TANIMLAMA
XTAL 4 ;KRISTAL FREKANSI 
'------------------------------------------------------------------------
TRISA=%11111111
Input PORTB                 'portb giris
TRISC=%10000000
TRISD=%00000000
TRISE=%00000000

porta=0 
portb=0 
PORTC=0 
PORTD=0
PORTE=0

       
ALL_DIGITAL=TRUE                    'bütün portlari djital (1-0) yap 
PORTB_PULLUPS=FALSE                 'portb nin pull up kapat 
'----------------------------------------------------------------------	'kesme ayarları------------------------------------------------------
    On_Hardware_Interrupt GoTo Kesme     'Hardware interrupt Olusunca INT ye git            
    Symbol RBIF = INTCON.0   ' RB Port Interrupt Flag
    Symbol RBIE = INTCON.3   ' RB Port Change Interrupt Enable
    Symbol GIE = INTCON.7    ' Global Interrupt Enable
    RBIE = 1   ' Enable interrupt on pins b.4 - b.7
    GIE = 1    ' Enable the Global interrupt ' It is necesary ! ! !



DIM gelen1 AS WORD
DIM gelen2 AS WORD
DIM gelen3 AS WORD
DIM gelen4 AS WORD



gelen1=0
gelen2=0
gelen3=0
gelen4=0
'//////////////////////////////////////////////////////////////////////////
BASLA:
'*****************************************
ENABLE             'kesme devrede 
GIE = 1           'global kesme aktif
'*****************************************

if gelen1=1 then goto mk1_devrede
if gelen2=1 then goto mk2_devrede
if gelen3=1 then goto mk3_devrede
if gelen4=1 then goto mk4_devrede

goto basla



'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Disable
Kesme:
Context Save
    If RBIF = 1 Then 
        If PORTB.4 = 1 Then 
              DelayMS 1000
			  gelen1=1
        EndIf
    
        If PORTB.5 = 1 Then 
              DelayMS 1000
			  gelen2=1
        EndIf
    
        If PORTB.6 = 1 Then 
               DelayMS 1000
			   gelen3=1
        EndIf
    
        If PORTB.7 = 1 Then 
              DelayMS 1000
			  gelen4=1
        EndIf
        RBIF = 0 ' reset the flag
    EndIf
Context Restore   
Return
'-------------------------------------------------------------------------------------------------------------





'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
mk1_devrede:
portd.0=1

goto basla
'-------------------------------------------------------------------------------------------------------------
'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
mk2_devrede:
portd.1=1

goto basla
'-------------------------------------------------------------------------------------------------------------
'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
mk3_devrede:
portd.2=1


goto basla
'-------------------------------------------------------------------------------------------------------------
'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
mk4_devrede:
portd.3=1


goto basla
'-------------------------------------------------------------------------------------------------------------










END




isis devreside aşagıdaki gibidir   
[IMG]http://pic1.resimupload.com/r1/thumb_349652258.jpg[/img]


kesmede bekleme sürelerini düşürdüğümde daha güzel çalıştı   ama istikrar yok bir 3 yanıyor 4'üncüyü yakmıyor

ilave edeceğiniz veya şöyle olsa daha iyi olur dediğiniz bir yer varsa önerileriniz beklerim

saygılarımla

teşekkürler