PB4-7 change kesmesi sorunu??

Başlatan forumsad, 22 Ocak 2011, 16:13:42

forumsad

arkadaşlar protonda PB0 kesmesi ile yaptıgım olayı pb4-7 change kesmesi ile yapmaya çalışıyorum ama
kod biraz saçmaladı proteusda kesme direkt gerçekleşiyor...

ney eksik veya yanlış acaba

teşekkürler


'****************************************************************
'****************************************************************
Device 16F877A ;ENTEGRE TANIMLAMA
Xtal 4 ;KRISTAL FREKANSI 
'------------------------------------------------------------------------

TRISA=%11111111
TRISB=%11111111  'PORTB0 GIRIS DIGERLERI ÇIKIS OLSUN
TRISC=%10000000
TRISD=%00000000
TRISE=%00000000



'LCD TANITMA BOLÜMÜ.....................................................................................
'.................................................................................
Declare LCD_DTPIN PORTD.4		'DATA girişi PORTC'nin 4. ucundan başlayacak
Declare LCD_ENPIN PORTD.3
Declare LCD_RSPIN PORTD.2
Declare LCD_INTERFACE 4
Declare LCD_LINES 4			'LCD 4 satırdan oluşuyor
'-----------------------------------------------------------------------

'PB4-7 change kesme ayarlari------------------------------------------------------
On_Hardware_Interrupt GoTo KESME     'Hardware interrupt Olusunca INT ye git
OPTION_REG = %00000000 'INTERRUPT KÖSE DURUMU
INTCON  =%10001000     'global kesme aktif,portb4-7 change kesmesi aktif

'PB0 kesme ayarları------------------------------------------------------
'On_Interrupt GoTo KESME
'OPTION_REG = %00000000 'INTERRUPT KÖSE DURUMU
'INTCON  =%10010000     'global kesme aktif,portb.0 kesmesi aktif
'-----------------------------------------------------------------------


'degiskenler
DIM kesmeD AS WORD
DIM kesmeV1 AS WORD
Dim Maxim As Word
Dim DENEME1 As Word



'//////////////////////////////////////////////////////////////////////////
'çikislari temizle 
PORTA=0 
PORTB=0 
PORTC=0 
PORTD=0
PORTE=0


'----------------------------------
'........lcd açilis yazisi........
Print at 1,1,"PROJE" 


'delayms 2000 ': Print $fe,1
'-------------------------------




kesmeV1=0
EWrite 0 ,[kesmeV1]  'YAZMA
DELAYMS 50

kesmeD=0
'__________________________________________________________________________________________________
BASLA:
'*****************************************
ENABLE             'kesme devrede 
INTCON.7=1         'global kesme aktif
'*****************************************
PORTC.0=1


kesmeV1 = ERead 0  'OKUMA
DELAYMS 20

Print at 2,1,DEC kesmeD
Print at 3,1,DEC kesmeV1


if kesmeD=1 and kesmeV1=1 then goto yak


goto BASLA

'/////////////////////////////////////////////////
'/////////////////////////////////////////////////
'/////////////////////////////////////////////////



'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
KESME:
Disable            'kesmeyi pasif


kesmeV1=1
EWrite 0 ,[kesmeV1]  'YAZMA
DELAYMS 50
kesmeD=1

INTCON.3=0       	
Resume

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


yak:
PORTC.1=1
kesmeV1=0
goto BASLA

End

eseneren

Bir yerde olması lazım ama ben goremedım INTCON RBIF kesmeden cıkmadan bayrak indirilmesi lazım bunu ekledin mi?
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

Tagli

Bayrağı sıfırlamadan önce PORTB'yi okuman gerekiyor. Herhangi bir okuma yeterli, mesela x = PORTB gibi. Ancak ondan sonra bayrağı 0 yapabilirsin.
Gökçe Tağlıoğlu

forumsad

bu şekilde çalışıyor inşallah başka problem yaratmaz


'****************************************************************
'****************************************************************
Device 16F877A ;ENTEGRE TANIMLAMA
Xtal 4 ;KRISTAL FREKANSI 
'------------------------------------------------------------------------

TRISA=%11111111
TRISB=%11111111  'PORTB0 GIRIS DIGERLERI ÇIKIS OLSUN
TRISC=%10000000
TRISD=%00000000
TRISE=%00000000



'LCD TANITMA BOLÜMÜ.....................................................................................
'.................................................................................
Declare LCD_DTPIN PORTD.4		'DATA girişi PORTC'nin 4. ucundan başlayacak
Declare LCD_ENPIN PORTD.3
Declare LCD_RSPIN PORTD.2
Declare LCD_INTERFACE 4
Declare LCD_LINES 4			'LCD 4 satırdan oluşuyor
'-----------------------------------------------------------------------

'PB4-7 change kesme ayarlari------------------------------------------------------
On_Hardware_Interrupt GoTo KESME     'Hardware interrupt Olusunca INT ye git
OPTION_REG = %00000000 'INTERRUPT KÖSE DURUMU
INTCON  =%10001000     'global kesme aktif,portb4-7 change kesmesi aktif

'PB0 kesme ayarları------------------------------------------------------
'On_Interrupt GoTo KESME
'OPTION_REG = %00000000 'INTERRUPT KÖSE DURUMU
'INTCON  =%10010000     'global kesme aktif,portb.0 kesmesi aktif
'-----------------------------------------------------------------------


'degiskenler
DIM kesmeD AS WORD

Dim pb4 As Word
Dim pb5 As Word
Dim pb6 As Word
Dim pb7 As Word




'//////////////////////////////////////////////////////////////////////////
'çikislari temizle 
PORTA=0 
PORTB=0 
PORTC=0 
PORTD=0
PORTE=0



kesmeD=0
'__________________________________________________________________________________________________
BASLA:
'*****************************************
ENABLE             'kesme devrede 
INTCON.7=1         'global kesme aktif
'*****************************************
PORTC.0=1



Print at 1,1,DEC kesmeD
Print at 2,1,DEC pb4
Print at 2,2,DEC pb5
Print at 2,3,DEC pb6
Print at 2,4,DEC pb7






goto BASLA

'/////////////////////////////////////////////////
'/////////////////////////////////////////////////
'/////////////////////////////////////////////////



'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
KESME:
Disable            'kesmeyi pasif


kesmeD=1
if PORTB.4=0 then pb4=1
if PORTB.5=0 then pb5=1
if PORTB.6=0 then pb6=1
if PORTB.7=0 then pb7=1

INTCON.0=0       	
Resume

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




End



ete

#4
PortB.4-7 kesmesinin çalışması için bazı şartların yerine getirilmesi gerekir.
Bunlardan birincisi bu 4 adet pinden kesme oluşturacakların giriş olarak ayarlanması gerekir.

İkincisi 4 adet pinde meydana gelen değişiklikle çalışan bir kesme olduğu için kesinlikle program içinde ve özellikle kesme kısmında PORTB nin durumu okutulup bir değişkene aktarılmalıdır. Aksi halde PortB nin önceki durumu bilinmediğinden değişiklik olup olmadığı program tarafından kestirilemez ve kesme oluşmaz.

Programın için bu şekilde çalışıyor demişsin ama nasıl çalışabildiğini pek anlamadım doğrusu.  Zira kesme alt programında PortB nin durumunu okutmuyorsun. Kod çalıştığına göre, Protonda bu işlem otomatik yapılıyor olabilir .
Ancak yinede komutlarında bir terslik var bence. Zira ilk çalıştırmada anında bir kesme oluşuyor ki bunun oluşmaması gerekir. Kesmenin oluştuğunu  kesmeD=1 olmasından anlıyoruz. O esnada hiç bir tuşa dokunmamış olsan bile.

Bana kalırsa aşağıdakileri sırası ile yapıp bir dene bakalım;
1. Basla satırından sonra yer alan;
'*****************************************
ENABLE             'kesme devrede
INTCON.7=1         'global kesme aktif
'*****************************************

satırlarını tamamen sil. Çünki bu işlemi kesme çıkışında program otomatik yapmalı.

2. Programın kesme kısmında ise ,
'Resume 
'Goto  Basla

satırlarını tamamen sil bu işide kesme otomatik yapmalı.
3. Kesme kısmının sonuna
CONTEXT RESTORE
satırını ilave et ve çalıştır bakalım.
Bu şekilde program ilk çalıştığında hemen bir kesme oluşmayacak ve ancak PortB.4-7 arasında bir tuşa dokunursan kesme oluşacaktır.
Zaten istenende budur.
Dene ve gör.
KOlay Gelsin

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

Tagli

ete hocam yanlışın olmasın? Benim bildiğim kadarıyla bu pinlerden sadece istediklerini giriş olarak ayarlıyorsun, onlar kesme oluşturuyor. 18F2550 üzerinde bu şekilde bir uygulama yapmıştım. Hatta bazı modellerde hangi pinlerin kesme oluşturacağını belirleyen bir ayar register'ı da var.

Ayrıca ikinci dediğin de benim bildiğimden biraz farklı. Bildiğim kadarıyla kesme gerçekleşip bayrak 1 olduğunda, bayrağı 0 yapabilmek için PORTB'ye mutlaka erişilmesi gerekiyor. Bu okuma olur, yazma olur, bir bitini test etme olur vs. Bu yapılmazsa bayrağı 0 yapamıyoruz, yani sürekli kesmede kalıyoruz.

Bu söylediklerimi desteklemek için 18F2550'nin datasheet'inden şu alıntıyı yapma ihtiyacı duyuyorum:
Alıntı YapFour of the PORTB pins (RB7:RB4) have an interrupt-on-change feature. Only pins configured as inputs can cause this interrupt to occur. Any RB7:RB4 pin configured as an output is excluded from the interrupt-on-change comparison. The pins are compared with the old value latched on the last read of PORTB. The "mismatch" outputs of RB7:RB4 are ORed together to generate the RB Port Change Interrupt with Flag bit, RBIF (INTCON<0>).

The interrupt-on-change can be used to wake the device from Sleep. The user, in the Interrupt Service Routine, can clear the interrupt in the following manner:
a)Any read or write of PORTB (except with the MOVFF (ANY),  PORTB instruction). This will end the mismatch condition.
b)Clear flag bit, RBIF.

A mismatch condition will continue to set flag bit, RBIF. Reading PORTB will end the mismatch condition and allow flag bit, RBIF, to be cleared.
Gökçe Tağlıoğlu

ete

#6

Mesaj içeriği yanlış olduğundan silinmiştir.

Ete

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

Tagli

#7
Hocam çeviri konusunda yanlışın olduğunu düşünüyorum. Ben o cümleleri şu şekilde algıladım:

PORTB pinlerinden 4'ünün (RB7:RB4) interrupt-on-change özelliği vardır. Sadece giriş olarak ayarlanan pinler bu kesmenin gerçekleşmesine sebep olur. RB7:RB4 pinlerinden çıkış olarak ayarlananlar ise interrupt-on-change karşılaştırmasına dahil edilmez.

Dinleme-konuşma konusunda pek iddealı olmasam da okuma-yazma kapsamında İngilizceme baya güvenirim. Ama sanırım kesin olarak emin olmak için İngilizcesi iyi 3. bir arkadaşın konu hakkında yorum yapması gerekecek.

İkinci meseleye gelince, ben Proton bilmem. Ama o metinden anladığım kadarıyla (ve de uyguladığım kadarıyla) PORT okuması kesme için gerekli değil. Tam tersi kesme bayrağını 0 yapabilmek için gerekli. Yoksa uyuşmazlık devam ediyor ve bayrak yine 1 oluyor.
Gökçe Tağlıoğlu

mufitsozen

#8
"Four of the PORTB pins (RB7:RB4) have an interrupt-on-change feature. Only pins configured as inputs can cause this interrupt to occur. Any RB7:RB4 pin configured as an output is excluded from the interrupt-on-change comparison"

@Tagli ceviri konusunda haklisin.

Four of the PORTB pins (RB7:RB4) have an interrupt-on-change feature.
    PORTB pimlerinden dort tanesinde (RB7:RB4) degisim-sirasinda-kesme ozelligi vardir.

Only pins configured as inputs can cause this interrupt to occur.
    Sadece giris olarak yapilandirilmis pimler bu kesmenin meydana gelmesine sebep olur.

Any RB7:RB4 pin configured as an output is excluded from the interrupt-on-change comparison
  cikis olarak yapilandirilmis herhangi bir RB7:RB4 pimi degisim-sirasinda-kesme karsilastirilmasindan haric tutulur.

Tabiiki bu ingilizceden tam olarak turkceye yapilmis bir tercume.  Ete hocamda aynen bunu soylemis ve uygulamada birazi giris birazi cikis olunca calismiyor demis. Bununda PIC ile kucuk bir program yazip denemek lazim.

Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

ete

Bu konuyu yaklaşık 5 sene önce iredelemiş ve o zamandan aklımda bu şekilde kalmış bu bilgi nedense. Tercüme yoruma açık gibi geliyor bana hala.  Ancak biraz evvel deneme yaptım. Deneme sonucuna bakılırsa siz haklısınız. Beni yorumum yanlış oluyor.
Kısaca bu 4 pinden herhangi birisini çıkış yaparsam düzen bozulmuyor ve kalan diğer girişler kesme oluşturabiliyor.
O halde konuyu bilmeyenlerin yanlış bilgilendirilmemesi için mesajı değiştireceğim. Ama burada da belirtmekte yarar var. PortB değişiklik kesmesi için PortB.4-7 arasındaki 4 pin ayrılmış Bu pinlerin hangisi giriş olarak ayarlanırsa o pindeki değişiklik kesme yaratabiliyor.

Ete

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

muhittin_kaplan

Yanlışım varsa düzeltiniz.
ContexRestore Hardware kesmenin oluşumunda SFR leri tekrar yüklemek için kullnılmıyormu ? örnekte "Resume" kullanılması uygun değilmi ?

forumsad

arkadaşlar bir süre nete giremediğim için cevap veremedim kusura bakmayın

son hali aşagıda isisde düzgün çalışıyor...
çok teşekkürler
'****************************************************************
'****************************************************************
Device 16F877A ;ENTEGRE TANIMLAMA
Xtal 4 ;KRISTAL FREKANSI 
'------------------------------------------------------------------------

TRISA=%00000
TRISB=%11110000  
TRISC=%10000000
TRISD=%00000000
TRISE=%00000000



'LCD TANITMA BOLÜMÜ.....................................................................................
'.................................................................................
Declare LCD_DTPIN PORTD.4		'DATA girişi PORTC'nin 4. ucundan başlayacak
Declare LCD_ENPIN PORTD.3
Declare LCD_RSPIN PORTD.2
Declare LCD_INTERFACE 4
Declare LCD_LINES 4			'LCD 4 satırdan oluşuyor
'-----------------------------------------------------------------------

'PB4-7 change kesme ayarlari------------------------------------------------------
On_Hardware_Interrupt GoTo KESME     'Hardware interrupt Olusunca INT ye git
OPTION_REG = %00000000 'INTERRUPT KÖSE DURUMU
INTCON  =%10001000     'global kesme aktif,portb4-7 change kesmesi aktif




'degiskenler
DIM kesmeD AS WORD

Dim pb4 As Word
Dim pb5 As Word
Dim pb6 As Word
Dim pb7 As Word




'//////////////////////////////////////////////////////////////////////////
'çikislari temizle 
PORTA=0 
PORTB=0 
PORTC=0 
PORTD=0
PORTE=0



kesmeD=0
'__________________________________________________________________________________________________
BASLA:
PORTA.0=1



Print at 1,1,DEC kesmeD

if kesmeD=1 and pb7=1 and pb6=1 then ortak_kesme
if kesmeD=1 and pb6=1  then goto pb6_kesme
if kesmeD=1 and pb7=1  then goto pb7_kesme




goto BASLA
'__________________________________________________________________________________________________




'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
KESME:
Disable            'kesmeyi pasif


kesmeD=1
if PORTB.6=0 then pb6=1
if PORTB.7=0 then pb7=1

INTCON.0=0       	
CONTEXT RESTORE

'-------------------------------------------------------------------------------------------------------------












'__________________________________________________________________________________________________
ortak_kesme:
Print at 3,1, "ortak"
PORTB.0=1
delayms 20
pb6=0
pb7=0
goto basla

pb6_kesme:
Print at 2,1,DEC pb6
PORTB.1=1
delayms 20
pb6=0
goto basla

pb7_kesme:
Print at 2,2,DEC pb7
PORTB.2=1
delayms 20
pb7=0
goto basla
'__________________________________________________________________________________________________








End